UnityユーザーのためのUEブループリント入門
コードとビジュアル両方のスクリプトを比較してゲームエンジンを学びます

15. ブループリントクラス(プレハブ)

Unityのプレハブについて、Unreal Engineはブループリントクラスと呼ばれるものがその代わりになるとEpicは説明しています。まずプレハブの特性とブループリントクラスについて説明し、その違いについて説明します。
  • ブループリントクラスとプレハブとの違い
  • ブループリントクラスの親子関係(Nested Prefabs)
  • ブループリントクラスの派生(Prefab Variants)

15. プレハブ

15.1 プレハブの作成手順

プレハブとは、元ファイルのようなものです。元ファイルから複製を作成し、元ファイルの変更を複製先に反映させることができます。複製したものから元ファイルに反映させることもできます。Unity2018.3からプレハブ機能が変わりました。
プレハブの作成はヒエラルキーからゲームオブジェクトをドラッグして、Projectにドロップしますが、UEと比較するため、作成を手順に分けます。例えば、猫は次に説明するNested Prefabsで追加することにして、先に猫を飼っている飼い主(Master)オブジェクトのプレハブを作成します。
1) 飼い主のfbxをインポートします。
personajes low poly02_fbx_Collection_2.fbxをUnityのProjectタブのAssetsフォルダにインポートします。
飼い主のアニメーションをループするように設定します。
Assetsフォルダのpersonajes low poly02_fbx_Collection_2をクリックして、InspectorタブのAnimationをクリックします。
ClipsのArmature.001|Armature.001Actionを選択します。
InspectorのArmature.001|Armature.001Actionに関するInspectorが見えるところまでスクロールします。
Loop Timeをチェックします。
Saveします。
これでpersonajes low poly02_fbx_Collection_2のArmature.001|Armature.001Actionについてのアニメーションがループできるようになります。
2) インポートしたモデルの名前をMasterにして、Hierarchyにドラッグ&ドロップします。
MasterをProjectフォルダにドラッグドロップしてプレハブを作成します。名前はMasterにします。このときMasterのfbxモデルとプレハブファイルは区別されますので、同じ名前でも大丈夫です。
HierarchyにあるMasterはプレハブに変更されます。
3) 徘徊するMasterWanderコンポーネントのスクリプトを作成します。
using UnityEngine;

public class MasterWander : MonoBehaviour
{
    public float speed = 3.0f;
    public float rotationSpeed = 2.0f;
    public float wanderRadius = 2.0f;
    public float wanderDistance = 5.0f;
    public float wanderJitter = 1.0f;

    private Vector3 wanderTarget;

    void Start()
    {
        wanderTarget = transform.position + Random.insideUnitSphere * wanderRadius;
        wanderTarget.y = transform.position.y; // Y軸は固定
    }

    void Update()
    {
        WanderBehavior();
    }

    void WanderBehavior()
    {
        // ランダムな方向に少しずつターゲットを移動
        Vector3 randomPoint = Random.insideUnitSphere * wanderJitter;
        randomPoint.y = 0; // Y軸は固定
        wanderTarget += randomPoint;
        wanderTarget = wanderTarget.normalized * wanderRadius;

        // 前方にターゲットをオフセット
        Vector3 targetPosition = transform.position + transform.forward * wanderDistance + wanderTarget;
        targetPosition.y = transform.position.y;

        // 目的地の方向に回転
        Vector3 direction = (targetPosition - transform.position).normalized;
        Quaternion targetRotation = Quaternion.LookRotation(direction);
        transform.rotation = Quaternion.Slerp(  transform.rotation, 
                                                targetRotation, 
                                                rotationSpeed * Time.deltaTime);

        // 前進
        transform.position += transform.forward * speed * Time.deltaTime;
    }
}
4) ProjectフォルダにあるMasterプレハブを選択してMasterWanderコンポーネントを追加します。
5) アニメーションの実行を簡素化するためにSimpleAnimationコンポーネントを使います。SimpleAnimationコンポーネントはUnityから提供されていますが、Unity標準では搭載されていないのでGithubから入手します。SimpleAnimationコンポーネントについては次の章でも使いますが、ここではインストールの方法とMaster GameObjectに追加する方法を紹介します。
インストール方法は、以下のGithubからzipをダウンロードします。
解凍してから、SimpleAnimation-master\Assets\SimpleAnimationComponent
のSimpleAnimationComponentフォルダ以下すべてをプロジェクトウィンドウにコピーペーストします。
コピーペーストをすると以下のウィンドウが表示された場合は、「Yes, just for there files」をクリックします。
Unityに戻りplayer(GameObject)に以下のようにSimpleAnimationコンポーネントを追加します。SimpleAnimationコンポーネントを追加すると自動的にAnimatorコンポーネントも追加されます。AnimatorコンポーネントのControllerとAvaterには何も登録しなくても大丈夫です。
  • Master(GameObject)
    • SpriteRendererコンポーネント
    • Animatorコンポーネントが追加される
    • SimpleAnimationコンポーネントを追加
