敵AI 8:集団の敵の攻撃タイミングの管理

集団で襲ってくる敵が攻撃してくるタイミングを制限します。

プレイヤーがトークンを持ち、敵が攻撃前にそのトークンを受け取って攻撃し、攻撃後にトークンを返すシステムです。プレイヤーのトークンが1なら、1体の敵しか攻撃できないという仕組み。

Ali Elzoheiry氏のチュートリアルから学ぶ敵AIの第8回になります。過去記事で作成したものが必須になります。
敵AI:敵がルートを巡回しプレイヤーや音に気付くと反応
敵AI 2:敵が間合いを取りながら攻撃してくる
敵AI 3:敵が逃げて隠れて再び攻撃してくる
敵AI 4:近距離タイプと遠距離タイプの敵を分ける
汎用性と拡張性の高いダメージシステム
敵AI 5:敵の攻撃とブロック
敵AI 6:プレイヤーを見失った敵が捜索を始める
敵AI 7:NavLinkProxyで敵にジャンプさせる 

記事は自分でやり直す時のために簡単にまとめており、独自の仕様にもなっていますから、学習するなら参考元のAli Elzoheiry氏のSmart Enemy AI Tutorial Seriesの動画を視聴してください。

BPインターフェース: BPI_Damageable

関数: ReserveAttackToken

インプット
Amount – Integer

アウトプット
Success – Boolean

関数: ReturnAttackToken

インプット
Amount – Integer

BPC_DamageSystem

変数の追加

AttackTokenCount – Integer ※デフォルト値1

関数: ReserveAttackToken

敵キャラクターが攻撃前にトークンを受け取る処理。

インプット
Amount – Integer

アウトプット
Success – Boolean

ノードを組む
関数: ReturnAttackToken

敵キャラクターが攻撃後にトークンを返す処理。

インプット
Amount – Integer

ノードを組む

BPインターフェース: BPI_EnemyAI

関数: AttackStart

インプット
AttackTarget – Actor
TokensNeeded – Integer

アウトプット
Success – Boolean

関数: AttackEnd

インプット
AttackTarget – Actor

関数: StoreAttackTokens

インプット
AttackTarget – Actor
Amount – Integer

プレイヤーBP: BP_Player

インターフェース: Reserve Attack Token
ノードを組む

・敵がプレイヤーをAttackTargetにした状態でこの関数が呼ばれて、敵にトークンを渡す。
イベントグラフ
ノードを組む イベント Return Attack Token
コンストラクションスクリプト
ノードを組む

・プレイヤーの初期トークン数。1だと1体ずつしか攻撃してこない。2だと2体同時に攻撃してくる。

敵BP: BP_EnemyBase

インターフェース: Reserve Attack Token
ノードを組む
イベントグラフ
ノードを組む

【変数】ReservedAttackTokens – Actor マップ
新規作成。コンテナをマップにします。
【変数】TokensUsedInCurrentAttack – Integer
新規作成。
ノードを編集 イベント EnemyAttack

・変更点はAttack Endを追加しただけです。
・トークンの受け取りはタスクで行います。
インターフェース: Attack Start
ノードを組む

タスク: BTTask_MeleeAttack

基底クラス: BTTask_BlueprintBase
名前: BTTask_MeleeAttack
新規作成。
ノードを組む

【変数】AttackTargeKey – Blackboard Key Selector
新規作成。目玉アイコンを開ける。
【変数】AttackRadiusKey – Blackboard Key Selector
新規作成。目玉アイコンを開ける。
【変数】TokensNeeded – Integer
新規作成。目玉アイコンを開ける。

ビヘイビアツリー: BT_EnemyMelee

ビヘイビアツリーを組む

Attack(Sequence)の下を削除してBTTask_MeleeAttackに置き換え、Cooldownを移動させる。
Keyと値の設定は画像参照。

タスク: BTTask_RangedAttack

基底クラス: BTTask_BlueprintBase
名前: BTTask_RangedAttack
新規作成。
ノードを組む

【変数】AttackTargeKey – Blackboard Key Selector
新規作成。目玉アイコンを開ける。
【変数】TokensNeeded – Integer
新規作成。目玉アイコンを開ける。

ビヘイビアツリー: BT_EnemyRanged

ビヘイビアツリーを組む

BTTask_DefaultAttackの削除。
EvadeAndAttackEvadeに名前変更。
Evadeの上にSelectorを追加し、BTD_CanSeeTargetを移動させる。
・追加したSelectorから左に線を伸ばしてSequenceを追加し、名前をAttackにする。
Attackの下にBTTask_RangedAttackを追加。Attack Target KeyはAttackTarget、Tokens Neededは1。Cooldownも追加して2秒に設定。
・その右にWaitを配置。

AIコントローラー: AIC_EnemyBase

親クラスを変更

クラス設定 > クラスオプション > 親クラスをAIControllerからDetourCrowdAIControllerに変更します。この変更だけで敵同士が衝突を避けるようになる。

敵BP: BP_EnemyBase

ノードの編集

・死亡時にトークンを返す処理を追加しています。

コメント

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