AIプログラムとかUnityゲーム開発について

探索や学習などを活用したAI系ゲームを作りたいと思います。

高度差のあるNavMeshと定期巡回

 NavMeshについて一通り学習中。
 スロープのある経路を作って、定期巡回のコードを作りました。
 ゾンビなので、ターゲットが近い場合は、定期巡回を外れてそっちに襲ってくる。

f:id:yasu9780:20160924185659p:plain
StandardAssetのToonシェーダーがいい感じ!


高度差のある経路でBakeします。
f:id:yasu9780:20160924190218p:plain

定期巡回はよくあるコード

public class Move : MonoBehaviour {
    public GameObject target;
    NavMeshAgent agent;

    public Transform[] points= new Transform[5];
    private int nowPoint;
   
    void Start () {
        nowPoint = 0;
        agent = GetComponent<NavMeshAgent>();
        agent.radius = 0.1f;
        agent.speed = 1.4f;
        GotoNextPoint();
    }

    void Update () {
        if (agent.remainingDistance < 0.5f)
            GotoNextPoint();
    }
    void GotoNextPoint()
    {
        if (points.Length == 0) return;
        agent.destination = points[nowPoint].position;
        nowPoint = (nowPoint + 1) % points.Length;
    }

}

あらかじめPoints配列に経路上の通過ポイントを設定しておく。
destinationに到着するたびに次のpointに目的地を変更

nowPoint=(nowPoint + 1) % points.Length;

 これでコードが代入されるたびにnowPointが0からLength内で繰り返す。


 あと、はじめハマったのが、NavMeshAgent同士がぶつかり合って動けなくなったんですよ。
 まるでコライダーがあるRigidBodyみたいに。
 でもRidigBodyじゃないし。
 検索しても原因が分からず、色々と値をいじってみてわかりました。

agent.radius = 0.1f;

 このradiusを小さくしないと互いにぶつかります。小さいとすり抜ける。






使用モデルは、
ベースモデルはPMCA制作のmatoさん
ゾンビ親父は、モロゾフさん
アリシアちゃんはドワンゴ制作