SimpleAnimationコンポーネントのAnimationにArmature.001|Armature.001Actionを追加します。
Masterを進行方向に向かせます。Masterプレハブを選択して、Masterの子masterを選択します。
masterのRotation Zを180に設定します。
この状態でplayすると、Masterが歩くアニメーションをしながら徘徊することが確認できます。
6) 決められた半径内の円のなかでランダムにMasterを複製するMasterControllerコンポーネントのスクリプトを作成します。
using UnityEngine;

public class MasterController : MonoBehaviour
{
    
    public GameObject masterSpawn; // 作成するゲームオブジェクト
    public int numberOfObjects = 10; // 作成するオブジェクトの個数
    public float radius = 5f; // 半径

    void Start()
    {
        SpawnObjects();
    }

    void SpawnObjects()
    {
        for (int i = 0; i < numberOfObjects; i++)
        {
            // ランダムな位置を決める
            Vector3 randomPosition = transform.position + (Random.insideUnitSphere * radius);
            randomPosition.y = 0;

            // 指定された位置にオブジェクトを生成
            Instantiate(masterSpawn, randomPosition, Quaternion.identity);
        }
    }
}
7) HierarhyにEmpty GameObjectを作成します。名前はMasterControllerにします。Transformコンポーネントをリセットしておいて、Positionを0,0,0にしておきます。
MasterControllerコンポーネントを追加します。Master SpawnにMasterプレハブを追加します。
Master ControllerコンポーネントはMasterを使って指定した主人の数の分だけMasterを作成して、その辺を歩くようにします。

15.2 プレハブの親子関係 Nested Prefabs

Nested Prefabの歴史を説明します。Unity2018.3から導入されたNested PrefabはUnityの歴史において比較的新しい機能です。Nested Prefabの登場前までは、プレハブにプレハブを埋め込むことはできず、プレハブの階層の下に配置したオブジェクトは、保存する際に強制的に一体化されるため、一つの大きいプレハブとして管理するしかありませんでした。
Nested Prefabやそれに伴って導入されたPrefab Variantの機能はプレハブのワークフローに柔軟性をもたらす半面、機能の複雑化にもつながっています。機能の性質を理解したうえで、ネストしすぎないように気を付ける、プロパティをオーバーライドしすぎないなど、その構造を常にシンプルに保つこと。
飼い主の飼っているいかをNested Prefabsで追加します。
1) いかのfbxをインポートします。
Inkfish_Animations.fbxをUnityのProjectタブのAssetsフォルダにインポートします。
続けてTextureフォルダからT_Inkfish.pngをInkfish_Animations.fbxをAssetsフォルダと同じところにインポートします。
InkfishのモデルにTextureが追加されます。
いかのアニメーションをループするように設定します。
AssetsフォルダのInkfish_Animationsをクリックして、InspectorタブのAnimationをクリックします。
ClipsのIdle_Aを選択します。
InspectorのIdle_Aに関するInspectorが見えるところまでスクロールして、Loop Timeにチェックが入っていることを確認します。
これでInkfishのIdle_Aについてのアニメーションがループできるようになります。
2) インポートしたモデルの名前をInkfishにして、Hierarchyにドラッグ&ドロップします。
InkfishをProjectフォルダにドラッグドロップしてプレハブを作成します。名前はInkfishにします。このときInkfishのfbxモデルとプレハブファイルは区別されますので、同じ名前でも大丈夫です。
HierarchyにあるInkfishはプレハブに変更されます。
3) ProjectフォルダにあるInkfishプレハブにSimpleAnimationコンポーネントを追加します。
  • Inkfish(GameObject)
    • Animatorコンポーネントが追加される
    • SimpleAnimationコンポーネントを追加
