Unity AnimatorController 自动添加动画片段2

AnimatorController复制
根据第一篇的自动创建AnimatorController,是将模型内的动画资源拿出全部放入控制器中,这样话省的一个个去拖拽。
但是有的时候这并不是我们想要的结果,我们有事需要替换摸个模型摸,但是里面的动画状态的结构需要保存起来。。。这样一来我们前面的方法显得有点鸡肋。

那么我们需要做:
		第一步:就是自动创建AnimatorController。
		这里面就不需要要里面添加动画状态,只需要获取就行,下面这段就不需要了。
		for(i=0 ; i<newClip .Lenght;i++)
	   {
   			 if(newClip [i] is AnimationClip)
	   		 {
  	  			AnimationClip m_clip=newClip [i] as AnimationClip;
   				 m_Controller.AddMotion(m_clip,0);  
   			 }
		 }

第二:选择你要替换的动画状态机(也就是原来已经布局好的状态机),将选择的Animatroller存成变量。

	在editor编辑
	 	AnimatorController	m_SelectAnimatorController;
	  void OnGUI()
	  {
	  if(GUILayout.Button("确认选择")){
  	 	 m_SelectAnimatorController = Selection.activeObject as AnimatorController;//在Project的面板上选择原来的控制器    		
	  }
	}

第三:进行替换

替换的方法独立出来ReplaceController 也就是自动生成的控制器,dicAnimation就是自动生成控制器是获取的模型内的动画片段,
这些都在第一篇中都有。
void Replace(AnimatorController ReplaceController, Dictionary<string, AnimationClip> dicAnimation)
{

    Dictionary<string, AnimatorState> m_dicState = new Dictionary<string, AnimatorState>();//添加动画所有片段

    AnimatorControllerParameter[] m_oldController = m_SelectAnimatorController.parameters;//获取所有parameters判断信息

    ChildAnimatorState[] m_AnimDate = m_SelectAnimatorController.layers[0].stateMachine.states;//获取所有子动画状态信息

    //添加所有parameters判断信息
    for (int i = 0; i < m_oldController.Length; i++)
    {
        ReplaceController.AddParameter(m_oldController[i].name, m_oldController[i].type);
    }
    
 	 //添加所有普动画模块
    AddAinatorCip(ReplaceController, dicAnimation, m_dicState, m_AnimDate);

    //添加依赖连线
    AddTrans(m_dicState, m_AnimDate);
  }

复制添加动画模块

	private static void AddAinatorCip(AnimatorController ReplaceController, Dictionary<string, AnimationClip> dicAnimation, Dictionary<string, AnimatorState> m_dicState, ChildAnimatorState[] m_AnimDate)
{
    for (int i = 0; i < m_AnimDate.Length; i++)
    {
        AnimationClip m_Clip = null;
        if (dicAnimation.ContainsKey(m_AnimDate[i].state.motion.name))
        {
            m_Clip = dicAnimation[m_AnimDate[i].state.motion.name];
            m_Clip.name = m_AnimDate[i].state.motion.name;
            AnimationClipSettings settings = AnimationUtility.GetAnimationClipSettings(m_Clip);
            settings.loopTime = m_AnimDate[i].state.motion.isLooping;
            AnimationUtility.SetAnimationClipSettings(m_Clip, settings);
        }
        if (m_Clip)
        {               
            AnimatorState m_state = ReplaceController.layers[0].stateMachine.AddState(m_AnimDate[i].state.name, m_AnimDate[i].position);
            m_state.motion = m_Clip;
            m_state.name = m_Clip.name;

            if (!m_dicState.ContainsKey(m_Clip.name))
            {
                m_dicState.Add(m_Clip.name, m_state);
            }
            else
            {
                Debug.Log("clicp is repeat " + m_Clip.name);
            }
        }
    }
}

复制添加依赖

	 private static void AddTrans(Dictionary<string, AnimatorState> m_dicState, ChildAnimatorState[] m_AnimDate)
{
    for (int i = 0; i < m_AnimDate.Length; i++)
    {
        string stateName = m_AnimDate[i].state.name;
        if (m_dicState.ContainsKey(stateName))
        {
            AnimatorStateTransition[] m_trans = m_AnimDate[i].state.transitions;
            for (int j = 0; j < m_trans.Length; j++)
            {
                string m_addTransname = m_trans[j].destinationState.name;
                if (m_dicState.ContainsKey(m_addTransname))
                {
                    AnimatorStateTransition m_tran = m_dicState[stateName].AddTransition(m_dicState[m_addTransname]);
                    AnimatorCondition[] m_cond = m_trans[j].conditions;
                    m_tran.hasExitTime = false;
                    for (int c = 0; c < m_cond.Length; c++)
                    {
                        m_tran.AddCondition(m_cond[c].mode, m_cond[c].threshold, m_cond[c].parameter);//添加Condition
                    }

                }

            }
        }

    }
}

这样就完成了一个最基本的动画状态机的复制功能,当然也有更简单的方式去满足这个需求:
比如用原来的模型完全不用了,那么直接替换里面的动画Clip就行了。
如果两个控制是一样的,只是里面的动画片段不一样,那么就不要在编辑器里面直接复制原来的AnimatorController,复制出来的控制器是关联原理的控制器的,只要一个修改两个都会变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值