我试图从场景中显示退出动画,同时使用LoadSceneAsync加载新场景,将场景保留在内存中直到动画结束,然后更改为新场景,如this question already solved < / p>
问题是我在同一个触发器上触发的图层上运行了几个动画,现在我的所有动画都是1段长度,但有些动画从0开始,有些从0.5 seg开始
如何计算完成动画的总时间,异步加载新场景,然后等待动画时间完成,或者加载新场景完成(需要更长的时间) ),最后改变场景?
我正在考虑使用2个协同程序同时运行并等待最长时间才能完成,但我不确定是否可以这样做(我对C#编程很新),有什么想法吗?
现在我正在等待1.6段的固定时间,因为我的动画在时间上是平等的,但这可能会改变,这是我能想到的唯一方式......
public void GotoScene(string scene)
{
// Start exit animations and wait
CanvasAnimation.SetBool("hide", true);
StartCoroutine(ChangeScene(1.6f, scene));
}
IEnumerator ChangeScene(float time, string goToScene)
{
//Set the current Scene to be able to unload it later
Scene currentScene = SceneManager.GetActiveScene();
// Wait for exit animation to finish
yield return new WaitForSeconds(time);
// The Application loads the Scene in the background at the same time as the current Scene.
AsyncOperation asyncLoad = SceneManager.LoadSceneAsync(goToScene, LoadSceneMode.Additive);
//Wait until the last operation fully loads to return anything
while (!asyncLoad.isDone)
{
yield return null;
}
//Move the GameObject (you attach this in the Inspector) to the newly loaded Scene
SceneManager.MoveGameObjectToScene(WireRoomObj, SceneManager.GetSceneByName(goToScene));
//Unload the previous Scene
SceneManager.UnloadSceneAsync(currentScene);
}
答案 0 :(得分:0)
您可以从AnimatorStateInfo.normalizedTime
检查动画状态,然后在协程中等待,而当前动画的normalizedTime低于1.例如:
using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WaitUntilComplete : MonoBehaviour {
// Use this for initialization
void Start () {
StartCoroutine(WaitUntilAllAnimationsCompleted());
}
IEnumerator WaitUntilAllAnimationsCompleted() {
print("waiting started " + Time.time);
yield return new WaitWhile(() => GetAllAnimationStates().Any(state => state.normalizedTime < 1f));
print("waiting ended " + Time.time);
}
List<AnimatorStateInfo> GetAllAnimationStates() {
List<AnimatorStateInfo> states = new List<AnimatorStateInfo>();
var animatorList = GetComponentsInChildren<Animator>();
foreach (var anim in animatorList) {
for (int i = 0; i < anim.layerCount; ++i) {
states.Add(anim.GetCurrentAnimatorStateInfo(i));
}
}
return states;
}
}