近づいてきた敵が攻撃してくるようにします。
敵の攻撃アニメーションの準備
敵の攻撃アニメーションを用意し、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 AIのControlled 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 ActorのAs ActorをOther Actorに繋げる。
Get Distance Toから線を伸ばして以下(<=)を配置。その左下から線を伸ばして変数へ昇格。名前をMeleeAttackDistanceにします。目玉アイコンを開けておく。
変数を追加。名前はIsInRange、型はBlackboard Key Selector。目玉アイコンを開けておく。
変数IsInRangeをGetして線を伸ばしてSet Blackboard Value as Boolを配置。Cast To Actorから繋ぐ。以下(<=)の右からValueに繋ぐ。
IsInRangeとSet 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 AIのControlled Pawnから線を伸ばしてDoes Implement Interfaceを配置。その中のInterfaceをBPI_AI_BehaviorTreesにする。Return Valueから線を伸ばしてブランチを配置。イベント Receive Execute AIからも繋ぐ。
イベント Receive Execute AIのControlled Pawnから線を伸ばしてAttack(メッセージ)を配置。ブランチのTrueから繋ぐ。
Attack(メッセージ)から線を伸ばしてDelayを配置し、2本の線を繋ぐ。そこから線を伸ばしてFinish Executeを配置して、Successにチェックを入れる。
ブランチのFalseから線を伸ばしてFinish Executeを配置して、Successにチェックは入れない。
ビヘイビアツリーの編集

Simple Parallelのメインタスクから左下に線を伸ばしてBTTask_ChaseTargetを配置。
Simple Parallelのサブタスクから右下に線を伸ばして、BTTask_AttackTargetを配置。
BTTask_AttackTargetで右クリックして、デコレーターを追加 > Blackboard。
追加されたBlackboard Based Conditionを選択し、詳細 > ブラックボード > Blackboard KeyをInMeleeAttackRangeにします。
BP_EnemyZombieの編集
クラス設定 > 詳細 > インターフェース > 実装インターフェースにBPI_AI_BehaviorTreesを追加。
コンパイルして、左メニューのインターフェース > Attackをダブルクリック。
コリジョンの有効化
AnimNotifyStateの作成と編集
コンテンツブラウザで右クリックしてブループリント クラスを選択。すべてのクラスの中からAnimNotifyStateを選択。
2つ作成し、名前はANS_WeaponCollisionLeftHandとANS_WeaponCollisionRightHandにしました。
ANS_WeaponCollisionLeftHandの編集
左メニューの関数オーバーライドの欄でReceived Notify Beginを選択。
NotifyStateは始点と終点の2つの点で管理します。Received Notify Beginは始点にあたります。
ノードを組む
Received Notify BeginのMesh Compから線を伸ばしてGet Ownerを配置。そのReturn ValueからCast To BP_EnemyZombieを配置。Received Notify BeginとCast To BP_EnemyZombieを繋ぐ。
Cast To BP_EnemyZombieのAs BP Ememy Zombieから線を伸ばしてWeapon Collision Left Handを取得、さらに線を伸ばしてSet Collision Enabledを配置。New Typeがコリジョンなしになっていますからコリジョンを有効化(Query and Physics)にする。
Cast To BP_EnemyZombieとSet 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は設定済ですから、テストプレイをしたら、ゾンビの攻撃でプレイヤーがダメージを受けました。
コメント
Outstanding feature