目次
はじめに
注意
UE5.0.3の現在の情報です。
今後のアップデートによりUIや機能が変更される可能性があることをあらかじめご理解ください。
前回
前回はプレイヤーを基準に移動を制御することに成功しました。
しかし、壁や穴があっても無視して移動してしまいます。
今回はタスク内に移動できるかどうかの判定を組み込み、より自律的なNPCを作成していきたいと思います。
▼この記事でできること
解説
①レベルの編集
動作テストができるように検証レベルを編集します。
画像のように階段やCubeを配置して、道と穴を作りました。
一度実行してNPCが侵入できるか確認しておきます。
障害物を無視しているので落ちたり、壁があっても移動しようとしてしまいます。
②障害物の検出
移動できるかを判定するのに複数のトレースとパスを使用します。
トレースはUnityでいうところのレイで、障害物があると当たったものの情報を返します。
BTT_Strafingを開き関数CheckCanMoveを作ります。
SelectWorldDirectionと同じようにインプットを作成しリターンにはboolを返します。
純粋にチェックを入れておきましょう。
まず、MultiBoxTraceで箱型のトレースを作成して進行方向に障害物があるかを判定します。
オブジェクトチャンネルを検索します。キャラクターがもつPawnとWorldStaticに当たったらTrueを返すノードです。IgoneSelfとIgoneActorsに自身を入れて対象に含めないようにします。
シンプルにキャラクターの現在値とSelectWorldDirection関数で取得できる方向にMultiBoxCheckDistance変数(デフォルト値150)をかけたものを終点に用意しているだけです。
Boxの大きさは制御されているキャラクターのサイズに依存してほしいのでカプセルコンポーネントの高さと大きさを使用しています。
イベントグラフでSelectWorldDirectionを2回呼ぶのは無駄なコストなのでCheckCanMoveのリターンにWorldDirectionを追加しておきます。
ReturnValueで当たったかどうかを判定できるので当たったら移動できないようにフラグを制御します。
デバッグ表示してみます。
BTT_Strafingのイベントグラフに戻りAND演算に作成した関数を実装します。
移動方向に向かって赤色のBoxが表示されます。
WorldStaticもしくはPawnが触れるとヒット判定が呼ばれて色が緑になります。
この時、CanMoveのフラグがFalseになり、壁に向かって移動しなくなります。
③足場の検出
障害物の検出はできるようになりましたが、穴には落ちてしまいます。
そこでLineTraceを使って足場があるか検出します。
初回のヒットだけ検出すればいいのでMultiではないほうを使います。
足元に向けてほしいので(0,0,- LineCheckDistance)分を足し算します。
Vector2D型の変数LineCheckDistanceの初期値は(50,100)にしました。
ここでは当たっているときは移動できるのでNOT演算は行いません。
イベントグラフ戻り、移動できない場合はこのタスクを失敗扱いします。
実行してみましょう。トレースが触れていない場合は移動しなくなるはずです。
もっと精密に行いたい場合はLineCheckDistanceの値を調整して足元を検出するようにしたり、LineTraceを複数用意するとよいでしょう。
完成!!
⑤スタックを回避する
距離に依存して確定で動く方向だと、その移動ができないときスタックしてしまいます。それをある程度回避するために一部MoveToを追加します。
ここのMoveToはそれぞれAcceptableRadiusを50としました。(ただし、Distanceのデコレーターで中断される)
とはいえプレイヤーに壁などに追い詰められたらなすすべがありません。ゲーム性にもよりますが”おびえる”や”投げ技”など不自然のないような動作を追加するのもいいでしょう。
見失ったらLockOnを終了するタスクを追加します。
これで一通りの実装は完了です。
BP_ThirdPersonCharacterの一部修正とお詫び
BP_ThirdPersonCharacterのその場ターンの実装なのですがロックオンしたときはマウスの入力でターンを検出するのが難しいのでNPCキャラの判定を組み込みます。内容が前後してしまうことお詫び申し上げます。
更新箇所
BP_ThirdPersonCharacter
▼イベントグラフ
イベントはそれぞれBP_NPC_Characterのイベントをコピーしてください。
▼CheckStrafingIdleTurn
これでロックカメラ時に自動ターンアニメーションをします。
最後に
UE4やUE5向けの記事を書いています。
皆様の応援が投稿のモチベーションになりますので
コメントやTwitterのフォローなどしていただけるとありがたいです。
それではよきゲーム開発を。