アクションゲームを作りたいと思い最初に実装してみたのが、襲いかかってくる敵だ。
動画のように壁がある場合には襲ってこないが、ゾンビの視界に入った時に襲ってくるようにした。
Asset Storeに会った無料の「Zombie」をダウンロードし配置。
プレイヤーを追いかけさせるにNavMeshを利用した。

Bakeを押すとプレイヤーへのルートが計算され、追いかけることが可能になる。
Bakeの計算が終わったら、Nav Mesh Agentのコンポーネントをゾンビに追加する。

追いかける加速度、速度を設定できる。
ゾンビの中にからのオブジェクト、CollisionDetectorを作成。
以下のスクリプトとコライダをアタッチする。
public class CollisionDetector : MonoBehaviour { [SerializeField] private TriggerEvent onTrigerStay = new TriggerEvent(); private void OnTriggerStay(Collider other) { onTrigerStay.Invoke(other); } [Serializable] public class TriggerEvent : UnityEvent<Collider> { } }

コライダの半径(Radius)がゾンビが認知する範囲である。
これで、半径の範囲にプレイヤーが入ってきたら、ゾンビにアタッチされた下記のonDetectObjectが実行される。
public void onDetectObject(Collider collider) { if (collider.CompareTag("Player")) { var positionDiff = collider.transform.position - transform.position; var distance = positionDiff.magnitude; var direction = positionDiff.normalized; var hitCount = Physics.RaycastNonAlloc(transform.position, direction, _raycastHits, distance); if (hitCount == 1) { _agent.isStopped = false; _agent.destination = collider.transform.position; } else { _agent.isStopped = true; } } }
Raycastを使っているのは、ゾンビの視線にプレイヤーが入った時のみ襲ってくるようにするためだ。
プレイヤーとの間に障害物がある場合には、hitcountが2になるためゾンビは襲ってこない。
そんな感じ!
終わり!