2016-09-11 4 views
0

私はポイントaとbの間の接触時に "ランプ"を生成するスクリプトを実行しようとしています。このコードはランプの要素がどこにあるべきかのリストを受け取り、その後それらをinstanciatesし、画面上に配置します。コルーチンのみ一度だけ発射

しかし、コルーチンは一度しか実行されていないため、なぜ私は理解できません。誰か助けてくれますか?この機能は、それがRampオブジェクトのリストとして他のコードによって処理されなければならないのIEnumerableあるので

は事前に非常に

public IEnumerator CreateRamp(List<Vector3> lP, float angle) 
{ 

    int i = 1; 
    while (i <= lP.Count) 
    { 
     Debug.Log("Iteration " + i + " of " + lP.Count + " position is " + lP[i]); 
     GameObject item = Instantiate(Resources.Load("floor")) as GameObject; 


     item.transform.position = current_Position; 
     item.transform.eulerAngles = new Vector3(0, 0, UnityEngine.Random.Range(0f, 360f)); 

     item.GetComponent<Ramp>().strtPos = item.transform.position; 
     item.GetComponent<Ramp>().strtRot = item.transform.eulerAngles; 
     item.GetComponent<Ramp>().strtScale = new Vector3(0.4f, 0.4f, 1); 

     item.GetComponent<Ramp>().tgtRot = new Vector3(0, 0, angle); 
     item.GetComponent<Ramp>().tgtPos = lP[i-1]; 
     i += 1; 
     yield return new WaitForSeconds(0.2f); 
    } 
} 
+0

したがって、 'lP.Count'の返却は何ですか? –

+0

あなたの問題に関係はありませんが、 '.GetComponent ()'をループごとに1回呼び出して結果をローカル変数に保存し、5回の呼び出しでその変数を使用する必要があります。 –

+0

StartCoroutineを使用してこのメ​​ソッドを実行していますか?あなたはそれを通常のメソッド:CreateRamp(...)として呼び出すと、一度だけ実行されます。 –

答えて

1

あなたの状態はi <= lP.Countであると思われます。 (たぶんlP.Count == 1、私は思う)。

コルーチンの仕組みは、CreateRamp機能のコードが複数のフレームにわたって実行されることです。

StartCoroutine(CreateRamp(...))とすると、yield文に達するまですぐに実行されます。それは0.2秒間そこで待機し、収量の直後のステートメントから再び実行されます。

2回目の実行では、条件i <= lP.Countが再び評価され、False =>ループから飛び出し、関数の終わりに達するため、そのコルーチンは停止し、実行されなくなります将来は。

+0

問題は、Debug.Log行を使用して、lP.Countが2より小さいかどうかをテストしています。結果は広範囲(通常は1〜24)です。コードは常に実行されます一度。 –

+0

ループの中でlP.Countが異なるのですか?同じリストを操作する1つ以上のコルーチンを実行していることを意味します、そうですか?そうであれば、他の共同作業のコードを投稿してください。 –

+0

ああ、多分あなたはすでに知っている、リストは参照型です。これは、そのコンテンツ(Add、Remove、Update要素)の変更がCreateRamp(..)にも反映されることを意味します。 –

-1

、ありがとうございました。私は(あなたのコードを知るには十分ではない)、あなたがこの関数を呼び出す方法が間違っていると思われます。

あなたの歩留まりがwaitforXを返すと、この関数の外で待機するか(そこから呼び出す場所)、または少なくとも待ち時間を追加するか関数のパラメータとして使用します。そのようなハードコーディングされた値は、あなたのゲームのコードベースが成長すると、後であなたを噛んでしまうでしょう。 GameObjectの設定として公開することをお勧めします。そのため、エディタから調整することができます。

もう1つのこと、これらのランプオブジェクトをどのように破壊するのですか?後でそれらを破壊することができるように、作成時に参照を格納することを検討するとよいでしょう。

+0

お返事ありがとうございます。あなたのサイドノートについては、関数の引数に待ち時間を入れて、すべてをインスタンス化して破壊するのではなくGameObjectプールを使用します。これはテストのためです。 –

+0

私はそれをどのように呼び出すのですか?私は単純に、touch3の中からStartCoroutineメソッドを使用して、これを行うための引数としてvector3のリストと目的の角度を使用しています。 –

+0

このコードは、問題が発生している場所である可能性が最も高いので、参照すると便利です。 – meganaut