SimpleAnimationコンポーネントのAnimationにIdle_Aを追加します。
この状態でplayすると、InkfishがIdleのアニメーションをしながら確認できます。
4) ペットが飼い主に追従するFollowMasterコンポーネントのスクリプトを作成します。
using UnityEngine;

public class FollowMaster : MonoBehaviour
{
    private Transform masterTransform;
    [SerializeField] private float followDistance = 2.0f;
    [SerializeField] private float speed = 5.0f;
    [SerializeField] private float rotationSpeed = 5.0f;
    public float wanderJitter = 1.0f;
    public float wanderRadius = 2.0f;
    public float wanderDistance = 5.0f;
    private Vector3 wanderTarget;
    private void Update()
    {
        if (transform.parent != null)
        {
            Vector3 randomPoint = Random.insideUnitSphere * wanderJitter;
            randomPoint.y = 0; // Y軸は固定
            wanderTarget += randomPoint;
            wanderTarget = wanderTarget.normalized * wanderRadius;

            // 前方にターゲットをオフセット
            masterTransform = transform.parent;

            // リーダーの背後をターゲットにする
            Vector3 targetPosition = masterTransform.position - masterTransform.forward * followDistance + wanderTarget;
            transform.position = Vector3.Lerp(transform.position, targetPosition, speed * Time.deltaTime);

            // リーダーの向きに合わせて回転
            Quaternion targetRotation = Quaternion.LookRotation(masterTransform.position - transform.position);
            transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, rotationSpeed * Time.deltaTime);
        }
    }
}
5) InkfishプレハブにFollowMasterコンポーネントを追加します。
6) MasterプレハブにInkfishプレハブを追加します。
追加方法は、HierarchyでInkfishを選択してドラッグして、Masterにドロップします。
7) Playして、すべてのMasterにInkfishが付いていることを確認します。

15.3 プレハブの派生 Prefab Variants

