ARPG開発 011 敵に攻撃をさせる

近づいてきた敵が攻撃してくるようにします。

敵の攻撃アニメーションの準備

敵の攻撃アニメーションを用意し、AnimMontageを作成しておきます。
AnimMontageを使用可能にするためには、アニメーションブループリントにスロット ‘DefaultSlot’の配置が必要です。

ブループリントインターフェースの作成と編集

コンテンツブラウザで右クリックしてブループリント > ブループリントインターフェースを選択。
名前はBPI_AI_BehaviorTreesにします。

BPI_AI_BehaviorTreesの編集

関数の名前をAttackにします。
アウトプットを追加して、名前をAnimationDuration、型をFloatにします。

ブラックボードの編集

新規キーをクリックして、名前をInMeleeAttackRangeにします。型はBoolean。
この変数がTrueの時に敵が攻撃をします。

ビヘイビアツリーで新規サービスを追加

上メニューの新規サービスをクリックして、名前はBTService_GetDistanceToTargetにしました。

BT_Service_GetDistanceToTargetの編集

左メニューの関数オーバーライドでReceive Activation AIを選択。

ノードを組む

イベント Receive Activation AIControlled Pawnから線を伸ばしてGet Distance Toを配置。
変数を追加。名前はTarget、型はBlackboard Key Selector。目玉アイコンを開けておく。
変数TargetをGetして線を伸ばしてGet Blackboard Value as Objectを配置。Return Valueから線を伸ばしてCast To Actorを配置。イベント Receive Activation AIから繋げる。
Cast To ActorAs ActorOther Actorに繋げる。
Get Distance Toから線を伸ばして以下(<=)を配置。その左下から線を伸ばして変数へ昇格。名前をMeleeAttackDistanceにします。目玉アイコンを開けておく。
変数を追加。名前はIsInRange、型はBlackboard Key Selector。目玉アイコンを開けておく。
変数IsInRangeをGetして線を伸ばしてSet Blackboard Value as Boolを配置。Cast To Actorから繋ぐ。以下(<=)の右からValueに繋ぐ。
IsInRangeSet Blackboard Value as Boolを複製して、Cast To ActorのCast Failedから繋ぐ。

ビヘイビアツリーの編集

ChaseTargetSequenceで右クリックしてサービスを追加 > BT_Service_GetDistanceToTarget。
そのBT_Service_GetDistanceToTargetを選択して詳細の
デフォルト > TargetをTarget Actorにする。
デフォルト > Melee Attack Distanceを250にする。
デフォルト > Is In RangeをInMeleeAttackRangeにします。

新規タスクを追加します。ベースはBTTask_BlueprintBase。
名前はBTTask_AttackTargetにします。

BTTask_AttackTargetの編集

左メニューの関数オーバーライドでReceive Execute AIを選択。

ノードを組む

イベント Receive Execute AIControlled Pawnから線を伸ばしてDoes Implement Interfaceを配置。その中のInterfaceをBPI_AI_BehaviorTreesにする。Return Valueから線を伸ばしてブランチを配置。イベント Receive Execute AIからも繋ぐ。
イベント Receive Execute AIControlled Pawnから線を伸ばしてAttack(メッセージ)を配置。ブランチのTrueから繋ぐ。
Attack(メッセージ)から線を伸ばしてDelayを配置し、2本の線を繋ぐ。そこから線を伸ばしてFinish Executeを配置して、Successにチェックを入れる。
ブランチのFalseから線を伸ばしてFinish Executeを配置して、Successにチェックは入れない。

ビヘイビアツリーの編集

ツリーを組む
ChaseTargetSequenceから下への線を切り、再び線を伸ばしてSimple Parallelを配置。その詳細 > パラレル > Finish Modeを遅延:にする。
Simple Parallelメインタスクから左下に線を伸ばしてBTTask_ChaseTargetを配置。
Simple Parallelサブタスクから右下に線を伸ばして、BTTask_AttackTargetを配置。
BTTask_AttackTargetで右クリックして、デコレーターを追加 > Blackboard。
追加されたBlackboard Based Conditionを選択し、詳細 > ブラックボード > Blackboard KeyをInMeleeAttackRangeにします。

BP_EnemyZombieの編集

クラス設定 > 詳細 > インターフェース > 実装インターフェースにBPI_AI_BehaviorTreesを追加。
コンパイルして、左メニューのインターフェース > Attackをダブルクリック。

ノードを組む

Attackから線を伸ばしてPlay Anim Montageを配置。Anim Montageには攻撃用のAnimMontageを選択。
リターンノードと2本の線で繋ぐ。

コリジョンの有効化

敵の両腕のコリジョン設定は終わっていますが、通常時はコリジョンが無効化されていますので、攻撃時のみ有効化する必要があります。

AnimNotifyStateの作成と編集

コンテンツブラウザで右クリックしてブループリント クラスを選択。すべてのクラスの中からAnimNotifyStateを選択。
2つ作成し、名前はANS_WeaponCollisionLeftHandとANS_WeaponCollisionRightHandにしました。

ANS_WeaponCollisionLeftHandの編集

左メニューの関数オーバーライドの欄でReceived Notify Beginを選択。
NotifyStateは始点と終点の2つの点で管理します。Received Notify Beginは始点にあたります。

ノードを組む

Received Notify BeginMesh Compから線を伸ばしてGet Ownerを配置。そのReturn ValueからCast To BP_EnemyZombieを配置。Received Notify BeginCast To BP_EnemyZombieを繋ぐ。
Cast To BP_EnemyZombieAs BP Ememy Zombieから線を伸ばしてWeapon Collision Left Handを取得、さらに線を伸ばしてSet Collision Enabledを配置。New Typeがコリジョンなしになっていますからコリジョンを有効化(Query and Physics)にする。
Cast To BP_EnemyZombieSet Collision Enabledを繋ぐ。
Set Collision Enabledリターンノードを繋ぐ。

左メニューの関数オーバーライドの欄でReceived Notify Endを選択。

ノードを組む

Received Notify Beginとほぼ同じですから、ほぼコピペで組めます。1つだけ違うのはSet Collision EnabledのNew Typeをコリジョンをなしにする。

同じようにANS_WeaponCollisionLRightHandも作成します。

AnimMontageにステートを追加

敵の攻撃モーションのAnimMontageにANS_WeaponCollisionLeftHandとANS_WeaponCollisionRightHandを追加します。

BP_EnemyZombieを編集

ノードを組む

WeaponCollisionLeftHandとWeaponCollisionRightHandにそれぞれOn Component Begin Overlap → Apply Damegeを設定します。

プレイヤーのイベント AnyDamageは設定済ですから、テストプレイをしたら、ゾンビの攻撃でプレイヤーがダメージを受けました。

コメント

  1. Jamal Rusi より:

    Outstanding feature

タイトルとURLをコピーしました