2020/9/21エンジニア

    [Unreal Engine] プラグインとActorの連携について[Part.2]

    執筆者 / K.T

    はじめに

    UE4で、レベルに依存しない汎用的な処理を、プラグインとして切り離しておくと便利です。

    プラグインに、アクタとの連携機能やティック機能を持たせれば、より使い勝手が良くなります。

    そのようなプラグインのサンプルを作成してみます。

    この記事の内容

    長いので、2回に分けてお送りします。

    前回(1/2)は、サンプルのプロジェクトを作成した上で、以下のような機能を持つプラグインを追加しました。

     1.デリゲートを持ち、アクタのイベント関数を結合できる

     2.ティック機能を持ち、ティック関数が呼び出される

     3.ティック関数でデリゲートを実行し、パラメータ(角度)をアクタのイベント関数へ送る

     4.パラメータ(角度)は等速で増え続ける

    今回(2/2)は、アクタがイベント関数でパラメータ(角度)を受け取り、自身のZ軸回転に反映させるようにします。

    つまりアクタがコマのようにくるくる回るようにします。

    また、カメラをアクタの背後に置いて、アクタと一緒に回転するようにします。

    これによって生じる問題点についても解説し、修正を行います。

    用意するもの

    ・Unreal Engine 4.23.1

    ・Visual Studio 2017

    イベント関数の作成

    プラグインと連携するためのイベント関数を作成しましょう。

    前回作成したActorFlyingクラスを開いてください。

    EventFuncという名前で、関数を新規作成します。

    プラグインからは、パラメータ(角度)が送られてきます。

    関数のインプットにFloatを追加して、送られてきたパラメータ(角度)をRotYawとして受け取るようにします。

    受け取ったRotYawからRotatorを作成して、StaticMeshに設定してください。

    イベント関数をプラグインと連携

    続いて、先ほど作成したイベント関数を、プラグインと連携させます。

    レベルブループリントを開いてください。

    イベントグラフ内に、BeginPlayノードを追加します。

    BeginPlayノードに、前回プラグインで作成したBindEventノードを接続します。

    検索窓にControlActorと入力することで、簡単に見つけることができます。

    アウトライナ内のActorFlyingを、レベルブループリントのイベントグラフ内へドラッグ&ドロップします。

    BindEventのObjectには、ActorFlyingノードを接続してください。

    FuncNameには、アクタのイベント関数名EventFuncを入力してください。

    プレイ時にデフォルトポーンの球体があると目障りなので、消しておきましょう。

    Pawnクラスのアクタを検索して、見つかったものを非表示にします。

    ここまでできたら、コンパイルして保存後に閉じてください。

    動作を確認(カメラ固定)

    それでは実際に動作を確認してみましょう。

    スポーン位置を「現在のカメラ位置」に変更してから、プレイ開始してください。

    UFOがコマのようにくるくる回り始めたら成功です。

    アクタにカメラを追加

    実は、この状態にはちょっとした不具合が隠れています。

    それを分かりやすくするために、UFOの回転と連動してカメラが動くようにしてみます。

    ActorFlyingクラスを開いてください。

    StaticMeshの子として、CameraComponentを追加します。

    詳細の[トランスフォーム]で、カメラの位置や回転を図のように設定してください。

    作成したカメラを適用するため、イベントグラフのBeginPlayノードに、Set View Target with Blendノードを接続してください。

    ターゲットには、Player Controller(Index=0)を接続します。

    New View Targetには、Self(アクタ自身)を接続します。

    ここまでできたら、コンパイルして保存後に閉じてください。

    動作を確認(カメラ連動・修正前)

    再度、動作を確認してみましょう。

    プレイ開始すると、今度はUFOと連動してカメラも回転し始めます。

    しかしよく見ると、静止中と回転中で、UFOの角度が微妙に異なることにお気づきでしょうか。

    UFOの回転とカメラの回転が、わずかにズレているのです。

    なぜズレるのか?

    CameraはStaticMeshの子として追加されているので、本来ならこのようなズレは生じないはずです。

    ではなぜズレているのかというと、StaticMeshの回転がイベント関数の中で設定されているからです。

    イベント関数は、プラグインの(つまりFTickableGameObjectの)ティック関数から呼び出されています。

    FTickableGameObjectのティック関数は、アクタの処理後に呼び出されます。

    そのため、Cameraの位置更新「後に」イベント関数が呼び出され、StaticMeshの回転を設定することになります。

    この処理順番の逆転が、ズレの原因と考えられます。

    ズレを修正

    ズレを修正するためには、Cameraの位置更新「前に」StaticMeshの回転を設定する必要があります。

    イベント関数ではなく、アクタのティック関数でStaticMeshの回転を設定すれば、処理順番が正しくなるはずです。

    ActorFlyingクラスを開き、RotYawという名前で、変数を新規作成します。

    変数の型はFloatに、デフォルト値は0.0にしてください。

    関数EventFuncを、図のように変更します。

    関数内でStaticMeshの回転を設定するのをやめて、先ほど作成した変数RotYawへ保存するようにします。

    イベントグラフのTickで、StaticMeshの回転を設定するようにします。

    ここまでできたら、コンパイルして保存後に閉じてください。

    動作を確認(カメラ連動・修正後)

    プレイ開始すると、今度は静止中と回転中で、UFOの角度が一致しているはずです。

    無事にズレを解消することができました。

    サンプルの作成は以上となります。お疲れ様でした。

    まとめ

    前回(1/2)は、プロジェクトを作成し、アクタやプラグインなど必要なものを追加しました。

    また、プラグインのソースコードを編集し、ティック機能やデリゲートを実装しました。

    今回(2/2)はこのプラグインとアクタを連携させて、アクタが動くようにしました。

    また、ティック関数の実行タイミングの違いによる不具合を修正しました。

    UE4でプラグインを利用する際に、参考にしていただければ幸いです。

    参考リンク

    FTickableObjectBase::Tick

    ブログ一覧へ戻る