プレハブの派生の例として、以下の手順で作成していきます。
猫の飼い主に加えて、犬の飼い主を追加するケースを考えます。
1) へびのfbxをインポートします。
Taipan_Animations.fbxをUnityのProjectタブのAssetsフォルダにインポートします。
続けてTextureフォルダからT_Taipan.pngをTaipan_Animations.fbxをAssetsフォルダと同じところにインポートします。
へびのアニメーションをループするように設定します。
AssetsフォルダのTaipan_Animationsをクリックして、InspectorタブのAnimationをクリックします。
ClipsのIdle_Aを選択します。
InspectorのIdle_Aに関するInspectorが見えるところまでスクロールして、Loop Timeにチェックが入っていることを確認します。
これでTaipanのIdle_Aについてのアニメーションがループできるようになります。親子関係で紹介しました手順とは異なり、派生元の抽象クラスを作成してからPrefab Variant用のプレハブを作成するので、モデルの準備はここまでになります。
2) いかとへびの派生元になるペットという抽象クラスを作成します。
抽象クラスと言っても作り方は簡単で、先ほどプレハブの親子完成で作成したFollowMasterbコンポーネントを追加したEmptyObjectを作成して、名前をPetにします。
Petのプレハブを作成します。
ProjectフォルダのPetのプレハブを選択した状態で、右クリック > Create > Prefab Variantを選択します。
名前をInkfish_Variantにします。
Inkfish_Variantをダブルクリックしてプレハブモードの画面が表示されたら、HierarchyにインポートしたInkfishをドラッグドロップします。
Inkfish_Variantの子にあるInkfishのGameObjectを選択した状態で、InkfishのInspectorに、SimpleAnimationを追加します。
SimpleAnimationコンポーネントのAnimationは、プレハブの親子関係でInkfishのGameObjectと同じIdle_Aアニメーションを指定します。
もう一度ProjectフォルダのPetのプレハブを選択した状態で、右クリック > Create > Prefab Variantを選択します。
名前をSnake_Variantにします。
Snake_Variantをダブルクリックしてプレハブモードの画面が表示されたら、HierarchyにインポートしたSnakeをドラッグドロップします。
Snake_VariantのGameObjectを選択した状態で、Snake_VariantのInspectorに、SimpleAnimationを追加します。
SimpleAnimationコンポーネントのAnimationは、プレハブの親子関係でInkfishのGameObjectと同じIdle_Aアニメーションを指定します。
3) Inkfishを飼っているMasterとSnakeを飼っているMasterを作成します。
最初にMasterのプレハブを作成します。プレハブの親子関係で作成したMasterの子にInkfishが追加されている場合は一旦削除してから、プレハブを作成します。
ProjectフォルダのMasterのプレハブを選択した状態で、右クリック > Create > Prefab Variantを選択してMasterのPrefab Variantを作成します。名前をMaster_Inkfishにします。
Master_Inkfishプレハブをダブルクリックして、プレハブモードでMaster_Inkfishを開いて、Inkfish_Variantを追加します。
ProjectフォルダのMasterのプレハブを選択した状態で、右クリック > Create > Prefab Variantを選択してMasterのPrefab Variantを作成します。名前をMaster_Snakeにします。
Master_Snakeプレハブをダブルクリックして、プレハブモードでMaster_Snakeを開いて、Snake_Variantを追加します。
4) Snakeを連れている飼い主Masterも表示できるようにMasterControllerに処理を追加します。
using UnityEngine;

public class MasterController2 : MonoBehaviour
{
    public GameObject masterSpawnA; // 1つ目のゲームオブジェクト
    public GameObject masterSpawnB; // 2つ目のゲームオブジェクト
    public int numberOfObjects = 10; // 作成する合計オブジェクト数
    public float radius = 5f; // 生成する範囲の半径

    void Start()
    {
        SpawnObjects();
    }

    void SpawnObjects()
    {
        int halfObjects = numberOfObjects / 2; // 均等に分割
        for (int i = 0; i < halfObjects; i++)
        {
            SpawnRandomObject(masterSpawnA);
            SpawnRandomObject(masterSpawnB);
        }

        // 奇数の場合、どちらか一方を追加
        if (numberOfObjects % 2 != 0)
        {
            SpawnRandomObject(Random.value > 0.5f ? masterSpawnA : masterSpawnB);
        }
    }

    void SpawnRandomObject(GameObject obj)
    {
        Vector3 randomPosition = transform.position + (Random.insideUnitSphere * radius);
        randomPosition.y = transform.position.y; // 高さを固定する(地面に配置する場合)
        Instantiate(obj, randomPosition, Quaternion.identity);
    }
}
5) Playして、Inkfishを連れている飼い主MasterとSnakeを連れている飼い主Masterが作成されていることを確認します。
Petに追加したFollowMasterコンポーネントスクリプトに変数を追加すると、Prefab Variantで作成したプレハブに反映されていることがわかります。
Prefab Variantの機能の紹介はここまでにします。Prefab Variantのより詳しい機能の解説や学習はMake A Gameサイトのプレハブのページで紹介されていますので、そちらをご参照ください。
プレハブで紹介したWanderとFollowはCraig W. Reynolds氏の「Steering Behavior」という考えに基づいて記述しています。特にWanderの考え方はとても興味深い内容ですので、是非一読することをお勧めします。
🔗 参考リンク
Steering Behaviors For Autonomous Characters
自分の場合は、Craig W. Reynolds氏の論文を読んでもコーディングに落とし込む方法が分からなかったので、Unityで解説されている以下のサイトで勉強しましたので、こちらも紹介します。
🔗 参考リンク
The Nature of Code Remixed for Unity
Chapter 6. Autonomous Agents

