Changing transform position - from instantaneous to smooth - not sure how.
I am trying to make a simple snakes and ladders game, and this question is about moving the game piece/counter. I have a basic script that will give a new position to the counter after a dice is rolled, using a for loop to add the dice number. A nested if statement defines what direction it moves and additional conditions. Basic movement works fine but it is carried out in a single frame (instantaneous). Code here:
void Update () {
for (int n = counterPosition; n <= newCounterPosition; ++n) {
if (n == newCounterPosition) {
CheckLadder ();
CheckSnake ();
return;
} else if (n > 99) {
isWinner = true;
return;
} else if (n % 10 == 0) {
counterTransform.position += Vector3.forward;
++counterPosition;
} else if (n > 10 && n < 20 || n > 30 && n < 40 || n > 50 && n < 60 || n > 70 && n < 80 || n > 90 && n < 100) {
counterTransform.position += Vector3.left;
++counterPosition;
} else {
counterTransform.position += Vector3.right;
++counterPosition;
}
}
}
//function called from UI button gives dice roll
public void AddDice(int amount) {
newCounterPosition = counterPosition + amount;
Debug.Log ("Counter position changed.");
}
However, I would like for the piece to move slowly, so across multiple frames. I am not sure of the most suitable method for this. Thus far, I have tried to use a Coroutine with Vector3.movetowards and putting this in a while loop to 'in theory' repeat until it reaches the target destination, then yield back to the for loop in Update(). Example code:
void Update () {
for (int n = counterPosition; n <= newCounterPosition; ++n) {
if (n == newCounterPosition) {
//CheckLadder ();
//CheckSnake ();
return;
} else if (n > 99) {
isWinner = true;
return;
} else if (n % 10 == 0) {
StartCoroutine("CounterUp");
++counterPosition;
} else if (n > 10 && n < 20 || n > 30 && n < 40 || n > 50 && n < 60 || n > 70 && n < 80 || n > 90 && n < 100) {
StartCoroutine("CounterLeft");
++counterPosition;
} else {
StartCoroutine("CounterRight");
++counterPosition;
}
}
}
IEnumerator CounterUp() {
startPosition = counterTransform.position;
endPosition = counterTransform.position + Vector3.forward;
while (startPosition != endPosition) {
counterTransform.position = Vector3.MoveTowards (startPosition, endPosition, speed);
yield return null;
}
}
From what I can understand (probably incorrectly) it exits the while loop after one iteration. However, if I move the yield return null; outside the while loop unity will 'freeze', in which I assume it is stuck in the loop or its just incorrect syntax?
Is there a simpler solution to this? My understanding of 'frames' and 'coroutines' is far from desired (trying to learn by doing!). Any help would be appreciated. Thanks.