我做了一个代码,允许汽车行驶到定义的航点,如果它到达那里,它会自动驱动到下一个。以下代码:
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能帮忙吗?谢谢
我试过其他方法来移动汽车,但没有任何效果
1条答案
按热度按时间laawzig21#
像往常一样,放置调试器,看看你的代码实际上是如何工作的!
不过在这个示例中,由于每个IEnumerator都放在一个 while(true) 中,因此它不会停止,最终会同时运行 * 所有 * IEnumerator。
在排序中,只包含一个break;每次启动新的协程后,应该执行类似下面的操作