15. ブループリントクラス

15.1 ブループリントクラスの作成手順

「アクタの作成」で、ブループリントクラスはプレハブと同じと説明したことを覚えていますか?私がみた限りでは唯一Epic公式のUnreal EngineデベロッパードキュメントのUnity引っ越しガイドで触れられている以外、あまり触れた記事をみたことがありません。ここでは、なぜブループリントクラスが、アクタが振る舞いを決める設計をもったアセットであり、プレハブでもあるその理由を説明します。
🔗 参考リンク
Unreal Engineデベロッパードキュメント
Unity引っ越しガイド
題材として、いかを飼っている飼い主と、へびを飼っている飼い主が徘徊するアニメーションについて、UnityのGameObjectの作成ワークフローと、UE BPのActorの作成ワークフローを比較します。
1) 飼い主のfbxをインポートします。
low-poly-character-walk-cycle.zipを解凍したフォルダを開き、sourceフォルダ以下のpersonajes low poly02_fbx_Collection_2.fbxファイルをドラッグして、UEのContent Browserにドロップします。
インポートするとFBX Import Optionsウィンドウが開きます。特に設定は不要です。
Import Allボタンを押します。Content Browser上にたくさんのファイルがインポートされます。
このなかからpersonajes_low_poly02_fbx_Collection_2(Skeltal Mesh)とpersonajes_low_poly02_fbx_Collection_2_Anim_Armature_001_Armature_001Action(Animation Sequence)を使います。
2) 飼い主に関するアクタを作成します。
名前はMasterにします。
DefaultSceneRootの子にSkeltalMeshコンポーネントを追加します。
SkeltalMeshコンポーネントを選択して、DetalisパネルのMeshのSkeltal Meshでpersonajes_low_poly02_fbx_Collection_2を選択します。
進行方向に向かせるために、SkeltalMeshコンポーネントの、DetailsパネルのTransform Rotationで、Zを90.0にします。左下のX座標軸と同じ方向に向いていることを確認します。
3) MasterアクタのEventGraphに徘徊するMasterのWanderに関するブループリントを作成します。

変数の作成

Unityと同じように変数を定義します。

初期値の設定

wanderTarget、targetPosition、directionの初期値は不要です。Vector型の(0.0, 0.0, 0.0)です。
スケールについては、Unityは、1ユニット = 1メートル、UEは、1ユニット = 1cmになりますので、必要に応じてUnityで設定した値の100倍を設定します。
rotationSpeedについては、何回か試行して調整した結果、20.0が妥当な動きになりました。
speed 300.0
rotationSpeed 20.0
wanderRadius 200.0
wanderDistance 500.0
wanderJitter 100.0
ブループリントのEventGraph全体図は以下になります。

Begin Playイベントノード

wanderTargetの初期値を設定します。
Unityで使用したRandom.insideUnitSphereは、以下のサイトを参考にして、Random Unit VectorノードとRandom Float in Rangeを使用して実現しています。
🔗 参考リンク
Unreal Possibilities
Unreal Engine Utility Functions #1: Random Point in Sphere

Event Tickイベントノード

WanderBehaviorというカスタムイベントノードを作成して接続します。

WanderBehaviorカスタムイベントノード

randomPointとwanderTargetの値を作成します。
Sequenceノードの1番目の実行ワイヤーをSet wanderTargetノードに接続します。

targetPositionの作成

