Unity3D学习笔记(二十一)导入WOW动画不完美修复方案
2016-02-24 09:51
537 查看
之前一直用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();
}
}
}
}
复制代码
▇ 效果
2013-4-24 21:17:26 上传
下载附件 (511.17
KB)
蛋总霸气的身姿终于回来了,哈哈。
暂时用这个脚本来解决一下动画扭曲的问题,等WMV0.8版本出来以后删除这个脚本,并移除所有引用就可以了。
眼看新的资料片《潘达利亚的迷雾》就要上线了,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();
}
}
}
}
复制代码
▇ 效果
2013-4-24 21:17:26 上传
下载附件 (511.17
KB)
蛋总霸气的身姿终于回来了,哈哈。
暂时用这个脚本来解决一下动画扭曲的问题,等WMV0.8版本出来以后删除这个脚本,并移除所有引用就可以了。
相关文章推荐
- 通过谷歌播放服务集成AdMob和Unity 3D
- Unity学习之路(一)太空大战类游戏制作5
- Unity3d网格合并
- Learn Unity - Scripts(中级教程)
- Learn Unity - Scripts(新手教程)
- Unity中Android和Ios平台的crash reporter(崩溃报告采集与上传)
- 猫都能学会的Unity3D Shader入门指南(二)
- 猫都能学会的Unity3D Shader入门指南(一)
- Unity教程之-制作闪亮的星星Star(四):Unity Editor编辑器实现Undo
- Unity教程之-制作闪亮的星星Star(五):源码
- Unity教程之-制作闪亮的星星Star(三):给Star创建Unity Editor编辑器
- Unity教程之-制作闪亮的星星Star(二):创建Shader
- Unity3D学习笔记(二十)用键盘选取/切换目标生物
- Unity3D学习笔记(十九)敌人AI
- Unity3D学习笔记(十八)使用插件NGUI制作小地图
- Unity3D学习笔记(十七)自定义鼠标形状
- 使用AdMob和Unity [Android]
- Unity3D学习笔记(十六)血条的实现
- Unity3D学习笔记(十五)脚本:HelloWorld!
- Unity3D学习笔记(十四)GUI