Unity3D学习笔记(二十一)导入WOW动画不完美修复方案
之前一直用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();
- }
- }
- }
- }
复制代码
▇ 效果
下载附件 (511.17 KB)
蛋总霸气的身姿终于回来了,哈哈。
暂时用这个脚本来解决一下动画扭曲的问题,等WMV0.8版本出来以后删除这个脚本,并移除所有引用就可以了。
Unity3D学习笔记(二十一)导入WOW动画不完美修复方案相关推荐
- python3.4学习笔记(二十一) python实现指定字符串补全空格、前面填充0的方法
python3.4学习笔记(二十一) python实现指定字符串补全空格.前面填充0的方法 Python zfill()方法返回指定长度的字符串,原字符串右对齐,前面填充0. zfill()方法语法: ...
- Mr.J-- jQuery学习笔记(二十一)--模拟微博页面
先看之前的节点操作方法:Mr.J-- jQuery学习笔记(二十)--节点操作方法 Mr.J-- jQuery学习笔记(五)--属性及属性节点 Mr.J-- jQuery学习笔记(十一)--事件委托 ...
- kvm虚拟化学习笔记(二十一)之KVM性能优化学习笔记
本学习笔记系列都是采用CentOS6.x操作系统,KVM虚拟机的管理也是采用virsh方式,网上的很多的文章都基于ubuntu高版本内核下,KVM的一些新的特性支持更好,本文只是记录了CentOS6. ...
- threejs学习笔记:实现导入的动画gltf模型播放动画
这种方式需要gltf模型本身就带有动画,就是在建模的时候添加了动画,否则是不会生效的 只有一个动作 // 用于收集动画 const clock: THREE.Clock = new THREE.Clo ...
- linux驱动开发学习笔记二十一:异步通知
一.异步通知简介 我们首先来回顾一下"中断",中断是处理器提供的一种异步机制,我们配置好中断以后就可以让处理器去处理其他的事情了,当中断发生以后会触发我们事先设置好的中断服务函数, ...
- opencv学习笔记二十一:使用HSV颜色空间实现颜色识别
一.颜色空间介绍 RGB 颜色空间是大家最熟悉的颜色空间,即三基色空间,任何一种颜色都可以由该三种 颜色混合而成.然而一般对颜色空间的图像进行有效处理都是在 HSV 空间进行的,HSV( ...
- IOS学习笔记二十一(NSDictionary、NSMutableDictionary)
1.NSDictionary.NSMutableDictionary 可以理解为java里面的map,一个key对应一个value,key不可以重复 NSDictionary不可变,NSMutable ...
- java自定义一个timeout,Timeout操作符 RxJava 学习笔记二十一
timeout用于检测在给定时间内observables没有及时响应.如果指定的时间量没有发出任何项目,则超时会使observables失败并出现TimeoutException. 我们将从debou ...
- 立创eda学习笔记二十一:添加、移除泪滴
在PCB电路板设计中,为了让焊盘更坚固,防止机械制板时焊盘与导线之间断开,常在焊盘和导线之间用铜膜布置一个过渡区,形状像泪滴,故常称做补泪滴(Teardrops). 泪滴的作用 避免电路板受到巨大外力 ...
最新文章
- c++小项目:通讯录管理系统
- Android 开发笔记 ListView异步加载图片
- Atitit 五种IO模型attilax总结 blocking和non-blocking synchronous IO和asynchronous I
- 【转自lzplzp】pair project总结
- panic与recover函数
- 450.删除二叉搜索树中的节点
- Codejock Suite Pro 19.3.0 Carck版本
- java关于方法覆盖的叙述_以下关于方法覆盖的叙述中正确的是( )
- Android 第一次开机速度优化
- 怎么更改wifi频段_如何更改wifi的频段
- Drawio添加自定义图形工具箱
- oracle中..符号,oracle中带有特殊符号的模糊查询
- 家用路由器及NAT协议
- 【Luat-esp32】3.陀螺仪-mpu6050
- 【C++】火车站的列车调度
- 陪玩视频聊天系统开发,升级与更新功能的实现
- JDK Tomcat MySQL一键安装
- Mybatis-Plus的条件构造器(Wrapper)
- mysql查询选课数_[MySQL]查询学生选课的情况(二)
- 金仓数据库 KingbaseES SQL 语言参考手册 (13. SQL语句:ALTER SYNONYM 到 COMMENT)
热门文章
- python输入以回车结束_python将回车作为输入内容的实例
- Arrays.asList 为何不能添加和删除元素?
- 如何直观的理解最大似然估计?
- elementUI时间选择器传回后端时报错
- 损失函数(loss function)
- 51.计算机通电后自动开机,Win10专业版怎么解决电脑关机后又自动开机的问题?
- linux 文件夹 乱码,linux中文文件名乱码解决
- gta4 oracle_中关村在线 - 画质设定保守些:MSAAx2/x4区别不大_DIY新手说明书15:CPU不再是GTA5瓶颈?...
- iphone map(地图)的实现
- 【JZOJ5407】Deep