読者です 読者をやめる 読者になる 読者になる

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

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

navMeshAgentで自動車を走らせる

Zombie Unity

 すんなりできるかと思ったらはまりました。
 navMeshAgentでspeed=20ぐらいにするとコーナーを曲がりきれません。
 今までみたいに遅いなら普通に曲がれます。
 AutoBrakingはありますがそれでも足りません。
 内部的にrigidbody使ってるんですかね?
 遠心力の影響を下げるならMass下げてみよう思ってもそもそもそういう値がないし。

 さてどうするか?
 navMeshと物理エンジンを同時に使うと競合するって記事も見たんで、試しにnavMeshAgentのspeedを0にして、自前で移動するようにしてみました。

 経路パスに沿って自力でLookAtして移動。
 navMeshにはゴールへのパスを見つけてもらうだけで、移動は自分でやればいいわけです。
f:id:yasu9780:20160927011538p:plain

f:id:yasu9780:20160927005653g:plain

 これなら直角コーナーも猛スピードで問題なく曲がれます。
 これって既出ですかね?

    void Start()
    {
        LR = GetComponent<LineRenderer>();
        LR.enabled = true;
        LR.SetWidth(0.3f, 0.3f);

        nowPoint = 0;// Random.Range(0, 4);
        agent = GetComponent<NavMeshAgent>();
        agent.radius = 0.3f;
        agent.speed = 0.0f;
        GotoNextPoint();
    }
    void Update()
    {
        if (agent.remainingDistance < 4f) GotoNextPoint();
        
        NavMeshPath path = agent.path; //経路パスを取得
        if (pt < path.corners.Length)
        {
            if (Vector3.Distance(transform.position, path.corners[pt]) < 2f)
            {
                pt++;
                if (pt >= path.corners.Length) GotoNextPoint();
            }
            transform.LookAt(path.corners[pt]);
            transform.position += transform.forward * Time.deltaTime * 30f;
        }
        LineRender();
    }
    void GotoNextPoint()
    {
        if (points.Length == 0) return;
        agent.destination = points[nowPoint].position;
        pt = 0;
        nowPoint++;
        if (nowPoint >= points.Length) nowPoint = 0; ;
    }
    void LineRender()
    {
        NavMeshPath path = agent.path; //経路パスを取得

        LR.SetVertexCount(path.corners.Length);
        for (int i = 0; i < path.corners.Length; i++)
        {
            Vector3 corner = path.corners[i] ;
            LR.SetPosition(i, corner+Vector3.up);
        }
    }

 このLineRenderって進撃の巨人立体機動装置に使えそうですね(*´ω`*)

広告を非表示にする