unity3d 为什么车会传送到我的停靠点

xdnvmnnf  于 2023-03-13  发布在  其他
关注(0)|答案(1)|浏览(116)

我做了一个代码,允许汽车行驶到定义的航点,如果它到达那里,它会自动驱动到下一个。以下代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class AICar : MonoBehaviour
{

    public Transform Player;
    public Transform Player2;
    public Transform Player3;
    public Transform Player4;
    public Transform Player5;
    public Transform Player6;
    public int MoveSpeed = 5;
    int MaxDist = 10;
    int MinDist = 5;



    void Start()
  {
      StartCoroutine(SparseUpdate());
  }

  IEnumerator SparseUpdate()
  {
      yield return new WaitForSeconds(0);
      while(true)
      {
          yield return null;

          transform.LookAt(Player);
          if (Vector3.Distance(transform.position, Player.position) >= MinDist)
          {
              transform.position += transform.forward * MoveSpeed * Time.deltaTime;
              Debug.Log(MoveSpeed);
              if (Vector3.Distance(transform.position, Player.position) <= MaxDist)
              {
                  StartCoroutine(SparseUpdateSecond());
              }
          // Do all the normal things you'd do in Update here instead.
      }
   }
 }
    IEnumerator SparseUpdateSecond()
    {
        yield return new WaitForSeconds(0);
        while(true)
        {
            yield return null;

            transform.LookAt(Player2);
            if (Vector3.Distance(transform.position, Player2.position) >= MinDist)
            {
                transform.position += transform.forward *  * Time.deltaTime;
                Debug.Log(MoveSpeed);
                if (Vector3.Distance(transform.position, Player.position) <= MaxDist)
                {
                  StartCoroutine(SparseUpdateThird());
                }
            // Do all the normal things you'd do in Update here instead.
        }
       }
    }

    IEnumerator SparseUpdateThird()
    {
        yield return new WaitForSeconds(0);
        while(true)
        {
            yield return null;

            transform.LookAt(Player3);
            if (Vector3.Distance(transform.position, Player3.position) >= MinDist)
            {
                transform.position += transform.forward * MoveSpeed * Time.deltaTime;
                if (Vector3.Distance(transform.position, Player3.position) <= MaxDist)
                {
                  StartCoroutine(SparseUpdateFourth());
                }
            // Do all the normal things you'd do in Update here instead.
        }
       }
    }

    IEnumerator SparseUpdateFourth()
    {
        yield return new WaitForSeconds(0);
        while(true)
        {
            yield return null;

            transform.LookAt(Player4);
            if (Vector3.Distance(transform.position, Player4.position) >= MinDist)
            {
                transform.position += transform.forward * MoveSpeed * Time.deltaTime;
                if (Vector3.Distance(transform.position, Player4.position) <= MaxDist)
                {
                  StartCoroutine(SparseUpdateFifht());

                }
            // Do all the normal things you'd do in Update here instead.
        }
       }
    }

    IEnumerator SparseUpdateFifht()
    {
        yield return new WaitForSeconds(0);
        while(true)
        {
            yield return null;

            transform.LookAt(Player5);
            if (Vector3.Distance(transform.position, Player5.position) >= MinDist)
            {
                transform.position += transform.forward * MoveSpeed * Time.deltaTime;
                if (Vector3.Distance(transform.position, Player5.position) <= MaxDist)
                {
                  StartCoroutine(SparseUpdateSixt());

                }
            // Do all the normal things you'd do in Update here instead.
        }
       }
    }

        IEnumerator SparseUpdateSixt()
        {
            yield return new WaitForSeconds(0);
            while(true)
            {
                yield return null;

                transform.LookAt(Player6);
                if (Vector3.Distance(transform.position, Player6.position) >= MinDist)
                {
                    transform.position += transform.forward * MoveSpeed * Time.deltaTime;
                    if (Vector3.Distance(transform.position, Player6.position) <= MaxDist)
                    {

                    }
                // Do all the normal things you'd do in Update here instead.
            }
           }
        }



  }

它开得很慢到第一个,这是对的,但对其他人来说它非常快,我不知道为什么?anbyody能帮忙吗?谢谢
我试过其他方法来移动汽车,但没有任何效果

laawzig2

laawzig21#

像往常一样,放置调试器,看看你的代码实际上是如何工作的!
不过在这个示例中,由于每个IEnumerator都放在一个 while(true) 中,因此它不会停止,最终会同时运行 * 所有 * IEnumerator。
在排序中,只包含一个break;每次启动新的协程后,应该执行类似下面的操作

if (Vector3.Distance(transform.position, Player3.position) >= MinDist)
        {
            transform.position += transform.forward * MoveSpeed * Time.deltaTime;
            if (Vector3.Distance(transform.position, Player3.position) <= MaxDist)
            {
              StartCoroutine(SparseUpdateFourth());
              break;
            }
        // Do all the normal things you'd do in Update here instead.

相关问题