Sequenceノードの2番目の実行ワイヤーをSet targetPositionノードに接続します。
以下のサイトを参考にして、アクタの向いている前方のベクトルを取得しました。
🔗 参考リンク
Unreal Engine & UEFN 学習帳
アクタの方向ベクトルを取得する[Get Actor Forward Vector,Get Actor Up Vector,Get Actor Right Vector] +

directionの作成

directionの値はFind Look at Rotationノードで作成します。

目的地の方向に回転

Sequenceノードの3番目の実行ワイヤーをSet Actor Rotationノードに接続します。
以下のサイトを参考にして、アクタがターゲットの方向に向かせるようにしています。
🔗 参考リンク
historiaブログ
[UE4] アクターをターゲットの方に向ける方法

前進

Set Actor Rotationノードの後に実行ワイヤーをSet Actor Locationノードに接続します。Make VectorノードのZの値はレベル上にあるFloorのZの値と同じ20.0を入力しておきます。
Masterアクタのブループリントクラスをコンパイルして保存します。
4) 省略。
5) アニメーションを設定します。
MasterアクタのSkeltal Meshコンポーネントを選択します。
DetalisパネルのAnimationでUse Animation Assetを選択します。
Anim to Playに、先ほどインポートしたpersonajes_low_poly02_fbx_Collection_2_Anim_Armature_001_Armature_001Actionを選択します。
6) 飼い主をたくさん作成するスクリプトをもったMaster Controllerアクタを作成します。
名前はMasterControllerにします。
変数
numberOfObjects 10
radius 20.0

BeginPlayイベントノード

SpawnOpjectsカスタムイベントノードに接続します。
SpawnObjectsカスタムイベントノード
7)レベルにあるFloorアクタのScaleをX:10.0, Y:10.0にしておきます。
Master Controllerアクタを配置して、playを実行します。

15.2 ブループリントクラスの親子関係

飼い主の飼っているいかを追加します。
1) いかのfbxをインポートします。
quirky_series_free_animals_v14.zipを解凍したフォルダを開き、Quirky_Series_FREE_Animals_v1.4/3D Files/FBX/Animationsフォルダ以下のInkfish_Animations.fbxファイルをドラッグして、UEのContent Browserにドロップします。
インポートするとFBX Import Optionsウィンドウが開きます。特に設定は不要です。
Import Allボタンを押します。Content Browser上にたくさんのファイルがインポートされます。
このなかからInkfish_Animations(Skeltal Mesh)とInkfish_Animations_Anim_Idle_A(Animation Sequence)を使います。
2) Inkfish(いか)のアクタを作成します。
名前はInkfishにします。
DefaultSceneRootの子にSkeltalMeshコンポーネントを追加します。
SkeltalMeshコンポーネントを選択して、DetalisパネルのMeshのSkeltal MeshでInkfish_Animationsを選択します。
進行方向に向かせるために、SkeltalMeshコンポーネントの、DetailsパネルのTransform Rotationで、Zを90.0にします。左下のX座標軸と同じ方向に向いていることを確認します。
3) Inkfishのアニメーションを確認します。
InkfishアクタのSkeltal Meshコンポーネントを選択します。
DetalisパネルのAnimationでUse Animation Assetを選択します。
Anim to Playに、先ほどインポートしたInkfish_Animations_Anim_Idle_Aを選択します。
4) ペットが飼い主に追従するFollowMasterに関するブループリントを作成します。

変数の作成

Unityと同じように変数を定義します。
初期値の設定
以下の変数以外の初期値は不要です。
followDistance 100.0
wanderJitter 3.0
wanderRadius 50.0

BeginPlayイベントノード

BeginPlayイベントノードには何も接続しません。

Event Tickイベントノード

Event Tickイベントノードの全体図を表します。

親アクタの存在チェック

親アクタが存在した場合に実行ワイヤーが先に進むようにしています。先の処理はSequenceノードで分けてます。

ある程度揺れながら追従するようにする

wanderTargetを定義して、揺れながら追従するようにしています。

前進

