badGuyのゲームオブジェクトを右に移動させるコルーチンと左に移動するコルーチンを作成しました(下のコードを参照してください)。条件が偽であるときにコルーチンから別のコルーチンに変更する方法
IEnumerator moveBadGuyLeft (Transform fromPosition, Vector3 toPosition, float duration, int newIndex) {
while (emptyPos.Contains(badGuyPos[newIndex])) { //how to switch to moveBadGuyRight when this condition is false
emptyPos.Add(badGuyPos[newIndex + 1]);
filledPos.Remove(badGuyPos[newIndex + 1]);
float counter = 0;
Vector3 startPos = fromPosition.position;
while (counter < duration)
{
counter += Time.deltaTime;
fromPosition.position = Vector3.Lerp(startPos, toPosition, counter/duration);
yield return null;
}
emptyPos.Remove(badGuyPos[newIndex]);
filledPos.Add(badGuyPos[newIndex]);
if (newIndex > 0) {
newIndex--;
}
startPos = toPosition;
toPosition = new Vector3 (badGuyPos[newIndex], startPos.y, startPos.z);
int waitInterval = Random.Range(3, 5);
yield return new WaitForSeconds(waitInterval);
}
}
IEnumerator moveBadGuyRight (Transform fromPosition, Vector3 toPosition, float duration, int newIndex) {
while (emptyPos.Contains(badGuyPos[newIndex])) { //how to switch to moveBadGuyLeft when this condition is false
emptyPos.Add(badGuyPos[newIndex - 1]);
filledPos.Remove(badGuyPos[newIndex - 1]);
float counter = 0;
Vector3 startPos = fromPosition.position;
while (counter < duration)
{
counter += Time.deltaTime;
fromPosition.position = Vector3.Lerp(startPos, toPosition, counter/duration);
yield return null;
}
emptyPos.Remove(badGuyPos[newIndex]);
filledPos.Add(badGuyPos[newIndex]);
if (newIndex > 0) {
newIndex++;
}
startPos = toPosition;
toPosition = new Vector3 (badGuyPos[newIndex], startPos.y, startPos.z);
int waitInterval = Random.Range(3, 5);
yield return new WaitForSeconds(waitInterval);
}
}
私は、彼らはその後、彼らは左と右の間でトグル、そうで満たされた位置を満たすために、右までそれらを移動満たされた位置を満たすまで、私のBadGuyのオブジェクトが左に移動しようとしています。私は私の条件
while (emptyPos.Contains(badGuyPos[newIndex]))
がfalseの場合、私は1つのコルーチンから他へ、またはその逆に変更する必要があることを知っています。どのように私はコルーチン間でこの変更を実装できますか?私は下のStartメソッドでコルーチン呼び出していますかを確認してください:
for (int i = 0; i < badGuys.Count; i++) {
if (badGuys [i].getBlockType() == BadGuySetup.BadGuyType.moving) {
int indexInBadGuyPos = badGuyPos.IndexOf(badGuys[i].getBadGuyGameObject().transform.position.x);
Vector3 targetPos = new Vector3(badGuyPos[indexInBadGuyPos - 1], badGuys[i]. getBadGuyGameObject().transform.position.y, 0.0f);
StartCoroutine(moveBadGuyLeft(badGuys [i]. getBadGuyGameObject().transform, targetPos, 1.0f, indexInBadGuyPos - 1));
}
}
UPDATE
を私はmoveBadGuyLeft
とmoveBadGuyRight
にif (newIndex) > 0
条件に次を追加しました:moveBadGuyLeft
で
:
if (newIndex > 0) {
newIndex--;
if (!emptyPos.Contains(badGuyPos[newIndex])) {
isMovingLeft = false;
badGuyDestPos = new Vector3(badGuyPos[newIndex + 2], startPos.y, startPos.z);
badGuyNewIndex = newIndex + 2;
break;
}
}
のmoveBadGuyRight
:
if (newIndex > 0) {
newIndex++;
if (!emptyPos.Contains(badGuyPos[newIndex])) {
isMovingLeft = false;
badGuyDestPos = new Vector3(badGuyPos[newIndex - 2], startPos.y, startPos.z);
badGuyNewIndex = newIndex - 2;
break;
}
}
は、その後私は2つのコルーチンの間で変更することが想定されている別のコルーチンを作成しました:
for (int i = 0; i < badGuys.Count; i++) {
if (badGuys [i].getBlockType() == BadGuySetup.BadGuyType.moving) {
int indexInBadGuyPos = badGuyPos.IndexOf(badGuys[i].getBadGuyGameObject().transform.position.x);
Vector3 targetPos = new Vector3(badGuyPos[indexInBadGuyPos - 1], badGuys[i]. getBadGuyGameObject().transform.position.y, 0.0f);
badGuyDestPos = targetPos;
badGuyMoveDuration = 1.0f;
badGuyNewIndex = indexInBadGuyPos - 1;
StartCoroutine(movingBadGuys(badGuys [i]. getBadGuyGameObject().transform, badGuyDestPos, badGuyMoveDuration, badGuyNewIndex));
}
}
しかし、これを:
IEnumerator movingBadGuys(Transform fromPosition, Vector3 toPosition, float duration, int newIndex) {
if(isMovingLeft){
yield return StartCoroutine (moveBadGuyLeft(fromPosition, toPosition, duration, newIndex));
}
else if(!isMovingLeft){
yield return StartCoroutine (moveBadGuyRight(fromPosition, toPosition, duration, newIndex));
}
}
最後に、私はbadguysをループし、それらを動かす更新します変更は機能していません。私は常に2つのbadGuysだけでテストしています。悪いGuysは常に左に移動し始め、左に1回移動して残りの空きポジションが残っていますが、左に移動します。