C# 脚本旋转对象的次数超过我的需要

C# 脚本旋转对象的次数超过我的需要,c#,unity3d,C#,Unity3d,我有一个播放器,我使用下面的脚本旋转它。它将播放器旋转20度,而不是10度(我需要10度)。我不明白为什么。当我按下q时,它只执行1次 private UnityStandardAssets.Characters.FirstPerson.FirstPersonController FirstPersonController; 公共游戏对象玩家; 无效开始() { firstPersonController=player.GetComponent(); } 无效更新() { 开始例行程序(“

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

private UnityStandardAssets.Characters.FirstPerson.FirstPersonController FirstPersonController;
公共游戏对象玩家;
无效开始()
{ 
firstPersonController=player.GetComponent();
}
无效更新()
{
开始例行程序(“RotatePlayerDelay”);
}
IEnumerator RotatePlayerDelay()
{
Debug.Log(“1”);
firstPersonController.m_MouseLook.myAngle+=10;//这里我有+20,而不是+10
收益率返回新WaitForSeconds(0.005f);
firstPersonController.m_MouseLook.myAngle=0;
Debug.Log(“2”);
}

另外,我需要协同程序,因为没有它,它将永远旋转

而不像
FixedUpdate
时间调用一次。fixeddeltime
秒,对于
更新
方法没有精确的时间步长。这是一个协同过程,它依赖于游戏的FPS和所有渲染器和行为的持续时间,因此动态变化

您可以将
Update
视为:

void Start ()
{
    StartCoroutine(_update);        
}
IEnumerator _update()
{
    while(true)
    {
         Update();
         yield return null;             
    }
}
Update
方法中启动协同程序时,您无法判断前一帧是否已结束。如果您的FPS低于
1/0.005=200.0 FPS
,那么协程的不同调用肯定会相互重叠

这里的0.005是指收益率返回新的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);
    }
}

如果不知道FirstPersonController类和MouseLook类,就很难给出答案。我也很确定你不需要一个协同程序,而是像“isAiming”或“isFacingTarget”这样的布尔值。顺便说一句:协同程序是在每一个看起来不理想的帧开始的。
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);
    }
}