ゲームオブジェクトを使ったクイックソートのビジュアライゼーションを作りたいと思います。問題は、メソッドをクイックソートメソッドの中に入れると、アニメーションが終了するのを待たずに済むことです。コードはすべての行を同時に実行します。Unityでコードの次の行に移動する前に、メソッドが終了するのを待つ方法はありますか?
私はメソッドを最初に実行し、次の行に進めたいと思っています。私はすでにIEnumerator関数を試しましたが、yield return StartCoroutine (myfunction())
を使用するとシーケンスが再配置されます。クイックソートは再帰的な順序で行われます。最初はアニメーションは機能しますが、再帰が発生したときには、利回りリターンはもう機能しません。
IEnumerator swapElement(int e1, int e2)
{
swap = true;<br>
go1 = GameObject.Find ("Element" + e1);<br>
go2 = GameObject.Find ("Element" + e2);
go1xpos = go1.GetComponent<Transform>().transform.position.x;
go2xpos = go2.GetComponent<Transform>().transform.position.x;
go1ypos = go1.GetComponent<Transform>().transform.position.y;
x1ps = go1xpos;
x2ps = go2xpos;
go1.GetComponent<Transform>().transform.position = new Vector3 (x2ps, go1ypos);
go2.GetComponent<Transform>().transform.position = new Vector3 (x1ps, go1ypos);
yield return new WaitForSeconds (5);
Debug.Log ("INSIDE SWAP : LEFT : " + e1 + " RIGHT : " + e2);
}
ソート方法:
int l, r;
int partition(int[] numbers, int left, int right)
{
int pivot = numbers [ (left + right)/2];
while (true)
{
while (numbers [left] < pivot) left++;
while (numbers [right] > pivot) right--;
if (left < right)
{
int temp = numbers [right];
numbers [right] = numbers [left];
numbers [left] = temp;
//Debug.Log ("LEFT : " + left + " RIGHT : " + right);
swapElement (left, right);
}
else
{
return right;
}
}
}
void quickSort(int[] arr, int left, int right)
{
if (left < right)
{
int piv = partition (arr, left, right);
if (piv > 1) quickSort (arr, left, piv - 1);
if (piv + 1 < right) quickSort (arr, piv + 1, right);
}
}
は、私はすでにstartcoroutine(swap (left, right))
を試してみましたが、運
はここに私のC#のコードです。
私はスワップメソッド内にアニメーションを置くことができますが、それでもそれでも同じです。これは同時に実行されます。
追加情報:
IEnumeratorを使用すると、再帰が機能しません。 voidであれば動作しますが、voidメソッドはアニメーションメソッドが終了するのを待っていません。それは同時に実行されます。
返信いただきありがとうございます。まずそれを試してみてください。後にフィードを悪く送ってください。 – mjavier
彼らはまだ同じ時間に移動しています。私のアニメーションコードが質問に含まれています – mjavier
WaitForSecondsをパーティション呼び出しの直後に移動するとどうなりますか?スムーズにアニメートするとは思っていませんが、予想通りのスワップは少なくとも行いますか? –