Как по очереди воспроизвести все анимационные клипы с контроллера аниматора? - PullRequest
0 голосов
/ 31 декабря 2018

Основная цель состоит в том, чтобы воспроизвести все анимации в списке одну за другой, чтобы воспроизвести первую, дождаться ее окончания и затем запустить следующую.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayAnimations : MonoBehaviour
{
    public Animator animator;

    private List<AnimationClip> clips = new List<AnimationClip>();

    // Start is called before the first frame update
    void Start()
    {
        foreach (AnimationClip ac in animator.runtimeAnimatorController.animationClips)
        {
            StartCoroutine(PlayAll(ac.name, ac.length));
        }
    }

    public IEnumerator PlayAll(string stateName, float length)
    {
        animator.Play(stateName);
        yield return new WaitForSeconds(length);
    }

    // Update is called once per frame
    void Update()
    {

    }
}

Но она воспроизводится толькоодин анимационный клип, и в контроллере аниматора их два.Зачем ?

Воспроизводится только второй, первый из которых не имеет состояния StateMachine Default.

1 Ответ

0 голосов
/ 31 декабря 2018

Вы запускаете все сопрограммы для разных состояний / анимаций в одно и то же время (по крайней мере, в одном кадре), поэтому все они запускаются animator.Play "одновременно".

Таким образом, в первом кадреСопрограммы устанавливают соответствующее состояние, сначала для первой анимации, затем для второй анимации и т. Д.

=> у вас в действительности работает только последний в списке, потому что он единственный, который не получает«отменено» следующим animator.Play вызовом.

Вместо этого переместите цикл for в сопрограмму:

void Start()
{
    StartCoroutine(PlayAll());
}

public IEnumerator PlayAll()
{
    foreach (AnimationClip ac in animator.runtimeAnimatorController.animationClips)
    {
        animator.Play(ac.name);
        yield return new WaitForSeconds(ac.length);
    }
}

Однако на самом деле вся идея StateMachine имеет переходы.. так что вы можете просто соединить оба состояния / анимации с переходом, у которого

  • UseExitTime включено
  • ExitTime = 1
  • Duration (изпереход или затухание, если вы хотите) 0

, после чего он автоматически переходит к следующей анимации после завершения первой.(Теперь вы также можете даже зациклить их, просто перейдя обратно в первое состояние.)

Так что вам вообще не понадобится какой-либо сценарий для этого вообще.


В противном случаеВы также можете использовать компонент Animation без состояний, переходов, слоев и контроллера.

Код будет немного отличаться:

// Assuming here this script is attached to the same object as the Animation component
// Ofcourse you can also keep it public and reference the component yourself
private Animation animation;

public List<AnimationClip> clips = new List<AnimationClip>();

private void Awake()
{
    animation = GetComponent<Animation>();
}

private void Start()
{
    StartCoroutine(PlayAll());
}

private IEnumerator PlayAll()
{
    foreach(var clip in clips)
    {
        animation.Play(clip.name);
        yield return new WaitForSeconds(clip.length);
    }
}

Компонент Animationпомечен как устаревший, но это может измениться из-за его простоты, например, в вашем случае использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...