我有12个状态,它们都通过循环中的过渡连接。 因此,播放的流程始终是相同的。但我想随机播放。
但是,如果它们都通过过渡连接在一起,我想这是不可能的,因为过渡是路径。
并且使用动画组件不能与mixamo动画一起使用。由于在“动画”组件中,动画必须是传统类型,但在动画师中,它们必须是类人动物类型,并且要正确播放动画,我需要将它们设置为类人动物类型,这就是为什么我使用Animator而不是“ Animation”的原因。播放它们效果很好,但我想按随机顺序播放它们。
答案 0 :(得分: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;
}
现在您拥有了所有动画。
现在有多种方式将它们随机化……我向您展示了最简单的方法,即随机选择一个索引并播放该动画。
首先,您将使用协程,以便从头开始
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;
}
}
}