目次
はじめに
注意
UE5.0.2の現在の情報です。
今後のアップデートによりUIや機能が変更される可能性があることをあらかじめご理解ください。
前回
今回は前回のプロジェクトから引き続き、確率で行動を変更するNPCを作ります。
具体的には一定間隔で行動を起こすNPCを作成して、デコーダーを使った確率分岐で移動先を決定してみようと思います。
①~⑨までは移動先ポイントの実装なので本題だけ知りたい人は⑩から進めてください。
解説
①移動先の作成
AIの移動先を作成します。
柔軟な変更をできるようにブループリントを作成して参照できるようにします。
コンテンツ右クリックからActorを親としたブループリント、BP_AIActionPointBaseを作成します。
コンポーネントからStaticMeshとBillboardを追加します。
画像のようにトランスフォームとメッシュ変更します
コリジョンはNoCollisionにしておきます。
Construction Scriptに画像のように組み
NewSpriteを変数化します。
コンパイル後変数のデフォルト値に適当な画像を設定しておきます。
次にName型の変数を作成してこちらもインスタンス編集可能にします。
②移動先の配置
作成したBP_AIActionPointBaseをマップに配置します。
アイコンを編集してそれぞれActionNameをA,B,Cとしておきました。
間隔を空けて配置しました。
③移動先の登録
このアクション地点の情報はAIControllerに所有させます。
BP_NPC_Controllerを開いて画像のようにレベル上のポイントをすべて取得して、配列AIActionPointsという変数を作成してセットします。
④ビヘイビアツリーの編集
ビヘイビアツリーを画像のように変更します。
流れを説明すると、プレイヤーを追いかけていない場合は0.5秒待機した後に、ChaseActorKeyに設定された場所に移動します。
現在ChaseActorKeyには何も設定されていないので正しく動作しません。
⑤移動先登録タスクの作成
ブラックボードのChaseActorKeyにコントローラーブループリントのAIActionPointsからアクションに応じて設定する必要があります。
そこでChaseActorKeyに設定するというタスクを作成します。
ビヘイビアツリーから新規タスクを押します。
ビヘイビアツリーのタスクなのでBTT_を頭につけます。
名前はBTT_SetActionPointとしました。
設定は一度行えばいいのでタスクが開始されたときに呼ばれるReceiveExecuteAIをオーバーライドします。
変数を追加します。どちらも編集可にしてます。
画像のように組みます。
Controllerにアクセスして登録したPointsが存在するかチェックして指定したActionNameと同じ場合はキーを登録してタスクを終了します。
FinishExecuteはタスクの結果を設定するノードです。
コンポジットの挙動が変化するので忘れずにつけましょう。
⑥タスクの配置
ビヘイビアツリーに戻り
作成したタスクを配置してアクション名を入力します。
これでキーが常にAのアクションを行うようになりました。
しかし一度行動してしまうと二度とプレイヤーを追いかけることができなくなってしまいます。そこでプレイヤーキャラの位置を再設定するタスクも作ってみましょう。
⑦プレイヤーキャラを登録するタスクを作る
二回目以降はBTTask_BlueprintBaseを選択しましょう。
名前はBTT_SetPlayerPointとします。
先ほどと同じようにキーを作成して今度はプレイヤーの参照をセットしましょう。
コンパイル後プレイヤーを追いかけるノードの前に配置します。
⑧サービスを修正する
BTS_CheckDistanceですが、常にプレイヤーとの距離を検出したいので名前をBTS_CheckPlayerDistanceとリネームします。
また、内容もキーの情報ではなくプレイヤーの情報に書き換えます。
キーにプレイヤーの情報を設定するタスクを作成したので、AIControllerに設定する必要がなくなったので削除します。
⑨プレイヤーが優先されるように編集する
アクションポイントに移動中、プレイヤーにあったらプレイヤーを優先して追いかけるようにします。
コンポジットにデコレーターを追加します。
プレイヤーとの距離が400以上なら移動処理をキャンセルするようにします。
⑩確率操作用のデコレーターを作る
とても遅くなりましたが、いよいよ本題です。
BTT_SetActionPointで移動先を決定していますが現在は一番左が常に呼ばれています。
なのでデコレーターを使って一定の確率で失敗するようにします。
そうすると一つ右のタスクが検証されて、、、を繰り返すことで確率っぽいことをできます。
新規デコレーターを選択します。
名前をBTD_TaskProbabilityとします。
デコレーターの検証用関数PerformConditionCheckAIを使用します。
パーセンテージという変数を作成します。
ランダムに0~1まで生成してそれが入力された値より大きいか小さいかで判定します。
クラスのデフォルトからコンディションを変更します。
⑪デコレーターの適応
最後にSetActionPointにデコレーターを適応します。
左から検証されるので偏りが出る場合はパーセンテージを操作していい感じの確率を目指してみてください。
このように、プレイヤーが近づいたら追いかける。離れたらランダムなアクションポイントに移動するようになったら成功です。
最後に
UE4やUE5向けの記事を書いています。
皆様の応援が投稿のモチベーションになりますので
コメントやTwitterのフォローなどしていただけるとありがたいです。
それではよきゲーム開発を。