在队列中按 4 个游戏对象的顺序播放 - 动画师(不是具有多个状态的单个动画师)

Posted

技术标签:

【中文标题】在队列中按 4 个游戏对象的顺序播放 - 动画师(不是具有多个状态的单个动画师)【英文标题】:Play in sequence of 4 game objects - animators (Not single animator with multiple states) in a queue 【发布时间】:2021-05-27 11:23:57 【问题描述】:

我是统一的新手。我有 4 个游戏对象,分别是红色、绿色、蓝色、黄色 - 索引分别映射为 0、1、2 和 3。另外,我在列表List<int> systemTrack 中保留了索引序列。 现在,我调用animator 相对于列表 0, 1, 2, 3 的序列(这可以是随机的0-3)。

我可以在给定时间执行一个动画循环。

 void Start() 
    animator.Play("blue_animation", 0, 0);
  

如何根据 list 顺序调用?也许Update() 是个合适的地方。

到目前为止,我找到了this thread - 但它有一个具有多个状态的单个 Animator 对象按顺序调用,这不是我的情况。 很少有其他讨论也适用于Animation 组件不适用于new Animator 组件。

【问题讨论】:

请使用正确的标签...unityscript 是或更好 一种 javascript 风格,类似于早期 Unity 版本中使用的自定义语言,现在早已弃用...你的代码显然是c# 【参考方案1】:

在您当前的课程中,您可以使用 Coroutine 之类的

List<AnimatorQueueController> animatorQueues;

private void Start()

    StartCoroutine(RunAllControllersSequencial());


IEnumerator RunAllControllersSequencial()

    foreach (var queue in animatorQueues)
    
        // This runs the routine and waits until it finishes
        yield return queue.RunAnimationQueueAndWait();
    


    

现在唯一要做的就是定义/实现每个控制器如何“知道”它自己的动画队列已经完成。

可能有很多可能的方法。马上:它们都不会是漂亮的;)由于Animator 使用了很多基于string 的东西,你最终要么必须确保所有动画/触发器名称都正确编写,要么你必须参考动画剪辑,或者希望状态被称为相同,或者您必须通过相应的剪辑昂贵地找到状态,您必须知道等待队列完成的时间等等。

这就是说,这个解决方案也不是完美的,但我认为对于您的设置来说这将是最方便的;)

你可以例如使用Animation Event 并执行类似的操作

public class AnimationQueueController : MonoBehaviour

    [SerializeField] private Animator _animator;
    // Here set the first state name for each instance via the Inspector
    [SerializeField] private string firstStateName = "first_state";

    private void Awake ()
    
        if(!_animator) _animator = GetComponent<Animator>();
    

    // Simply have another routine you can yield so it is executed and at the same time waits until it is done
    public IEnumerator RunAnimationQueueAndWaitUntilEnd()
    
        hasReachedEnd = false;
        _animator.Play(firstStateName, 0 ,0);

        yield return new WaitUntil(() => hasReachedEnd);
    

    // This is the method you will invoke via the Animation Event
    // See https://docs.unity3d.com/Manual/script-AnimationWindowEvent.html
    public void AnimationEnd()
    
        hasReachedEnd = true;
    

这至少将您的实现开销减少到

确保在最后一个状态结束时触发动画事件 确保在AnimatorQueueController 中提供第一个州的名称 在您的原始脚本中而不是 Animator 引用中,而不是将 AnimatorQueueController 存储在您的列表中

【讨论】:

以上是关于在队列中按 4 个游戏对象的顺序播放 - 动画师(不是具有多个状态的单个动画师)的主要内容,如果未能解决你的问题,请参考以下文章

unity动画一个片段播放完怎么让它不会到初始状态

在纯 css3 on loop 中按顺序动画元素

如何在 html 5 中按顺序播放多个音频文件?

开源java游戏框架libgdx专题-09-动画的使用

如何停止默认动画?

死亡时播放的 UI 对象动画