unity中animator动态设置AnimationClip

需求:
只有一个AnimatorController,这是在unity中制作好的一个状态机。
我们需要在运行的时候,将其添加到每个人物身上,而每个人物的animationclip是不同的,这就需要将不同的clip的设置到AnimatorController上。

解决方法:
1、准备AnimatorController资源:
在这里插入图片描述
在这里插入图片描述
2、准备三个状态:
在这里插入图片描述
3、为每个状态,添加一个空的AnimactionClip
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、编写代码,动态设置AnimationClip

[Serializable]
public class PrefabInfo
{
    public GameObject prefab;
    public Vector3 position;
    public List<AnimationClip> clips;
}

public class Benchmark : MonoBehaviour
{
    public List<PrefabInfo> m_gos;
    private List<Animator> m_animators;

    private float m_duration = 2.0f;
    private float m_countDown = 0;
    private int m_hideIndex = -1;
    private int m_visibleNum = 0;
    public Text num;

    private void Start()
    {
        m_animators = new List<Animator>();
        RuntimeAnimatorController animatorController = Resources.Load("Controller") as RuntimeAnimatorController; //加载状态机资源
        for (int i = 0; i < m_gos.Count; ++i) //实例化多个不同的人物
        {
            GameObject go = GameObject.Instantiate(m_gos[i].prefab);
            go.transform.localScale = Vector3.one;
            go.transform.position = m_gos[i].position;
            Animator animator = go.GetComponent<Animator>(); //获取不到,就添加
            if (animator == null) animator = go.AddComponent<Animator>();
            animator.runtimeAnimatorController = animatorController; //将状态机资源,赋值给animator的runtimeAnimatorController

            AnimationClip[] clips = animatorController.animationClips; //拿到空的动画片段,其实只用到了其名字
            AnimatorOverrideController overrideController = new AnimatorOverrideController(); //新建一个重写的controller
            overrideController.runtimeAnimatorController = animatorController; //重写的controller的runtimeAnimatorController指向那个空的
            for (int j = 0; j < m_gos[i].clips.Count && j < clips.Length; ++j)
            {
                overrideController[clips[j].name] = m_gos[i].clips[j]; //设置不同的clip
            }
            animator.runtimeAnimatorController = overrideController; //重新赋值给物体
            m_animators.Add(animator);
        }
        m_hideIndex = -1;
        m_visibleNum = m_animators.Count;
        UpdateVisibleNum();
    }
}

注意点:
1、 overrideController[clips[j].name] 这里是指如下图,其值为a1,是个字符串,而不是状态的名字。
在这里插入图片描述
2、要使用AnimatorOverrideController,进行动画片段重写,然后赋值给runtimeAnimatorController,不能直接改RuntimeAnimatorController改。这个unity设计比较诡异。

3、AnimatorController也能打包:
https://blog.csdn.net/tonnychu/article/details/49903657
但是注意实例化的没有试过,参考上面的博客。
这里只要一个AnimatorController即可。

4、上面有一个Any State
在这里插入图片描述
他是任意状态都能切换到其他的状态。

5、播放动画,可以用trigger,也可以直接用名字:
如:
m_animators[i].SetTrigger(“To” + (index + 1));
在这里插入图片描述
在这里插入图片描述
也可以直接播放状态的名字:
m_animators[i].Play(“Monster_MarineMusketeer_damage_fly”);
在这里插入图片描述
至此结束。

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值