僕の私のUnrealな日々

UE4のBluePrintを使って小さなギミックを作ったりしてます。ブログを通じて情報共有ができたらなと思います。

UE4:フックショットの実装のブループリントについて

f:id:Bussan_dayo:20160314020551p:plain先週のTokyoMeetUpにお越しくださった方々そして配信を見てくださった方々ありがとうございました。

 

先日のTokyoMeetUpで実装した機能の一つを。(プロジェクトを配布と思ったのですが、いろいろとあって記事にします。)

 

作成したのもはフックショットになります。

 

 

 

 

簡単にではありますが、実装方法について書きたいと思います。

仕様

1.クリックするとLineTraceでHitした場所へ飛ぶ(フックショット)

2.フックショットの作動中にジャンプをする

3.地面にフックショットを当てた時は自動的にフックショットの動作を停止する

 

使用するテンプレート

FirstPersonTemplate

 

実装

1.クリックするとLineTraceでHitした場所へ飛ぶ(フックショット)

まずFirstPersonCharacterのブループリントを開きます。

InputActionFireのノードを切り以下のようにノードを組みます。

f:id:Bussan_dayo:20160314020558p:plain

このノード構成はTraceLineのノード構成で画面の中心から3000かけた部分へLineTraceを飛ばすようになっています。

 

次にBoolean型の変数を作成します。今回は”Hit Object?”という名前にしました。

そしてHitOutからBreakHitResultを出しVector変数を作成しLocationとつなぎます。

f:id:Bussan_dayo:20160314020602p:plain

これでObjectにヒットした時にBoolean型の変数の”HitObject?”がTrueになります。

 

 

次にPlayerを移動させるブループリントを作成します。

EventTickから先ほどのHitObject?でBrunchを行います。

そしてPlayerを動かすノード構成は以下のとおりです。(LaunchCharacterのOverrideは2つともチェックを付けてください)Event Tickにつながっている掛け算のノードに数値が200という数値が入っていますが、この数値をイジることで移動速度が変わります。

f:id:Bussan_dayo:20160314020606p:plain

 

 

 これでヒットした所へ移動するようになりました。

 

2.フックショットが作動中にジャンプをする

フックショット中はCharacterがFalling(落下判定)の状態になっているためJumpが反応しません。なので別にノードを組む必要があります。

 

Jumpの代わりにLaunchCharacterを使用します。”HitObject?”でBrunchを行いTrueになった場合にLaunchCharacterへノードが映るようにします。この際にLaunchVelicityはZのみ700にしてください。(数値はJumpの高さなのでおこのみで

f:id:Bussan_dayo:20160314020610p:plain

 

LaunchCharacterでJumpをしたらフックショットを停止しないと行けないので画像のように”HitObject?”をFalseにしました。

 

3.地面にあたった時に自動的にフックショットを停止する

この動画を見てください

 

 

 地面にフックショットを打ったら自動的に機能が停止し何もしなくても歩けるようにする必要があります。

 

その際に使うのがBreakHitResultのNormalです。

f:id:Bussan_dayo:20160314020613p:plain

 

 

これで地面を撃ってみると以下の様な結果になります。

f:id:Bussan_dayo:20160314020617p:plain

 X=0,Y=0,Z=1という情報がPrintstringに出るので以下のようにノードを組みます。

 

f:id:Bussan_dayo:20160314020535p:plain

 

 NomalでBreakしZが1になったら場合をBrunchで分けBoolean型の変数を作成しTrueの時にチェックを入れFalseの時は作成した変数もFalseにします。変数名は”NormalZ?"にしました。

 

”HitLocation”と自分のロケーションを引きVectorLengthで長さとしてFloat型に変換しそれが200以下になった場合(HitLocationとActorのLocationの差が200以下になった場合)と先ほど作成した”NormalZ”とAndでつなぎBrunchします。そしてTrueだった場合”HitObject?”にFalseを入れます。

f:id:Bussan_dayo:20160314020547p:plain

 

 

これで完成です。

 

ぜひ遊んでみてください〜!では!