2016-10-15 12 views
0

ユーザがボタンをクリックしたときに一定量だけオブジェクトを回転させるUnity 5 GameObjectにスクリプトが添付されています。ローテーションはコルーチンで実行され、時間の経過と共に円滑に実行されます。Unityコルーチンの予期せぬ制御フロー(完了検出中)

最初に完了するまで、同じオブジェクトの別の回転を実行しないようにユーザーをブロックします。これを行うために、コルーチンの開始時にtrueに設定されたisRotatingブール値を追加しました。コルーチンがローテーションを完了したときにfalseに設定されています。

using UnityEngine; 
using System.Collections; 

public class ObjectScript : MonoBehaviour { 

    private bool isRotating = false; 

    /* Rotate the object 90 degrees around the x axis centered on the origin */ 
    IEnumerator RotateObject() { 
     isRotating = true; 

     var updateRotation = 0.0f; // amount to rotate this tick 
     for (var totalRotation = 0.0f; totalRotation <= 90.0f; totalRotation += updateRotation) { 
      updateRotation = 90.0f * (Time.deltaTime/0.5f); 
      if (totalRotation + updateRotation > 90.0f) { 
       updateRotation = 90.0f - totalRotation; 
      } 
      transform.RotateAround (Vector3.zero, Vector3.right, updateRotation); 
      yield return null; 
     } 

     isRotating = false; // This line is never reached 
    } 

    void Update() { 
     if (Input.GetKeyDown(KeyCode.X) && !isRotating) { 
      StartCoroutine (RotateObject()); 
     } 
    } 
} 

私の問題は、isRotating = falseラインに到達されることはありませんということですコルーチンは、オブジェクトを回転させ終えた後でも、そうisRotatingtrueにセットしたままで、次のようにコードがあります。 (私は決してヒットしないライン上にデバッグブレークポイントを置くことでこれをチェックしました)。オブジェクトが一度回転すると、再び回転することはありません。

なぜコントロールがループ本体の外部の行に到達しないのですか?

+0

? –

+0

@CùĐứcHiếu申し訳ありませんが、カットアンドペーストのエラーだったので、私はリストを更新しました。 –

答えて

2

updateRotation = 90.0f - totalRotation;

=>totalRotation + updateRotation = 90

たびtotalRotation + updateRotation > 90.0fあなたはupdateRotationを再割り当てので、次の繰り返しtotalRotation + updateRotation = 90

=>totalRotation <= 90.0fは、私は、エラーを発見したfalse

1

ことはありません。

メインループRotateObjectの中で、私は条件totalRotation <= 90.0fをチェックしています。私はupdateRotationに追加することにより、ループ変数totalRotation各パスを更新するので

if (totalRotation + updateRotation > 90.0f) { 
    updateRotation = 90.0f - totalRotation; 
} 

これが過回転を防止するためにうまく動作しますが、:しかし、私は確認するために、ループの中にコードを追加していた私はoverrotateませんでした。

for (...; ...; totalRotation += updateRotation) { 

totalRotation

は本質的だった「クランプ」、および90.0fを超えて取得することはありません - ので、ループが終了したことがありません。

ので、修正は同じように、<いうより<=であることが条件私のループを変更することです:

`isMoveInProgress`から来たの
for (var totalRotation = 0.0f; totalRotation < 90.0f; totalRotation += updateRotation) { 
関連する問題