Вы запускаете все сопрограммы для разных состояний / анимаций в одно и то же время (по крайней мере, в одном кадре), поэтому все они запускаются 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
помечен как устаревший, но это может измениться из-за его простоты, например, в вашем случае использования.