まずはNPCに歩いているアニメーションをさせながら、プレイヤーを追跡させます。
Asset Storeで無料のキャラクターのアセットをダウンロード・インポートしました。
モデルをシーンに配置します。
インスペクタを見ると、Animatorコンポーネントにアニメーターコントローラーがアタッチされていません。
Animatorフォルダにあるアニメーターコントローラーをここにドラッグアンドドロップしました。
ここをダブルクリックしてアニメーターコントローラーを確認します。
整数のパラメーターを使って、1のときはこのアニメーション、2のときは・・と遷移させているようです。
今animBaseIntが1になっているので、ゲームを始めるとすぐに「Idle_generic」というステートに遷移したままになります。
これは立っている状態です。
歩いているアニメーションは右上の「Other_walking」ステートに設定されています。
このステートへの遷移の矢印のインスペクタをみると、animOtherIntが1であることが遷移の条件になっています。
歩いている状態からスタートしてほしいので、animOtherIntだけを1にして、他のパラメータを0にします。
ナビメッシュエージェントを使う
プレイヤーを追跡させるために、このキャラクターにNavMeshAgentコンポーネントを付けました。
これを使うためには、まず床のオブジェクトを選択して、Navigationタブ-> Object で、Navigation Staticにチェックを入れます。
そして、Bakeに移って「Bake」ボタンを押します。
これでエージェントが歩ける場所が作られました。
キャラクターにスクリプトも付けます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class ZombieScript : MonoBehaviour
{
public GameObject player;
NavMeshAgent agent;
// Start is called before the first frame update
void Start()
{
agent = GetComponent<NavMeshAgent>();
}
// Update is called once per frame
void Update()
{
agent.destination = player.transform.position; // プレイヤーの現在位置を教える
}
}
プレイヤーを追跡させるには、NavMeshAgentコンポーネントのdestinationプロパティにプレイヤーの位置を入れます。
このキャラクターはプレハブ化するので、プレイヤーのオブジェクトをインスペクタからアタッチすることはできません。なので、他のスクリプトでゾンビを出現させるときに、ゾンビに付けたスクリプトのpublic変数にプレイヤーのオブジェクトを代入します。
Unityで銃を撃つスクリプトにゾンビを出現させるコルーチンを追加します。
// 宣言
public GameObject Zombie;
List<GameObject> zombieList;
public GameObject player;
// ---
// Start()
zombieList = new List<GameObject>();
StartCoroutine("GenarateZombie");
// ---
private IEnumerator GenarateZombie()
{
while (true)
{
zombieList.Add(Instantiate(Zombie,new Vector3(Random.Range(-88,88),0f,Random.Range(-88,88)),transform.rotation)); // ゾンビを出現させる
zombieList[zombieList.Count - 1].GetComponent<ZombieScript>().player = player; // プレイヤーのオブジェクトを教える
yield return new WaitForSeconds(1); // 1秒待つ
}
}
このスクリプトでは、インスペクタからプレイヤーのゲームオブジェクトをアタッチしています。そして、ゾンビを出現させた直後にそのゾンビについたZombieScriptのplayerプロパティにこのプレイヤーのゲームオブジェクトを入れています。