您的位置:首页 > 移动开发 > Unity3D

在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信息变化了,则提示用户修改!

能否自动修改?这个比较复杂
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity 动画 优化