敵をランダムに動かします。
4ファイルの準備
敵の作成の基本となる4ファイル。
敵ブループリント、AIコントローラー、ビヘイビアツリー、ブラックボードを準備します。
敵ブループリントの作成
味気ないのでゾンビに変更しました。
マーケットプレイスでZombie with T-ShirtとZombie Movement and Modular Interaction Animationsを入手しました。
Zombie with T-Shirt in Characters – UE Marketplace
Zombie Movement and Modular Interaction Animations
Zombie with T-Shirtの中にあったBP_TSZombiePartsをコピーして、BP_EnemyZombieにしました。
BP_Enemyで使用していたイベント AnyDamageをコピーして変数Hpも追加して使用。
コリジョンも前回の設定と同じようにやりました。
ゾンビにしては足が速いですから、詳細 > キャラクタームーブメント: 歩行 > Max Walk Speedを100.0 cm/sにしました。
アニメーションブループリントのSNP_ThirdPerson_AnimBPもコピーして、ABP_EnemyZombieにしました。
AIコントローラーの作成
右クリックからブループリント クラスを選択。親クラスをすべてのクラスから検索してAIControllerにします。
名前はBP_AIControllerにしました。
ビヘイビアツリーの作成
右クリックからAI > ビヘイビアツリーを選択。
名前はBT_AIEnemyZombieにしました。
ブラックボードの作成
右クリックからAI > ブラックボードを選択。
名前はBB_AIEnemyZombieにしました。
4ファイルの編集と連携
敵ブループリントの編集
BP_EnemyZombieを編集します。
コンポーネントのBP_EnemyZombie (Self)を選択し、詳細のポーン > AI Controller ClassをBP_AIControllerに変更。
AIコントローラーの編集
BP_AIControllerを開き、イベントグラフを開く。
コンパイルする。
これで準備完了です。
敵をランダムに移動させる
ナビメッシュ バウンズ ボリュームを配置する
レベルを開いた状態で、上メニューの■+をクリックしてボリューム > ナビメッシュ バウンズ ボリュームを選択。
このNavMeshBoundsVolume内が敵が移動できる範囲です。
位置とスケールを調整して、レベル全体を包み込むように配置しましょう。
Pキーを押して緑色になっていれば、そこは敵が移動できる範囲です。
ビヘイビアツリーの編集
BT_AIEnemyを開く。
詳細のBehaviorTree > Blackboard AssetがBB_AIEnemyZombieになっているのを確認。なっていなければ手動で設定。
上メニューの新規タスクでタスクの作成。名前はBTTask_RandomLocationにします。
タスクの編集
左メニューの関数オーバーライドのところでReceive Execute AIを選択。
配置されたイベント Receive Execute AIのControlled Pawnから線を伸ばしてGet Actor Locationを配置。
そのReturn Valueから線を伸ばしてGetRandomReachablePointInRadiusを配置。その中のRadiusを500.0にします。半径5メートルです。このノードはOriginの位置から半径5メール内の地点をランダムに取得するものです。
Random Locationから線を伸ばしてSet Blackboard Value as Vectorを配置。
その中のKeyから線を伸ばして変数へ昇格。名前をTargetLocationKeyにします。そしてその変数の目玉アイコンを開けておくこと。
Set Blackboard Value as Vectorから線を伸ばしてFinish Executeを配置。
イベント Receive Execute AIとSet Blackboard Value as Vectorも繋ぐ。
GetRandomReachblePointInRadiusのReturn ValueからFinish ExecuteのSuccessに繋ぐ。
ビヘイビアツリーの編集
Sequenceから左下に線を伸ばしてTasks > BTTask Random Locationを配置。
Sequenceから下に線を伸ばしてTasks > Move Toを配置。
Sequenceから右下に線を伸ばしてTasks > Waitを配置。
Sequenceは左から順に実行しますので、タスクの置き方は重要です。
まずBTTask Random Locationでランダム移動地点を見つけて、Move Toでそこに移動させるわけです。
Waitで5.0秒待機した後、再びBTTask Random Locationでランダム移動地点を見つけます。
Waitは詳細から時間変更できます。
右上の「ブラックボード」からブラックボードを開けます。
ブラックボードの編集
新規キーをクリックしてVectorを選択。名前はTargetLocationにします。
このキーに取得したランダム移動地点が入ります。
ビヘイビアツリーの編集
BTTask_RandomLocationを選択し、詳細のデフォルト > Target Location KeyにTargetLocationを指定。
Move Toを選択し、詳細のブラックボード > Blackboard KeyにTargetLocationを指定。
この状態でレベルにBP_Playerを配置してテストプレイすると、Enemyがランダムに動き回ります。
BP_Playerを数体配置しても構いません。
プレイヤーを見つけたら追いかける
AIControllerの編集
コンポーネントのAIPerceptionを追加。
AIPerceptionを選択し、詳細 > AI パーセプション > Senses Configを+する。
インデックス[0]にAI Sight configを選択。これは視認を制御する機能です。
インデックス[0]を開き、Senseを開く。
Detection by Affiliationを開き、3つの項目全てにチェックを入れる。
Sight Radius: 3000とは、敵の30m内に入ると視認されるということです。30mは長いので8m(800)にしました。
Lose Sight Radius: 3500とは、視認された後、35m以上離れると視認されなくなるということです。こちらは11m(1100)にしました。
PeripheralVisionHalfAngleDegrees: 90とは片目の視野角です。片目90度ですから、前方180度ですね。
詳細 > イベント > On Target Perception Updateを+して配置。
On Target Perception Updateの実行ピンから線を伸ばしてブランチを配置。
Actorから線を伸ばして等しい(==)を配置。そのアセットを選択から線を伸ばしてGet Player Characterを配置。等しい(==)の右から線を伸ばしてブランチと繋ぐ。
つまりプレイヤーを視認したらTrueです。
Trueから線を伸ばしてブランチを配置。
On Target Perception UpdateのStimulusから線を伸ばしてAIStimulus を分解。Successfully Sensedから線を伸ばしてブランチの左下に繋ぐ。
【Ture側】プレイヤーを視認した
Trueから線を伸ばして「状況に合わせた表示」のチェックを外してSet Value as Objectを配置。そのターゲットはGet Blackboardを取得を配置。Key Nameから線を伸ばしてMake Literal Nameを配置し、ValueはTargetActorと記入。Object ValueからActorに繋ぐ。
【False側】
True側をコピーします。
Object Valueに何も設定しないことでリセットされる。
ブラックボードの編集
新規タスクを追加する。ベースはBTTask_BlueprintBaseで名前はBTTask_ChaseTarget。
BTTask_ChaseTargetの編集
関数オーバーライドのReceive Execute AIを選択。
空いている場所にAI MoveToを配置。PawnからControlled Pawnに繋ぐ。実行ピンも繋ぐ。
Finish Executeを2つ配置して、片方だけSuccessにチェックを入れる。
AI MoveToのOn Successからチェックありへ繋ぎ、On Failからチェックなしに繋ぐ。
変数を追加。名前はTargetActorで型はBlackboard Key Selector。目玉アイコンを開けておく。
TargetActorをGetして線を伸ばしてGet Blackboard Value as Objectを配置。線を伸ばしてCast To Actorを配置。イベント Receive Execute AIとAI MoveToの間に繋ぐ。
As ActorとTarget Actorも繋ぐ。
Acceptance Radiusで右クリックして変数へ昇格。名前をStopDistanceにします。目玉アイコンを開けておく。コンパイルしてデフォルト値は100にしておきます。
ビヘイビアツリーの編集
新規キーをクリックして、Objectを選択。名前はTargetActorにします。
TargetActorを選択して詳細 > Key Type > Base ClassをActorにする。
ルートから線を伸ばしてSelectorを配置。Selectorの右下からSequenceに繋ぐ。Sequenceの名前をPatrolSequenceに変えておきます。
Selectorの左下に線を伸ばしてSequenceを配置。名前をChaseTargetSequenceにしました。
【ChaseTargetSequence】
ChaseTargetSequenceから線を伸ばしてBTTask_ChaseTargetを配置。BTTask_ChaseTargetの詳細 > デフォルト > Target ActorをTargetActorにする。
ChaseTargetSequenceで右クリックしてデコレーターを追加 > Blackboard。
出現したBlackboard Based Conditionを選択して詳細の
フローコントロール > オブザーバーを中止をSelfにします。
ブラックボード > Blackboard KeyをTargetActorにします。
ディスクリプション > Node NameをFindTarget?にします。
【PatrolSequence】
Patrol Sequenceで右クリックしてデコレーターを追加 > Blackboard。
出現したBlackboard Based Conditionを選択して詳細の
フローコントロール > オブザーバーを中止をSelfにします。
ブラックボード > Key QueryをIs Not Setにします。
ブラックボード > Blackboard KeyをTargetActorにします。
コメント
Insightful piece