我有一个播放器,我使用下面的脚本旋转。它将玩家旋转20度,而不是10度(我需要10个)。无法理解为什么。当我按q
时,它只执行一次。
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。我需要协同程序,因为如果没有它,它将永远旋转
答案 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);
}
}