SetActorLocationノードに、親アクタの位置から前向きの単位ベクトルにfollowDistanceの距離を掛けた値を引いた値をtargetPositionをSet Actor LocationノードのNew Locationピンに接続します。

目的地の方向に回転

アクタの回転の計算をします。
5) 省略。
6) Masterアクタの子にInkfishアクタを追加します。
Masterアクタのブループリントクラスを開きます。
MasterアクタのComponentsパネルで、DefaultSceneRootの子にChild Actorコンポーネントを追加します。
Child ActorコンポーネントのDetailsパネルにあるChild Actor ComponentのChild Actor Classで、Inkfishアクタを選択します。
コンパイルして保存します。
7) Playして、すべてのMasterにInkfishが付いていることを確認します。

15.3 ブループリントクラスの派生

ブループリントの派生の例として、以下の手順で作成していきます。
Unityのときと同じようにいかの飼い主に加えて、へびの飼い主を追加するケースを考えます。
1) へびのfbxをインポートします。
Quirky_Series_FREE_Animals_v1.4/3D Files/FBX/Animationsフォルダ以下のTaipan_Animations.fbxファイルをドラッグして、UEのContent Browserにドロップします。
インポートするとFBX Import Optionsウィンドウが開きます。特に設定は不要です。
Import Allボタンを押します。Content Browser上にたくさんのファイルがインポートされます。
このなかからTaipan_Animations(Skeltal Mesh)とTaipan_Animations_Anim_Idle_A(Animation Sequence)を使います。
2) いかとへびの抽象クラスになる、Pet(ペット)のアクタを作成します。
Petアクタ作成します。名前はPetにします。
DefaultSceneRootの子にSkeltalMeshコンポーネントを追加します。SkeltalMeshコンポーネントのDetalisパネルのMeshのSkeltal Meshには何も設定しません。
Petアクタのブループリントに、「ブループリントの親子関係」で作成したFollowMasterと同じブループリントを作成します。

変数

ブループリントの親子関係でInkfishアクタに設定した同じ変数をPetアクタに設定します。初期値も同じにします。
followDistance 100.0
wanderJitter 3.0
wanderRadius 50.0

BeginPlayイベントノード

ブループリントの親子関係のInkfishアクタに設定したBeginPlayイベントノードと同じく何も接続しません。

Event Tickイベントノード

