今回から数回にわたり、敵キャラであるゾンビの動作の実装方法について解説する
〇ゾンビの動作の概要
ゾンビは大まかには下記のような動作を行うので、それぞれについて分けて解説していく
- 一定の区間を自動に徘徊
- プレイヤーを見つけるとプレイヤーの追跡を開始、プレイヤーを見失うと、また元の徘徊モードに復帰
- プレイヤー追跡モードに入ると、ゾンビは通常の歩くモーションから、スピードも上げながら走り出す
- プレイヤーの一定距離に入るとプレイヤーを襲うモーションを行う
1 一定の区間を自動に徘徊
ゾンビを自動で徘徊させるには、UnityのNavMashを使用する
〇ポイント
イ 徘徊させたいオブジェクトに目的地と進むスピードなどを設定する
ア 徘徊させるマップの情報をつくる
情報が設定された状態のイメージ
水色部分が動ける範囲
〇操作方法
- メニューからWindow-AI-Navigationを選択
- するとNavMeshがプロジェクト内に作成され、Navigationのウインドウが表示される
-
地形の情報を書き込む=BAKEするために、地形用のオブジェクトをStaticに設定
- Navigationのウインドウに切り替え、Bakeのボタンを押すと、移動可能なエリア情報が作成される
イ 徘徊させたいオブジェクトに目的地と進むスピードなどを設定する
- まずは徘徊させたいゲームオブジェクトを選択しAdd ComponentをクリックしてにNav Mesh Agentコンポーネント選択して追加
- 次に上記のようなスクリプトを追加する
スクリプトは、Unityのマニュアルに載っているものをほぼそのまま使用
上記のコメントをよく見てもらいつつ、ポイントのみ下記で解説
a 目的地データの格納
// 巡回地点オブジェクトを格納する配列
public Transform[] points;上記にて、目的地となるゲームオブジェクトの位置情報を格納
あとからシーンに目的地用のゲームオブジェクトを配置し、
Inspector上でこの配列に配置したゲームオブジェクトを割り当てる
// 巡回地点のオブジェクト数(初期値=0)
private int destPoint = 0;複数設定した目的地のうちの1つを指定するために上記を使用
Start関数内で destPoint = Random.Range(0, points.Length)にて一つに抽選で決定
b 目的地の選択
// エージェントが現在設定された目標地点に行くように設定
agent.destination = points[destPoint].position;GotoNextPoint()関数内では、次の目的地設定
// エージェントが現目標地点に近づいてきたら、
// 次の目標地点を選択します
if (!agent.pathPending && agent.remainingDistance < 0.5f)
GotoNextPoint();Update関数内で、目的地までのルート、距離を監視し、一定まで近づいたら
次の目的地を設定している
3. 目的地の設定は、シーン上にSphereなどのゲームオブジェクトを配置し、Inspector上で先ほど作成したスクリプトに割り当てを行いリンクさせる
こうした感じで、上記のようになれば完成
お分かりいただけるだろうか?!
障害物を回避して目標までの道筋を進んでいる
なお、上記のキャラクターは歩いているが、ここまで説明したなかではモーションが設定されていないので、歩く動作がないまま滑るように移動するのが正解なので悪しからず
あと、目的地用のオブジェクトは、非アクティブ化して表示させないように
〇補足
オブジェクトがめり込む場合
ゲームオブジェクトが、地形のオブジェクトにめり込んでしまうよような場合は、NaigationのBakeの設定でAgent Radiusの数を大きくして、再度Bakeボタンを押して米くすると、上記のように余白が広くなり、この余白の外側を移動するようになる
移動速度について
移動させるオブジェクトにアタッチしたNav Mesh Agentの設定のSteeringの中のSpeedを変更することにより移動速度が変化する
その他いろいろ設定はあるが公式マニュアルを参照ねがう(よくわからないので(-_-メ))