Siento que me estoy perdiendo una solución fácil aquí, pero estoy atascado en esto. Estoy calculando una puntuación basada en la distancia que viaja el jugador hasta que golpea un edificio al final del curso. La puntuación de destrucción es independiente de la puntuación de distancia, y se incrementa hasta que todas las piezas de construcción se hayan detenido.
Tengo una animación que quiero reproducir para agregar el puntaje de distancia al puntaje de destrucción total y dar el puntaje general del jugador, pero necesito que la animación se active una vez que el puntaje de destrucción haya dejado de aumentar. En este momento, cada pieza del edificio tiene un código que verifica si se está moviendo e incrementa el puntaje mientras es verdadero.
public class SkiLodgeScoreTracker : MonoBehaviour { Rigidbody rb; private GameObject[] score; private void Start() { rb = gameObject.GetComponent<Rigidbody>(); score = GameObject.FindGameObjectsWithTag("Score"); } private void Update() { //check if lodgePiece is moving, while it is, add to Score object if(rb.velocity.magnitude >= 2f && !rb.isKinematic) { score[0].GetComponent<SkiScore>().addToSkiScore(2f); } } }
Aquí es donde quiero que se active la animación una vez que la puntuación se haya detenido (este fue otro intento que hice, la lógica no funciona)
public Animator moveScore; ... if(skiScore > 0) { previousScore2 = previousScore1; previousScore1 = skiScore; if(previousScore1 == previousScore2 && !scoreMoved) { moveScore.SetTrigger("EndCourse"); addScoreToSkiScore(); } } public void addScoreToSkiScore() { scoreMoved = true; for(float i = score; i>0; i--) { skiScore += 1; } }
Quería tomar la puntuación en un cuadro y ver si es igual a la puntuación en el cuadro siguiente y, de ser así, activar la animación, pero siento que esa no es una opción válida.
¿Algunas ideas?
En SkiScore
, realice un seguimiento de cuántas piezas se están moviendo, y cuando una pieza se detenga y el conteo se convierta en 0, haga lo suyo:
public class SkiScore : MonoBehaviour { int movingCount; void Start() { ResetMovingCount(); /* ... */ } public void ResetMovingCount() {movingCount = 0;} // call as needed public void OnStartedMoving() {++movingCount;} public void OnStoppedMoving() { if (--movingCount == 0) OnNoneMoving(); } void OnNoneMoving() {/* do the thing */} /* ... */ }
Para cada pieza, use una bandera para recordar si se ha movido recientemente y si se ha movido y ya no se mueve, infórmele a su administrador de puntuación:
public class SkiLodgeScoreTracker : MonoBehaviour { Rigidbody rb; private GameObject[] score; // flag used to recognize newly stopped movement bool recentlyMoving; // cache for GetComponent SkiScore mySkiScore private void Start() { rb = gameObject.GetComponent<Rigidbody>(); score = GameObject.FindGameObjectsWithTag("Score"); // GetComponent is expensive, try not to call it in Update unless necessary mySkiScore = score[0].GetComponent<SkiScore>(); } private void Update() { //check if lodgePiece is moving, while it is, add to Score object if(rb.velocity.magnitude >= 2f && !rb.isKinematic) { mySkiScore.addToSkiScore(2f); recentlyMoving = true; mySkiScore.OnStartedMoving(); } else if (recentlyMoving) { recentlyMoving = false; mySkiScore.OnStoppedMoving(); } } }