ブループリントの親子関係でInkfishアクタに設定した同じTickイベントノードをPetアクタに設定します。詳細はブループリントの親子関係のInkfishアクタに設定したTickイベントノードを参照してください。
Petアクタをコンパイル、保存します。
次にPetアクタの派生アクタとしてInkfish(いか)のアクタを作成します。
派生アクタの作成方法は、アクタを作成するときに表示されるPick Parent ClassウィンドウでPetと入力して検索すると、先ほど作成したPetアクタが候補として表示されます。
Petアクタを選択して、Selectボタンを押します。
名前はInkfish_Variantにします。
Inkfish_Variantのブループリントクラスを開くと、Petアクタで設定したSkeltalMeshコンポーネントが継承されて表示されています。
SkeltalMeshコンポーネントを選択して、DetalisパネルのMeshのSkeltal MeshでInkfish_Animationsを選択します。
進行方向に向かせるために、SkeltalMeshコンポーネントの、DetailsパネルのTransform Rotationで、Zを270.0にします。左下のX座標軸と同じ方向に向いていることを確認します。
InkfishアクタのSkeltal Meshコンポーネントを選択して、DetalisパネルのAnimationでUse Animation Assetを選択します。Anim to Playに、先ほどインポートしたInkfish_Animations_Anim_Idle_Aを選択します。
ちなみにPetアクタを親にしたInkfish_VariantアクタのEvent Graphは以下のようになっています。
Petアクタで設定している変数をInkfish_Variantアクタで呼ぶことができます。
Inkfish_Variantアクタをコンパイル、保存します。
Petアクタの派生アクタとしてSnake(へび)のアクタを作成します。同じように親クラスをPetアクタにします。名前はSnake_Variantにします。
Snake_Variantのブループリントクラスを開くと、Petアクタで設定したSkeltalMeshコンポーネントが継承されて表示されています。
SkeltalMeshコンポーネントを選択して、DetalisパネルのMeshのSkeltal MeshでTaipan_Animationsを選択します。
進行方向に向かせるために、SkeltalMeshコンポーネントの、DetailsパネルのTransform Rotationで、Zを270.0にします。左下のX座標軸と同じ方向に向いていることを確認します。
Snake_VariantアクタのSkeltal Meshコンポーネントを選択して、DetalisパネルのAnimationでUse Animation Assetを選択します。Anim to Playに、先ほどインポートしたTaipan_Animations_Anim_Idle_Aを選択します。
Snake_Variantアクタをコンパイル、保存します。
3) Inkfishを飼っているMasterとSnakeを飼っているMasterを作成します。
Masterアクタを親とする、Inkfishを飼っているMasterアクタを作成します。
名前はMaster_Inkfishにします。
Master_Inkfishアクタのブループリントクラスを開きます。
Master_InkfishアクタのComponentsパネルで、DefaultSceneRootの子にChild Actorコンポーネントを追加します。
Child ActorコンポーネントのDetailsパネルにあるChild Actor ComponentのChild Actor Classで、Inkfish_Variantアクタを選択します。
Master_Inkfishアクタをコンパイル、保存します。
Masterアクタを親とする、Snakeを飼っているMasterアクタを作成します。
名前はMaster_Snakeにします。
Master_Snakeアクタのブループリントクラスを開きます。 Master_SnakeアクタのComponentsパネルで、DefaultSceneRootの子にChild Actorコンポーネントを追加します。
Child ActorコンポーネントのDetailsパネルにあるChild Actor ComponentのChild Actor Classで、Snake_Variantアクタを選択します。
4) Snakeを連れている飼い主Masterも表示できるようにMasterControllerに処理を追加します。
MasterControllerアクタのEventGraphを書き換えます。

BeginPlayイベントノード

BeginPlayイベントノードの全体図を表します。
SpawnObjectsカスタムイベントノードを作成します。
numberOfObjectsを2で割り、偶数分だけアクタを作成するForLoppノードを追加します。
Inkfishを連れている飼い主を生成します。
Snakeを連れている飼い主を生成します。
numberOfObjectsが奇数の場合、Random Float in Rangeの値によってInkfishを連れている飼い主かSnakeを連れている飼い主かを決めて生成します。
コンパイルして保存します。
5) Playして、Inkfishが付いてくるMasterと、Snakeが付いてくるMasterが徘徊していることを確認します。
UEでアクタをWanderのような徘徊する動きを説明するのによく紹介されるのは、BlackBoard(ブラックボード)を使ったAIエージェントの動きを解説しています。ブラックボードに慣れるのもよいですが、UEブループリントだけを使っても表現できます。
マリオの敵キャラの派生アクタとしてクリボーとノコノコを題材にした実例がとても参考になりますので紹介します。
🔗 参考リンク
よっしーの100チャレンジ
UE5 キャラクターを派生開発する方法
【UE5.4】マリオ風アクションの敵キャラ ノコノコを動かそう!親子派生・状態管理・プレイヤー専用当たり判定の作り方解説【Unreal Engine5.4】
🔗 参考リンク
Unreal Engineデベロッパーフォーラム
Nested class blueprint.
🔗 参考リンク
Unreal Engineデベロッパーフォーラム
Child actor component にセットしたアクターへのcast方法
🔗 参考リンク
凛(kagring)のUE5/UE4とゲーム制作と雑記ブログ
UE4 複数のアクター(Actor)を持つアクター(ブループリント)を作成する(Child Actor)
🔗 参考リンク
Unreal Engineデベロッパーフォーラム
子bpに値を渡したい
子のアクターに値を渡す方法
🔗 参考リンク
Unreal Engineデベロッパーフォーラム
子bpに値を渡したい