2016-12-15 3 views
2

私は以下のスクリプトを使って回転するプレーヤーを持っています。それは10でなく、20度でプレイヤーを回転させます(そして私は10が必要です)。理由を理解できません。 qを押すと、1回だけ実行されます。スクリプトは必要以上にオブジェクトを回転させます

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

それは答えを与えるためにやや難しいですFirstPersonControllerクラスやMouseLookクラスを知らなくても。私はあなたがそのためにコルーチンを必要としないと確信していますが、むしろ "isAiming"や "isFacingTarget"のようなブール値です。ところで、コルーチンは、望ましくないようなフレームごとに開始されます。 – Wipster

答えて

3

とは異なり、Time.fixedDeltaTime秒ごとに1回呼び出されます。Updateメソッドの正確な時間ステップはありません。ゲームのFPSとすべてのレンダラとビヘイビアの継続時間に依存し、したがって動的に変化するコルーチンです。あなたはUpdateとしての

を考えることができます:あなたはUpdate方法であなたのコルーチンを起動すると、前のフレームが終了したかしていないかどうかを言うことができない

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

。あなたの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); 
    } 
} 
関連する問題