WaitForSeconds 有问题

Having problems with WaitForSeconds

所以我正在尝试为 "follower" 制作一个脚本,它将开始跟随玩家与它发生碰撞。问题是我希望跟随者在每次玩家停止后向玩家移动之前等待给定的时间。

它在玩家与它碰撞时起作用,它在给定时间后向玩家移动,但当玩家停止并再次移动时,跟随者会粘住玩家而不是等到给定时间结束。这是脚本:

 void Update () {
     //running is a triggered true on colliding with player.
     if(running == true){
         StopCoroutine(Move());
         StartCoroutine(Move());
     }
 }
 IEnumerator Move(){
     yield return new WaitForSeconds (0.5f);
     Vector2 pos = transform.position;
     Vector2 playerpos = player.transform.position;
     playerpos.y = pos.y;
     transform.position = Vector2.MoveTowards(pos, playerpos, 1f * Time.deltaTime);
 }

我做错了什么吗?

还有一个问题,跟随者的移动速度比给定的速度快。

玩家移动功能。

void Move(float horizontalinput){
    Vector3 pos = transform.position;
    pos.x += horizontalinput * maxSpeed * Time.deltaTime;
    transform.position = pos;
} 

非常感谢您的帮助。

StopCoroutine(Move()); 正在停止协程的一个新实例,而不是当前 运行。

要么:

StopCoroutine("Move");
StartCoroutine("Move");

或者这个:

private IEnumerator coroutine;

 void Update () {
     //running is a triggered true on colliding with player.
     if(running == true){
         StopCoroutine(coroutine);

         if(coroutine != null)
             coroutine = Move();

         StartCoroutine(coroutine);
     }
 }

你可以试试:

创建一个名为 _canMove 的变量并将其设置为 false。那么您的 Update 将是:

private void Update()
{
    if(_canMove)
    {
        Move();
    }
}

您的 Move 方法将与当前方法相同,但减去了 WaitForSeconds 行。然后,当播放器停止 运行 时,以下行将阻止 Update 方法调用 Move 方法:

_canMove = false

当玩家再次开始移动时运行以下:

StartCoroutine(ResetCanMove);

这将调用 ResetCanMove,它将在将 _canMove 设置为 true 之前等待 x 秒,然后将导致 Update 开始调用 Move再次.

这是ResetCanMove方法

private IEnumerator ResetCanMove()
{
    yield return new WaitForSeconds(0.5f);
    _canMove = true;
}

在您的代码中,您没有正确使用 StopCoroutine..

你可以这样做:

private Coroutine myCoroutine;

void Update () 
{
    //running is a triggered true on colliding with player.
    if(running == true)
    {
        if(myCoroutine != null)
        {
           StopCoroutine(myCoroutine); 
        } 

        myCoroutine = StartCoroutine(Move());
    }
}

另一种选择是使用带有元素名称的启动和停止协程,但您将使用反射,这会影响游戏的性能。