在C#中使用Wait(Unity)

时间:2018-02-17 06:38:49

标签: c# unity3d unity3d-2dtools

我有这段代码:

void Update ()
    {
        // If the fire button is pressed...
        if(Input.GetKey(KeyCode.Z))
        {


                // ... resetEvent.Wait(timeout)set the animator Shoot trigger parameter and play the audioclip.
                anim.SetTrigger("Shoot");
                GetComponent<AudioSource>().Play();



            // If the player is facing right...
            if (playerCtrl.facingRight)
            {
                // ... instantiate the rocket facing right and set it's velocity to the right. 
                Rigidbody2D bulletInstance = Instantiate(rocket, transform.position, Quaternion.Euler(new Vector3(0,0,0))) as Rigidbody2D;
                bulletInstance.velocity = new Vector2(speed, 0);


            }
            else
            {
                // Otherwise instantiate the rocket facing left and set it's velocity to the left.

//RIGHT HERE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                Rigidbody2D bulletInstance = Instantiate(rocket, transform.position, Quaternion.Euler(new Vector3(0,0,180f))) as Rigidbody2D;
                bulletInstance.velocity = new Vector2(-speed, 0);

            }
        }
    }

在哪里说“在这里”,我希望动作暂停1秒钟。我不能Thread.Sleep,因为这会暂停整个游戏,我只是想让它等待。

2 个答案:

答案 0 :(得分:0)

发生的事情是你正在睡觉主线程而不是实际让主线程等待它完成睡眠。这就是为什么在主线程中运行的所有代码执行都被停止的原因,因此游戏冻结了你。所以你能做的是:

yield return new WaitForSeconds(1);

请注意,与Thread.Sleep相比,WaitForSeconds接受它们的值为浮动而不是毫秒。因此,如果你需要1.25秒的睡眠时间,你可以传递给它1.25f。

答案 1 :(得分:0)

这是一个问题,我确信我们都面临过多次。

我尝试了很多不同的东西,比如线程睡眠和协同程序,但这是我最好的解决方案:

只需简单地输入一个计时器:每个Update()调用通过Time.deltaTime增加的变量。然后在更新中等待之后,只需要执行您想要执行的任何逻辑,并检查是否已经过了足够的时间。

这有意义吗?