執筆: HK

はじめに

前回に引き続き、箱に作用できる機能を作っていきましょう。

今回は、AddForceノードを使って箱を「押す」ような力を加える機能を実装していきます。また、その過程でMultiCapsuleTraceやSetTimerbyEventの使い方にも触れていきます。

今回作っていく機能は、落ち葉を吹き飛ばすブロワーをつくるようなイメージです。

使用するプロジェクトについては前回のものを引継ぎます。

実行環境

Unreal Engine 4.26.2

PickUpActorをRenameする

PickUpActorを作成した時点では「持ち上げる箱」として命名しましたが、今回は押す力を加える対象のActorとして扱います。持ち上げたり拾ったりしないのにPickUpという名前だと違和感を抱きますので、名前を変更します。

TargetCubeあたりが妥当かと思われます。

TargetCubeの物理まわりの設定をする

Content Browser上で、TargetCubeをダブルクリックしてBlueprint Editorを開きます。

Blueprint Editor左上のComponentsより”Cube”を選択します。

Details\Physics\Simulate Physicsにチェックを入れます。

FirstPersonCharacterに実装する

Function “AddForceToTargetCube”を実装する

この関数では、MultiSphereTraceを行って一定範囲のTargetCubeにAddForceをします。

上図は、画像左側からMultiSphereTraceを行ったところを撮影したものです。MultiSphereTraceでは、球の半径とTraceの開始・終了地点を指定することができます。

まずはInputsにFloat型の入力を3つ追加しましょう。

FirstPersonCameraの位置から一定距離・太さをの範囲をMultiSphereTraceByChannelしています。

MultiSphereTraceByChannelはSingleLineTraceByChannelとは異なり、Hit Resultが配列で渡されますのでForEachLoopで処理を行います。

以上でAddForceToTargetCubeの実装は完了です。

Event Graphに実装する

FirstPersonCharacterのEvent Graphに実装をします。

今回はTickではなく、「ボタンを押下中に力を加え続ける」という処理を作ってみます。

まずはLeftMouseButtonのPressedからSetTimerbyEventへ実行ピンを繋げます。

SetTimerbyEventは、Timeで指定した間隔でEventを実行するノードです。

今回はTimeを0.1、Loopingにチェックをつけます。

これでマウス左ボタンを押下し続けている間、力を加える処理が繰り返し実行されます。

次にLeftMouseButtonのReleasedからClearandInvalidateTimerbyHandleへ実行ピンを繋げます。

ClearandInvalidateTimerbyHandleのHandleにSetTimerbyEventのReturn Valueを繋げます。

これで、マウス左ボタンを離したときに力を加える処理が止まります。

以上で、今回の実装は完了です。

AddForcetoTargetCubeノードの値は、あとでテストプレイしながら変えてみましょう!

テストプレイ用にマップを修正する

EditorCubeを消す

テストプレイのために、初期状態で配置されているEditorCubeを削除していきます。

Level EditorのViewportから1つずつ選択して消していってもいいですが、World OutlinerからCubesフォルダの中身をすべて選択して消したり、World Outlinerで”EditorCube”と検索して削除するほうが楽で確実です。

TargetCubeを配置する

Target Cubeを7コ程度、適当に配置します。

テストプレイ用のマップの修正は以上です。

テストプレイ

テストプレイしながら「Event Graphに実装する」のAddForcetoTargetCubeノードの値を調整しましょう。

まとめ

今回はAddForceノードを使って、箱を動かすことができました!

たくさんのものを物理で動かせるのは気持ちがいいです。

箱をボールに変更したり、ゴールをつくったりしてすぐにでもミニゲームをつくれそうですね。

関連リンク