執筆: 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つ追加しましょう。
- EffectiveLength: 力を加えられる距離の指定に使用します。
- EffectiveRadius: MultiCapsuleTraceで使用します。どれだけ太く(広く)影響を及すかの指定に使用します。
- Force: どれだけ強く力を加えるかの指定に使用します。
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ノードを使って、箱を動かすことができました!
たくさんのものを物理で動かせるのは気持ちがいいです。
箱をボールに変更したり、ゴールをつくったりしてすぐにでもミニゲームをつくれそうですね。