Juega y espera a que Animation / Animator termine de jugar

En mi guión lo hice cuando el jugador está en la parte superior de la plataforma, muévelo hacia arriba. Está funcionando bien. Pero ahora quiero hacer que una vez que se puso en marcha, toque el clip “Abajo”.

using UnityEngine; using System.Collections; using System.Reflection; public class DetectPlayer : MonoBehaviour { GameObject target; public void ClearLog() { var assembly = Assembly.GetAssembly(typeof(UnityEditor.ActiveEditorTracker)); var type = assembly.GetType("UnityEditorInternal.LogEntries"); var method = type.GetMethod("Clear"); method.Invoke(new object(), null); } void OnCollisionEnter(Collision collision) { if (collision.gameObject.name == "Platform") { Debug.Log("Touching Platform"); } } void OnTriggerEnter(Collider other) { if (other.gameObject.name == "OnTop Detector") { Debug.Log("On Top of Platform"); GameObject findGo = GameObject.Find("ThirdPersonController"); GameObject findGo1 = GameObject.Find("Elevator"); findGo.transform.parent = findGo1.transform; target = GameObject.Find("Elevator"); target.GetComponent().Play("Up"); } } } 

Después de la línea

 target.GetComponent().Play("Up"); 

Quiero cuando termine de jugar, toque el plumón:

 target.GetComponent().Play("Down"); 

Si bien ambas respuestas deberían funcionar, otro método de hacerlo con coroutine y la función IsPlaying . Utiliza la solución coroutine si también desea realizar otra tarea después de la animación.

Para el sistema de Animation :

El antiguo sistema de reproducción de animación Unity. Esto no debe usarse en su nuevo Proyecto a menos que todavía esté usando la versión anterior de Unity.

 IEnumerator playAndWaitForAnim(GameObject target, string clipName) { Animation anim = target.GetComponent(); anim.Play(clipName); //Wait until Animation is done Playing while (anim.IsPlaying(clipName)) { yield return null; } //Done playing. Do something below! Debug.Log("Done Playing"); } 

Para el sistema Animator

Este es el nuevo sistema de reproducción de animación de Unity. Esto debe usarse en su nuevo proyecto en lugar de la API de Animation .

 IEnumerator playAndWaitForAnim(GameObject target, string stateName) { int animLayer = 0; Animator anim = target.GetComponent(); anim.Play(stateName); //Wait until Animator is done playing while (anim.GetCurrentAnimatorStateInfo(animLayer).IsName(stateName) && anim.GetCurrentAnimatorStateInfo(animLayer).normalizedTime < 1.0f) { //Wait every frame until animation has finished yield return null; } //Done playing. Do something below! Debug.Log("Done Playing"); } 


Para una solución especialmente para este problema concreto con la función de callback de colisión ( OnTriggerEnter ), hay dos formas posibles de hacerlo:

1. Inicie una función de corrutina para reproducir la animación después de la detección del disparador:

 void OnTriggerEnter(Collider other) { if (other.gameObject.name == "OnTop Detector") { Debug.Log("On Top of Platform"); GameObject findGo = GameObject.Find("ThirdPersonController"); GameObject findGo1 = GameObject.Find("Elevator"); findGo.transform.parent = findGo1.transform; target = GameObject.Find("Elevator"); StartCoroutine(playAnim(target)); } } IEnumerator playAnim(GameObject target) { Animation anim = target.GetComponent(); anim.Play("Up"); //Wait until Up is done Playing the play down while (anim.IsPlaying("Up")) { yield return null; } //Now Play Down anim.Play("Down"); } 

O

2. OnTriggerEnter función OnTriggerEnter una corrutina (IEnumerator) en lugar de la función void :

 IEnumerator OnTriggerEnter(Collider other) { if (other.gameObject.name == "OnTop Detector") { Debug.Log("On Top of Platform"); GameObject findGo = GameObject.Find("ThirdPersonController"); GameObject findGo1 = GameObject.Find("Elevator"); findGo.transform.parent = findGo1.transform; target = GameObject.Find("Elevator"); Animation anim = target.GetComponent(); anim.Play("Up"); //Wait until Up is done Playing the play down while (anim.IsPlaying("Up")) { yield return null; } //Now Play Down anim.Play("Down"); } } 

Una forma de hacerlo sin tener que verificar manualmente es usar colas

 target.GetComponent().PlayQueued("Down", QueueMode.CompleteOthers); 

Este código esperará a que finalice cualquier otra animación que se esté ejecutando actualmente en el objeto antes de reproducir la animación en cola.

La página de la API de Unity con respecto a este tema