2021/6/21エンジニア

    [UE4]AddForceノードを使って箱を動かす

    執筆: 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ノードを使って、箱を動かすことができました!

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

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

    関連リンク