Unity3D开发之遍历检查AnimatorController里面所有部件 您所在的位置:网站首页 unity开发小程序 Unity3D开发之遍历检查AnimatorController里面所有部件

Unity3D开发之遍历检查AnimatorController里面所有部件

#Unity3D开发之遍历检查AnimatorController里面所有部件| 来源: 网络整理| 查看: 265

My Code : TP:FF21DDCC

现在做的项目用的动画系统是Generic,然后每次用AnimatorController的时候,都要重新拖拖拉拉很麻烦

如果加入一个新的角色,但它又有部分动作是复用之前的,这个时候导入FBX的时候就可以直接检查里面所有部件,并且把自己新的动作赋值进去:

先获取得到一个FBX里面所有的物件,并剔除动画文件出来:

List clipList = new List();clipList.Clear();Object[] objects = AssetDatabase.LoadAllAssetRepresentationsAtPath(assetPath);foreach (Object obj in objects){AnimationClip clip = obj as AnimationClip;if (clip != null){clipList.Add(clip);}}

再进行检测或者替换:

void CheckAndRefreshAnimatorController(AnimationClip[] newClips, AnimatorStateMachine stateMachine){for(int i = 0; i < stateMachine.states.Length; i++) {ChildAnimatorState childState = stateMachine.states[i];if(childState.state.motion == null){Debug.Log("Null : " + childState.state.name);continue;}if(childState.state.motion.GetType() == typeof(AnimationClip)){Debug.Log("Animation : " + childState.state.motion.name);}else if(childState.state.motion.GetType() == typeof(BlendTree)){Debug.Log("BlendTree : " + childState.state.motion.name);CheckAndRefreshBlendTree((BlendTree)childState.state.motion);}}for(int i = 0; i < stateMachine.stateMachines.Length; i++) {Debug.Log("StateMachine : " + stateMachine.stateMachines[i].stateMachine.name);CheckAndRefreshAnimatorController(newClips, stateMachine.stateMachines[i].stateMachine);}}void CheckAndRefreshBlendTree(BlendTree tree){for(int i = 0; i < tree.children.Length; i++){ChildMotion childMotion = tree.children[i];if(childMotion.motion.GetType() == typeof(AnimationClip)){Debug.Log("Animation : " + childMotion.motion.name);}else if(childMotion.motion.GetType() == typeof(BlendTree)){Debug.Log("BlendTree : " + childMotion.motion.name);CheckAndRefreshBlendTree((BlendTree)childMotion.motion);}}}void CheckAnimationClip(AnimationClip clip, AnimationClip[] clips){}

用途很广,可以用作导入模型的时候就生成新的AnimatorController,完全不用手动(我现在项目就是如此)。

补充:

//不能用递归,因为用不了ref.void CheckAndRefreshAnimatorController(AnimationClip[] newClips, AnimatorStateMachine stateMachine){for(int i = 0; i < stateMachine.states.Length; i++) {ChildAnimatorState childState = stateMachine.states[i];if(childState.state.motion == null){if(childState.state.name.CompareTo("New State") == 0)continue;Debug.LogError("Null : " + childState.state.name);continue;}if(childState.state.motion.GetType() == typeof(AnimationClip)){for(int j = 0; j < newClips.Length; j++){if(newClips[j].name.CompareTo(childState.state.motion.name) == 0){childState.state.motion = (Motion)newClips[j];countChange ++;break;}}}else if(childState.state.motion.GetType() == typeof(BlendTree)){//BlendTree这个类有BUG,不能直接修改Motion, 要先记录原本的信息,再全部删除原本的,再修改,再加上去.List allMotion = new List();List allThreshold = new List();BlendTree tree = (BlendTree)childState.state.motion;for(int k = 0; k < tree.children.Length; k++){allMotion.Add(tree.children[k].motion);allThreshold.Add(tree.children[k].threshold);}for(int k = 0; k < allMotion.Count; k++){if(allMotion[k].GetType() == typeof(AnimationClip)){for(int j = 0; j < newClips.Length; j++){if(newClips[j].name.CompareTo(allMotion[k].name) == 0){allMotion[k] = (Motion)newClips[j];countChange ++;break;}}}else if(allMotion[k].GetType() == typeof(BlendTree)){Debug.LogError("You need to change it!");}}for(int k = tree.children.Length - 1; k >= 0; k--){tree.RemoveChild(k);}for(int k = 0; k < allMotion.Count; k++){tree.AddChild(allMotion[k], allThreshold[k]);}}}for(int i = 0; i < stateMachine.stateMachines.Length; i++) {CheckAndRefreshAnimatorController(newClips, stateMachine.stateMachines[i].stateMachine);}}

0 0 Unity3D开发之遍历检查AnimatorController里面所有部件 Unity3D AnimatorController 【Unity3D自学记录】Unity3D开发之原创开关小部件 Unity3D研究之Machine动画脚本自动生成AnimatorController Unity3D研究院之Machine动画脚本自动生成AnimatorController(七十一) Unity3D研究院之Machine动画脚本自动生成AnimatorController Unity3D研究院之Machine动画脚本自动生成AnimatorController Unity3D研究院之Machine动画脚本自动生成AnimatorController(七十一) java遍历文件夹里面的所有文件 遍历一个布局里面所有的控件 C++遍历所有IE浏览器,得到里面的所有元素 C++遍历所有IE浏览器,得到里面的所有元素 Unity3D深入浅出 - 物理引擎之刚体部件(Rigidbody) Unity3D - 物理引擎之刚体部件(Rigidbody)详解 unity3d 半自动化从模型资源生成AnimatorController unity开发之原创开关小部件 unity开发之原创MessageBox小部件 Android之AppWidget桌面小部件开发 Eclipse去除js(JavaScript)验证错误 R语言_符串处理和grep的用法 skiplist 跳表(2)-----细心学习 SQLiteDatabase、SQLiteOpenHelper以及封装 字符转换命令 Unity3D开发之遍历检查AnimatorController里面所有部件 SVN有任何胜过git的地方吗? JSON for java入门总结 一起学android之从Camera捕获图像讲解(38) 使用HTMLParser 解析html字符串,去除html标签,提取纯文本 MFC 浏览文件夹 Unity API - A Git,SVN的优缺点及适合的范围,开源项目?公司项目? hznu 1136: Investment(01背包与完全背包的区别)


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有