我在Unity 2D项目中有一个航点系统,其中GameObject将按顺序跟随每个航点,然后重复该过程,我希望GameObject在每个点处停止固定的时间,我想我可以实现使用协程但不完全确定如何实现此目的,到目前为止,我所做的是创建一个名为WaitAtPoint的协程,然后在每个航路点运动上调用此协程,但无济于事,不确定我在做什么错。
public class BrainBoss : MonoBehaviour {
[SerializeField]
Transform[] waypoints;
[SerializeField]
float moveSpeed = 2f;
int waypointIndex = 0;
// Start is called before the first frame update
void Start()
{
transform.position = waypoints[waypointIndex].transform.position;
}
// Update is called once per frame
void Update()
{
Move();
}
void Move()
{
transform.position = Vector2.MoveTowards(transform.position,
waypoints[waypointIndex].transform.position, moveSpeed * Time.deltaTime);
if(transform.position == waypoints[waypointIndex].transform.position)
{
StartCoroutine(WaitAtPoint());
waypointIndex += 1;
}
if(waypointIndex == waypoints.Length)
{
waypointIndex = 1;
}
}
IEnumerator WaitAtPoint()
{
yield return new WaitForSeconds(3f);
}
}
答案 0 :(得分:2)
您可以使用simble bool标志来知道是否应该移动。在“移动(或更新)”中,检查该布尔值以了解是否应该移动。
在WaitAtPoint中,将bool(如shouldWait)设置为true,然后在WaitForSecond之后将其设置为false!
答案 1 :(得分:2)
好吧,您的WaitAtPoint
目前做得并不好。这是因为它正在IEnumerator中等待,而不是在您调用它的位置。
有多种方法可以解决此问题,但是我建议在您的IEnumerator上使用callback
,该时间将在等待时间之后执行。
赞:
private bool isWaiting;
void Update() {
if (!isWaiting) {
Move();
}
}
void Move()
{
transform.position = Vector2.MoveTowards(transform.position,
waypoints[waypointIndex].transform.position, moveSpeed * Time.deltaTime);
if(transform.position == waypoints[waypointIndex].transform.position)
{
StartCoroutine(WaitAtPoint(() =>
{
// All code that should be executed after waiting here.
waypointIndex += 1;
}));
}
if(waypointIndex == waypoints.Length)
{
waypointIndex = 1;
}
}
IEnumerator WaitAtPoint(Action callback)
{
isWaiting = true;
yield return new WaitForSeconds(3f);
callback.Invoke();
isWaiting = false;
}
答案 2 :(得分:2)
您正在调用Move每一次更新,您也可能多次调用StartCoroutine,所以我建议使用变量来查看您是否应该更新机芯
comparingByValue
}