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