敵キャラクター
Unreal Engine では、NPC と敵は一般的にプレイヤーと非常によく似た設定になっています。敵にはコントローラーとポーンがあります。 実際、敵とプレイヤーは共通の基本クラスである AParrotCharacterBase にいくつかの機能を共有しています。 Parrot ゲームでは、behavior tree を使用して敵の動作を制御するため、AI コントローラー クラスを使用して敵コントローラーを作成します。 その設定は敵間で共有されるため、アニメーション ブループリントから始めます。
敵アニメーション ブループリント
アニメーション ブループリント テンプレート
複数のスケルタルメッシュがあり、アニメーションの要件が共通している場合は、アニメーション ブループリント テンプレートと呼ばれるものを作成できます (「Animation Blueprint Linking」を参照)。 この場合、敵の種類は 4 種類あります。ヘッドレス スケルトン、スケルトン、シャーキー、ボス シャークです。 これらはすべて同一のスケルトンとアニメーション設定を共有しているため、アニメーション グラフとイベント グラフを実装した 1 つのテンプレートをすべての敵に再利用できます。 このテンプレートの設定方法は、「Blueprints > Enemy > EnemyBase > ABT_EnemyBase」で確認できます。 テンプレートはプレイヤーのアニメーション ブループリントとほぼ同じ方法で設定されているため、見た目は非常に似ています。
アニメーション ブループリント
この場合、すべての実装はテンプレート内にありますが、テンプレートは特定のスケルトンを参照していないため、アニメーション自体は存在しません。 各敵には、テンプレートから派生した独自のアニメーション ブループリントがあり、それぞれのスケルトンのアニメーションがアニメーション グラフ オーバーライドのスロットに挿入されています。 この例は、「Blueprints > Enemy > HeadlessSkeleton > ABP_Enemy_HeadlessSkeleton」で確認できます。
以下では、ヘッドレス スケルトンのスケルタルメッシュに、各アニメーション ステートに適したアニメーションを選択しています。
敵ポーン
Parrot の敵キャラクターは、ヒット ポイントや死亡などの類似機能など、プレイヤーと多くの機能を共有しています。 この共有実装は、AParrotCharacterBase で確認できます。 敵固有の実装については、サブクラス AParrotEnemyCharacterBase があります。 このサブクラスは、パトロール システムの動作、戦闘の仕組みなど、すべての実装を処理します。 戦闘の仕組みの詳細については、「Parrot での戦闘」のドキュメントを参照してください。
この設定では、「Blueprints > Enemy > EnemyBase > BP_EnemyCharacter_Base」にあるブループリントの基本クラスでボリュームをトリガーする方法を実装することで、敵の戦闘ヒット チェックとダメージ チェックが行われます。
この実装は、ネイティブ C++ クラスではなく、ここで行われます。これは、メッシュの形状、サイズ、複雑さが異なるため、敵ごとにトリガー ボリュームが異なる必要があるためです。 継承されたトリガー ボリュームは派生クラスでは変更できないため、これは必須です。
敵 AI コントローラー
前述のとおり、敵は behavior tree で制御されるため、AParrotEnemyAIControllerBase には AIController から派生した基本クラスがあります。 ここでは、behavior tree で使用されるデータをブラックボードに送信するために使用される、さまざまな BlueprintImplementableEvents を確認できます。
AI コントローラーが behavior tree にデータを渡す方法と、プレイヤーの存在検出を処理する方法については、「Blueprints > AI > EnemyBase > BP_EnemyController_Base」で確認できます。
Behavior Tree を使用した AI の作成
Unreal Engine は、behavior tree を用いて AI を構築するための強力で柔軟なインフラストラクチャを提供しています。 いくつかの動作を含む基本的なボイラープレートを設定するためのクイックスタート ガイドは、「ビヘイビアツリーのクイックスタートガイド」にあります。 このガイドで得られた結果は、敵 AI の基盤として、また必要な動作を設定するための変更を加える際に使用されます。
パトロールとプレイヤーへの攻撃に必要な基本機能を提供するため、「Blueprints > AI > EnemyBase > BTT_FindNextPatrol」と「Blueprints > AI > EnemyBase > BTT_AttackPlayer」という 2 つの behavior tree タスクが用意されています。 すべての機能をサポートするインフラストラクチャは各敵に備わっているため、「Blueprints > AI > EnemyBase > BB_Enemy_Base」という 1 つの共有ブラックボードが存在します。 敵の動作をカスタマイズするためにどの機能を使用するかは、behavior tree の実装によって決定されます。
敵ごとに異なる behavior tree 構成があり、それぞれ異なる動作をします。 これら 4 つはすべて、以下の場所で確認できます。
Blueprints> AI > HeadlessSkeleton > BT_HeadlessSkeleton
Blueprints > AI/Skeleton > BT_Skeleton
Blueprints > AI > Sharky > BT_Sharky
Blueprints > AI > BossShark > BT_Boss_Shark
オーサリング可能なパトロール ウェイポイント システムを作成する
Parrot は、敵に対して、behavior tree ガイドで示されているようなパトロール機能 (敵 AI が半径内の移動可能なポイントを 4 秒ごとにランダムに選択する機能) は求めていません。 ここで求められるのは、他の多くのプラットフォーム ゲームのように、パトロール ルートを積極的に往復する敵です。
Parrot は、このために必要な機能を提供する独自のシステムを開発しました。 このシステムは、シーンに配置してパトロールを作成できる UParrotEnemyPatrolRigComponent で構成されています。 このコンポーネントは、クラスのデフォルトのサブオブジェクトを使用してスプラインをインスタンス化します。 このスプラインはパトロール ウェイポイントの作成に使用され、2 つのトリガー ボリューム (AI の動作をトリガーするために使用)、およびウェイポイントの順序を描画するエディタ専用のビジュアライザーも用意されています。 ウェイポイントの順序付けにより、編集時にパトロール パスの方向を確認できます。 C++ 実装の詳細は、UParrotEnemyPatrolRigComponent で確認できます。
この実装は、シーン内の任意のアクタにパトロール リグをアタッチできるコンポーネントです。 これにより、移動するオブジェクトにリグを配置でき、パトロールがローカル空間に正しく配置されたままになります。 シーン内の既存のアクタにアタッチされていないパトロール リグを配置するには、AParrotEnemyPatrolRigActor を使用します。これはシーン内の任意の場所に配置できるアクタであり、デフォルトのサブオブジェクトとして UParrotEnemyPatrolRigComponent を生成します。
この実装により、実行時にパトロール パスに沿って生成される敵を選択できます。 このプロセスでは、Unreal Engine の遅延アクタスポーンと呼ばれる機能が使用されます。この機能により、アクタを 2 段階で生成できます。最初の段階では、BeginPlay などの AActor の初期化を実行せずにアクタ オブジェクトを構築します。 これにより、アクタを初期化する前に必要な設定やセットアップを行うことができます。 このセットアップが完了したら、2 番目の段階を呼び出してスポーンを確定し、アクタを初期化します。 これはパトロール リグに対して行われます。敵アクタがスポーンされた際に、パトロール スプラインとトリガー ボリュームがアクタにパイプされ、アクタの初期化中に処理されてパトロール シーケンスが自動的に開始されるようにするためです。
遅延アクタ スポーンを実行するコードは、UParrotEnemyPatrolRigComponent で確認できます。 ブループリントにも同様の機能があり、ブループリント アクタのプロパティに Expose on Spawn (スポーン時に公開) というタグを付けることができます。これにより、アクタの初期化が行われる前に設定される引数をスポーン ブループリント ノードに渡すことができます。
以下の図は、これらのパトロール リグの 1 つが「Maps > Level_1 > Level_1」に設定されている例を示しています。右側のポイント 0 から始まる 2 ポイントのパトロール リグが設定されています。 このパトロール リグは、BP_EnemyCharacter_Skeleton をスポーンするように設定されています。
以下に、編集時にパトロール リグのウェイポイントを簡単に識別できるようにするためのフラグ表示トグル メニューがあります。 ほとんどのフラグ表示チェックボックスが選択されています。 この実装の詳細は、エディタ専用のビジュアライザー コンポーネントである UParrotPatrolRigDebugVisualizer で確認できます。