遇到WaitForSeconds问题

时间:2015-08-26 12:28:32

标签: unity3d unity3d-2dtools

所以我试图为一个"追随者"制作剧本。这将开始跟随玩家与它发生碰撞。问题是我希望跟随者在每次玩家停止之后等待一段时间然后再向玩家移动。

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

 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;
} 

我真的很感激它的一些帮助。

2 个答案:

答案 0 :(得分:1)

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);
     }
 }

答案 1 :(得分:0)

在您的代码中,您没有正确使用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());
    }
}

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