Unity3D学习笔记导入WOW动画不完美修复方案
编辑: 点击量: 249
之前一直用Wow Model Viewer来导出魔兽世界的模型,然后导入到Unity中做练习用。虽然导出的FBX再导入后动画名称和剪辑都很完美,但是每个动画播放到最后几帧的时候整个模型就会扭曲。
眼看新的资料片《潘达利亚的迷雾》就要上线了,WMV小组发布了支持5.0模型的新版本,可惜只是个小版本更新,并没有修复动画扭曲的问题。听说0.8版本的WMV已经解决了这个问题,将会在新资料片上线的时候发布,难道只能干等着?
今天看Unity文档Animation部分的时候,灵光一闪想到既然动画是最后几帧会扭曲,那能不能通过脚本直接把那几帧删掉呢?这样虽然动画看起来会有跳帧的感觉,但也不会像之前那样抽搐呀。
马上打开Unity,自动载入了之前已经做好的艾尔文森林场景。按Ctrl+6打开Animation窗口,在层次面板里选中以前做演示用的伊利丹模型。
可以看到默认是选中了Stand,也就是站着的动画,并且由于是FBX里的动画资源,没有办法修改,所以是只读(Read-Only)的。不能编辑也无所谓,只要知道第几帧模型会扭曲就行了。
点击播放按钮,在设计视图中就可以看到模型动起来了。盯着动画窗口里的帧数框,发现大概40多帧的时候会出现扭曲。
暂停动画,并手动输入40、41、42……可以明显的发现直到47为止,所有的动画都是很连贯的,48和49帧,也就是最后俩帧会有扭曲现象。
在观察过其他模型后发现都是最后两帧有会扭曲的问题,那么解决方法也就出来了。
▇ 知识点
- (GameObject instance).animation:获取当前游戏对象的动画组件引用,也可以使用GetComponent()获取;
- animation实现了IEnumerable接口,用foreach可以遍历到所有的AnimationState(动画状态);
- (Animation instance).RemoveClip:移除一个动画剪辑;
- (Animation instance).AddClip:添加一个新的动画剪辑,可以剪取原有动画剪辑的部分;
- (Animation instance).GetClip:获取指定名称的动画剪辑;
- (Animation instance).playAutomatically:可以获取/设置该动画组件是否自动播放;
- (Animation instance).wrapMode:动画播放的方式,可以无限循环、乒乓球式、单次播放等等;
- (Animation instance).Play:播放当前动画;
▇ 思路
- 创建一个WowAnimation的脚本,附加到所有动画扭曲的模型上;
- 在Start方法中获取所有AnimationClip,将其移除,并添加一个相同名字的动画片段,截取最大帧数-2的部分;
- 由于所有AnimationClip都是重新添加的,所以必须在代码之前缓存检视面板中预设的动画片段名称,在重新添加后再设置回去;
▇ 脚本- using UnityEngine;
- using System.Collections;
- using System.Collections.Generic;
- public class WowAnimationFix : MonoBehaviour
- {
- private const float ANIMATION_CUT_FRAME = 2;
- void Start()
- {
- //保留默认的动画,保证检视窗口中的设置有效
- var defaultClip = animation.clip;
- //获取所有的AnimationState
- var states = new List();
- foreach (AnimationState state in animation)
- states.Add(state);
- //剪掉所有动画最后崩坏的部分
- foreach (var state in states)
- {
- var clip = state.clip;
- animation.RemoveClip(clip);
- animation.AddClip(clip, clip.name, 0, (int)(clip.frameRate * clip.length - ANIMATION_CUT_FRAME), true);
- }
- //还原默认的动画,保证检视窗口中的设置有效
- if (defaultClip != null)
- {
- animation.clip = animation.GetClip(defaultClip.name);
- if (animation.playAutomatically)
- {
- animation.wrapMode = WrapMode.Loop;
- animation.Play();
- }
- }
- }
- }
复制代码 ▇ 效果
蛋总霸气的身姿终于回来了,哈哈。暂时用这个脚本来解决一下动画扭曲的问题,等WMV0.8版本出来以后删除这个脚本,并移除所有引用就可以了。
王皓
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat王皓
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat王皓
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat