如何使用脚本在动画制作器中播放随机动画?

时间:2019-01-01 23:44:58

标签: c# unity3d

我有12个状态,它们都通过循环中的过渡连接。 因此,播放的流程始终是相同的。但我想随机播放。

但是,如果它们都通过过渡连接在一起,我想这是不可能的,因为过渡是路径。

Animator

并且使用动画组件不能与mixamo动画一起使用。由于在“动画”组件中,动画必须是传统类型,但在动画师中,它们必须是类人动物类型,并且要正确播放动画,我需要将它们设置为类人动物类型,这就是为什么我使用Animator而不是“ Animation”的原因。播放它们效果很好,但我想按随机顺序播放它们。

1 个答案:

答案 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;
        }
    }
}