Как я могу воспроизводить случайные анимации в аниматоре, используя скрипт?

У меня 12 состояний, все они связаны переходами в петле. Так что ход игры всегда одинаков. Но я хочу играть их случайно.

Но если они все связаны переходами, я думаю, что это невозможно, поскольку переход делает путь.

И использование компонента "Анимация" не работает с миксамо анимациями. Поскольку в компоненте "Анимация" анимации должны быть устаревшего типа, а в аниматоре они должны быть гуманоидного типа, и для правильного воспроизведения анимаций мне необходимо установить их в гуманоидном типе, поэтому я использую аниматор, а не анимацию. И играть в них хорошо, но я хочу играть в случайном порядке.

1 ответ

Решение
private AnimationClip[] clips;
private Animator animator;

private void Awake()
{
    // Get the animator component
    animator = GetComponent<Animator>();

    // Get all available clips
    clips = animator.runtimeAnimatorController.animationClips;
}

Теперь у вас есть все анимации.

Существуют различные способы их рандомизации... Я покажу вам самый простой способ, который просто случайным образом выбирает индекс и воспроизводит эту анимацию.

Сначала вы будете использовать Coroutine, чтобы начать его с самого начала

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

В сопрограмме выберите случайный индекс и воспроизведите состояние в аниматоре

private IEnumerator PlayRandomly ()
{
    while(true)
    {
        var randInd = Randome.Range(0, Clips.length);

        var randClip = clips[randInd];

        animator.Play(randClip.name);

        // Wait until animation finished than pick the next one
        yield return new WaitForSeconds(randClip.length);
    }
}

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

Чтобы добиться этого, вместо этого вы должны перетасовать список клипов, пролистать их, а после последнего клипа снова перемешать и т. Д., Например, как

private IEnumerator PlayRandomly ()
{
    var clipList = clips.ToList();

    while(true)
    {
        clipList.Shuffle();

        foreach(var randClip in clipList)
        {
            animator.Play(randClip.name);
            yield return new WaitForSeconds(randClip.length);
        }
    }
}

public static class IListExtensions 
{
    /// <summary>
    /// Shuffles the element order of the specified list.
    /// </summary>
    public static void Shuffle<T>(this IList<T> ts) {
        var count = ts.Count;
        var last = count - 1;
        for (var i = 0; i < last; ++i) {
            var r = UnityEngine.Random.Range(i, count);
            var tmp = ts[i];
            ts[i] = ts[r];
            ts[r] = tmp;
        }
    }
}
Другие вопросы по тегам