Unity计算总动画师完成然后改变场景

时间:2018-04-10 04:01:17

标签: c# animation unity3d async-await

我试图从场景中显示退出动画,同时使用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);
}

1 个答案:

答案 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;
    }

}