公開日:2023/07/08  更新日:2023/07/08

Unityでの敵の徘徊の実装

 前回までの記事で敵がNavMeshを使って目的地まで移動できるようにした。


 前回までの記事↓
TPSのキャラ移動
ジャンプ
ダッシュ実装
自作キャラを動き回らせる
剣を振る方法
剣コンボ
足が浮く対策
剣の軌跡の作り方
燃える剣の必殺技
ステータス管理
ダメージ判定・処理
HPゲージ
敵の攻撃
メッシュ変形での範囲攻撃
ビーム攻撃
NavMeshの使い方

 今回はNavMeshを使って敵が徘徊できる仕組みを作っていこうと思う。

Unityでの敵の徘徊の実装

Random.Rangeの使い方
敵のステータス設定
スクリプト記述
目次にもどる

Random.Rangeの使い方

 以前の記事では目的地は固定の一か所だった。
NavMeshの使い方
 今回は目的地をランダムに移動させることで、敵の徘徊行動を実現する。

 具体的にはRandom.Rangeを使って乱数(指定した範囲のランダムな数)を取得することで次の目的地を決める。
 intで整数の乱数を取得する場合と、floatで小数点がある乱数を取得する場合で異なる点があるので注意。

 intの乱数取得の場合
 例えば、int a = Random.Range(1, 5);なら1,2,3,4の中からランダムの数が乱数としてaに代入される。
 第1引数に最小値、第2引数に最大値を入れるが、第2引数より1低い数が最大の乱数となるので注意しよう。

 floatの乱数取得の場合
 例えば、float a = Random.Range(1, 5);なら1~5の間の数の中からランダムの数が乱数としてaに代入される。
 intと異なり第2引数の値も乱数に含まれるので注意しよう。

目次にもどる

敵のステータス設定

 敵のステータスとしてScriptableObjectを使って以下を追加する。

 徘徊開始距離
 敵とPlayerがこの距離以内に入ると敵が徘徊をはじめる。遠距離の敵は徘徊せず動かないようにすることで処理を軽くするのが目的。名前はHaikaikyoriとした。

 徘徊間隔
 敵が徘徊のための目的地を変更する間隔。名前はHaikaikankakuとした。この間隔も下の項目の徘徊距離のように最低と最高を作って乱数を取得するようにしてもいいと思うが、今回は行っていない。

 徘徊距離(最低)
 敵の位置から目的地を決定する際の最低の距離。名前はHaikaiminとした。

 徘徊距離(最高)
 敵の位置から目的地を決定する時の最高距離。名前はHaikaimaxとした。

 徘徊速度
 徘徊時の速度。今回は使用しないがいずれ必要になるだろう。名前はHaikaiAGIとした。


 なお、ScriptableObjectがわからない場合は以下の記事で紹介しているので確認してほしい。
ステータス管理

 今回は以下のように設定してみた。


目次にもどる

スクリプト記述

 以下のようにスクリプトを記述し、スケルトン(敵ゲームオブジェクト)にアタッチする。
 以下のようにシリアル化(シリアライズ)を行っている

 Target PlayerにはPlayerのTransform、charadataにはScriptableObjectで作成した敵のassetファイルをセット。

 Startメソッドではシリアル化により入れたassetファイルのcharadataの各ステータスを変数に代入している。
 Updateメソッドでは最初にAttackしているかで条件分岐。AttackしているならNavMeshを非アクティブにしてリターン。
 Attackをしていない場合は、前の位置と今の位置の差を求め、その値をIdouryouパラメータに代入している。移動してなければ停止アニメーション、移動していれば走行アニメーションに遷移する。
 計算後に、OldPositionに今の位置を入れて記憶し、次の処理で前の位置として使用。

 float kyori = Vector3.Distance(PlayerPosition, ThisPosition);として敵とPlayerの距離を求める。
 その距離が徘徊開始距離より離れているなら、NavMeshを非アクティブにしてリターン。

 続いて、koudouの変数とコルーチンを使って、徘徊間隔で指定した時間に1回だけ、ここから下の徘徊処理が行われるようにしている。

 ここからは目的地を決める処理となる。
 float RandamX = Random.Range(Enemyhaikaimin, Enemyhaikaimax);としてEnemyhaikaimin(徘徊距離の最低値が代入)とEnemyhaikaimax(徘徊距離の最大値が代入)の間の乱数を取得して代入している。Z方向も同様の方法で計算している。
 続いて2分の1の確率で-方向への移動もできるようにする。
 PlusMinus = Random.Range(1, 3);としており、PlusMinusはint型であるため乱数は1か2のどちらかとなる。2であれば-1を掛け算する。RandamXとRandamZの両方で行う。

 NextPosition.x = ThisPosition.x + RandamX;として今の敵の位置に乱数を加算したものを次の位置のX座標へ代入。同じようにZ座標の処理も行うことで次の目的地が決定される。

 myAgent.SetDestination(NextPosition);で次の目的地へ向かって敵が移動する。1回の徘徊処理が終了したのでkoudouに1を代入している(これでkoudouが0になるまでは徘徊処理は行われない)。

 以上のように記述すれば以下のように徘徊開始距離以内にPlayerが入ると敵が徘徊処理をはじめるようになる。



 続きの記事は以下。
視界の判定
Unityのゲーム制作まとめへ戻る

page top