在Unity中修改Fbx中的动画文件
2016-09-11 01:17
2131 查看
在Unity中修改Fbx中的动画文件
背景
Unity导入fbx格式分为Avatar model、 Animation fbx为了进行骨架加点优化,将所有的model都选用了GameObject optimied ,所有的childer Transform 在hierarchy中不可见
在animator controller中看到的所有animationclip中的节点都是丢失的,并且animationclip是readOnly的,不能修改
不能在Ediotr中拖动animationclip来实现动画预览
需求
能够在Editor中通过拖动animationClip来进行动画预览能够简单的编辑AnimationClip中的动画节点,例如:拖动,删除,增加
对animtor controller逻辑无影响
流程
打开AnimationClip Helper Window选中当前需要操作的Avatar
选中当前Avator的动画文件对应的fbx目录–【修改为直接选取一个Animator Controller】
controller = FindController(AssetDatabase.GetAssetPath(animatorFolder)); if (null != controller) { AnimatorController ac = controller as AnimatorController; AnimatorStateMachine sm = (ac != null ? ac.layers[0].stateMachine : null);//这里只考虑第一层,因为不需要有多层 int count = (sm != null ? sm.states.Length : 0); for (int i = 0; i < count; i++) { Motion mt = sm.states[i].state.motion; if (mt != null) {
将所有的动画fbx中的Animation Clip段copy到一个新的目录【do Once】
private AnimationClip CreateMotion(Motion mt) { AnimationClip sourceClip = mt as AnimationClip; string path = AssetDatabase.GetAssetPath(sourceClip); path = Path.Combine(Path.GetDirectoryName(path), sourceClip.name) + ".anim"; string newPath = newAnimClipsPath + "/" + sourceClip.name + ".anim"; AnimationClip newClip = new AnimationClip(); EditorUtility.CopySerialized(sourceClip, newClip); newClip = Compress(newClip); AssetDatabase.CreateAsset(newClip, newPath); return newClip; } static AnimationClip Compress(AnimationClip clip) { AnimationClipCurveData[] curves = AnimationUtility.GetAllCurves(clip); Keyframe key; Keyframe[] keyFrames; foreach (AnimationClipCurveData curveDate in curves) { keyFrames = curveDate.curve.keys; for (int i = 0; i < keyFrames.Length; i++) { key = keyFrames[i]; key.value = float.Parse(key.value.ToString("f3")); key.inTangent = float.Parse(key.inTangent.ToString("f3")); key.outTangent = float.Parse(key.outTangent.ToString("f3")); keyFrames[i] = key; } curveDate.curve.keys = keyFrames; clip.SetCurve(curveDate.path, curveDate.type, curveDate.propertyName, curveDate.curve); } return clip; }
重新绑定animator controller中的Animation Clip的引用
修改当前的avator的GameObject optimied选项为false
string path = AssetDatabase.GetAssetPath(animator.avatar); ModelImporter model = AssetImporter.GetAtPath(path) as ModelImporter; if (model.optimizeGameObjects != optimized) { model.optimizeGameObjects = optimized; AssetDatabase.ImportAsset(path); }
在hierarchy中创建当前角色mesh的GameObject
打开Animation编辑器,因为取消了Avatar的Gameobject Optimied选项,所以当前的Animation Clip是可见与可编辑的
切换Avatar时,删除Hierarchy中的Avatar GameObject,
修改Avatar的GameObject Optimied选项为true【重新optimied的时候,虽然不能在Editor模式下直接预览Animation Clip了,但是在RunTIme模式下,Animator Controller还是能够正常运行的!】
优化
因为所有的Animation Clip是Copy出来的,已经与美术提供的动画Fbx文件解除绑定,所以如果美术重新修改了Fbx的动画片段,那么对应的AnimationClip需要自己手动修改把之前的AnimationClip的文件md5信息记录下来,当资源re-import的时候,如果md5信息变化了,则提示用户修改!
能否自动修改?这个比较复杂
相关文章推荐
- Unity3D修改FBX文件动画名
- Unity3d修改FBX文件的动画名方法
- Unity 修改FBX模型动画
- Unity3d修改FBX文件的动画名方法
- Unity3d修改FBX文件的动画名方法
- 3dsMax导出到unity的fbx文件丢失动画
- unity 3.5以上导入fbx无法播放动画
- 巧妙地批量修改unity本地文件的参数
- Unity导入FBX自动进行动画切分
- [Unity菜鸟] FBX模型动画提取
- 00004 死亡阴影.0001:配置文件的Unity包与修改
- Unity运行时读取FBX文件插件
- 从.fbx 到生成web版执行文件,完全不用unity集成开发环境
- [Unity-26] AnimationClip压缩-动画文件压缩
- 修改动画FBX代码工具
- Unity导入FBX自动进行动画切分
- 关于3.5以上版本FBX模型文件导入unity后不播放动作的问题
- Unity导入FBX文件部分模型丢失材质的BUG
- Unity与FBX--为什么使用FBX文件
- Unity编辑器下获取动画的根运动状态并修改