脚本旋转对象超出我的需要

时间:2016-12-15 07:56:44

标签: c# unity3d

我有一个播放器,我使用下面的脚本旋转。它将玩家旋转20度,而不是10度(我需要10个)。无法理解为什么。当我按q时,它只执行一次。

enter image description here

enter image description here

private UnityStandardAssets.Characters.FirstPerson.FirstPersonController firstPersonController;
public GameObject player;

void Start ()
{ 
    firstPersonController = player.GetComponent<UnityStandardAssets.Characters.FirstPerson.FirstPersonController>();
}

void Update ()
{
    StartCoroutine("RotatePlayerDelay");        
}

IEnumerator RotatePlayerDelay()
{
    Debug.Log("1");
    firstPersonController.m_MouseLook.myAngle += 10; // here I have +20, not +10
    yield return new WaitForSeconds(0.005f);
    firstPersonController.m_MouseLook.myAngle = 0;
    Debug.Log("2");
}

P.S。我需要协同程序,因为如果没有它,它将永远旋转

1 个答案:

答案 0 :(得分:3)

与每FixedUpdate秒调用一次的Time.fixedDeltaTime不同,Update方法没有确切的时间步长。它是一个协同程序,它取决于游戏的FPS和所有渲染器和行为的持续时间,从而动态变化。

您可以将Update视为:

void Start ()
{
    StartCoroutine(_update);        
}
IEnumerator _update()
{
    while(true)
    {
         Update();
         yield return null;             
    }
}

当您使用Update方法启动协程时,您无法判断前一帧是否已结束。如果您的FPS低于1/0.005 = 200.0 FPS,那么协程的不同调用肯定会相互重叠。

0.005这里指的是yield return new WaitForSeconds(0.005f)

尝试不要在另一个协程中启动协同程序:

void Start ()
{
    StartCoroutine("RotatePlayerDelay");        
}

IEnumerator RotatePlayerDelay()
{
    while(true)
    {
        Debug.Log("1");
        firstPersonController.m_MouseLook.myAngle += 10; // here I have +20, not +10
        yield return new WaitForSeconds(0.005f);
        firstPersonController.m_MouseLook.myAngle = 0;
        Debug.Log("2");
        yield return new WaitForSeconds(0.005f);
    }
}