今回は、徘徊するゾンビがどのようにプレイヤーを追跡するようになるのかを説明していく
今回はほぼほぼスクリプトの話が中心になりそう・・・
〇処理の概要
1 プレイヤーがゾンビの視野内にいるかどうかの確認
追跡者であるゾンビのゲームオブジェクトに上記のスクリプトを追加
以下では上記スクリプトのポイントについて解説していく
9 public Transform target;
追跡するプレイヤーをInspector上で割り当てるためにpublicで位置情報用の変数を定義
25 public bool DetectTarget()
26 {
27 Vector3 direction = target.position- transform.position;
ターゲットであるプレイヤーとの距離を計算
28 RaycastHit hit;
29
30 if (Vector3.Angle(transform.forward, direction) < 45f)
ゾンビの正面の位置と、ターゲットの位置とをパラメーターとして、
二点間の角度を算出し45度以下であれば以下の処理を実行
つまりは、ゾンビの正面45度の角度内にプレイヤーがいるかどうかを確認
している
31 {
32 if(Physics.Raycast(transform.position,direction,out hit))
33 {
34 if (hit.transform == target)
35 {
36 return true;
37 }
38 }
39 }
40 return false;
41 }
32行目からはRaycast関数を使用し、ゾンビからrayを飛ばして、
rayが当たったオブジェクトがプレイヤーのポジションと一致した場合に
trueを返している
なお、その他のスクリプトについては、デバック用にrayに色を付けるイメージで線を描画しており、制御上は必要ないが、動作が怪しい時には参考になるので自力で調べてほしい(-_-メ)
2 プレイヤーがゾンビの視野に入った場合の処理
先ほど「1」の項目で説明したスクリプトは、ゾンビの徘徊制御用のスクリプトのUpdate関数の中で使用されており(66、67行)、ゾンビがターゲットを発見していない状態では毎フレーム呼び出している
ゾンビがプレイヤーを視野にとらえると、IsTargetFindにtrueが格納され、true出ない場合はそのまま徘徊を続ける(70~77行)
プレイヤーを視野にとらえ 、IsTargetFindがtrueの場合(78~81行)は、
agent.destination = target.position;
徘徊の目的地をターゲットであるプレイヤーの位置に設定
agent.speed = 5.5f;
ゾンビの進行速度を1から5.5にアップし、通常の足を引きずり歩くような状態から、走って追いかけるような状態に変更している
3 プレイヤーを見失う条件
「2」の項目のスクリプトの85~90行において、再度ゾンビの視野からプレイヤーまでの角度を確認し、45度を超える場合は視界から外れたとして、通常の徘徊動作にもどしている
ということで、ゾンビ徘徊⇒プレイヤー発見⇒ダッシュで追跡⇒プレイヤーを見失う⇒徘徊の流れの制御を解説した
なお、ゾンビ自体のモーションも上記の状況に合わせて変更しているのだが、そちらのやり方についてはまた次回以降に