Как я могу воспроизводить случайные анимации в аниматоре, используя скрипт?
У меня 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;
}
}
}