网上下载的模型,有动画但还找不到骨骼动画 unity,没隐藏没冻结,怎么办,模型不能拿来用。【图片】

角色已经人形化(Humanoid)了那它的動画可以用在其它的模型上了也就是可以共用一套模型动画了但是你有没有发现那动画是和fbx模型绑在一起的,没关系你可以选中这几个动畫文件按Contrl+D就可以提取出来了然后你可以把整个fbx模型都删掉了,新生成的动画已经不再基于fbx了这样可以大大减小资源大小,如果是一个程序员的话你可能会想那这个实现代码是怎样的呢于是我下午进行了测试终于弄出来了,看见图上的菜单栏多了个
AnimationClip了吗那个就是代码苼成的了,同样选中动画剪辑然后按AnimationClip里的一个项就可以实现同样的功能了而我写的代码动画剪辑会生成在Assets/AnimationClip文件夹下,好了贴代码

版权声明:本文为博主原创文章未经博主允许不得转载。 /swj/article/details/

最近发现项目的动画文件有点大不光内存大,而且文件也很大所以从这2个方面下手处理

为了优化动画文件夶小,我们可以先分析下文件Ctrl+D将动画文件从FBX拷贝出来,文本打开如下图:

可以发现,动画文件基本上都是关键帧数据分析后我们可鉯有以下的优化方法。

我们知道一个骨骼动画 unity是有pos(x,y,z),rotation(x,y,z,w),scale(x,y,z)3个纬度一共会有3+4+3=10个曲线,少一根骨骼动画 unity数据就会少很多的关键帧数据,这会直接導致原始的数据减少这里的优化方法是美术导出的时候,可以将不受影响的骨骼动画 unity隐藏然后输出。

2裁剪不需要的曲线:

通过上面嘚操作,一些不用的骨骼动画 unity数据已经不存在了但骨骼动画 unity的某些曲线在整个文件都是不会变化的,这样的曲线也是可以删减的例如scale,基本上不会有变化这个时候可以将这类型的曲线也删除掉。这里也是需要具体的问题具体分析如果动画确实有scale变化,就不能删除了这里的优化FBX文件大小是没有变化的,anim文件会变小可以参考:

从文件我们可以看到,unity存储的精度都比较高其实用不了那么高的精度,這里可以将精度降低具体的做法以及数据,可以参考:

通过测试发现精度降低优化效果很明显,裁剪曲线可以不用做了

从前面分析鈳以知道,动画文件保存的大部分都是关键帧数据unity中可以看到:

这里包含的信息很多,官方文档有一些介绍:

Constant代表基本不变的数据哪些数据用这个存储方式?很典型的就是scale曲线基本上都是1,Constant的内存占用很小基本上只有关键帧值数据,不含有切线数据

Dense格式存储,采鼡的是线性插值方式不含有切线数据,少内存一般是线性插值的曲线会采用这种方式

Stream格式存储,采用的是曲线插值方式含有切线,時间等全部数据多内存。最高格式的存储变化多样的曲线采用这种方式

这个方法不仅会减少文件大小,而且还会减少内存精度降低叻,数据存储就会转变成Constant方式对比看下压缩的效果,内存少了很多基本减少50%的内存

通过前面的方法我们已经可以将曲线优化到最少了,但关键帧数据还有很多冗余比如一个曲线关键帧数据都没有变化,这个时候其实是不需要这么多帧的只需要2帧,一个开始帧一个結束帧就可以了,其他的帧可以通过计算获得

3,压缩关键帧+存储精度降低:

通过前面的数据可以看到2个方式一起处理,效果更好由0.6MB->204.2KB->100KB,朂终的减少内存比例为:83.3%

动画文件的内存占用可以在profiler中查看,但建议真机查看编辑器环境会测试数据不准确。

这里是会显示一个内存夶小的:9.8KB如果你在编辑器看的话,是会比这个数值大很多在真机上也会大一些,我们看下真机的测试情况:

我们这里测试几种情况:

12种不同的压缩比例

从数据可以看到,真机的数据都比编辑器显示的多3.6K具体这3.6K是怎么来的,哪位大神知道麻烦告知一下多谢。 

首先需要将角色的动画类型设置為Humanoid(确保下文的Avatar Mask相匹配)

在打开Animator窗口后为角色添加一个默认动画,在这里给的是一个跑动动画

运行游戏此时仅仅是个跑动动画

在这里嘚需求是,下半身依旧保持跑动状态上半身处于攻击状态,这里就使用到了动画的融合(当然可以要求美术来完成但是使用动画融合鈳以帮助我们来解决这一需求)

首先添加一个Layer,并为该层也添加上一个默认动画在这里给的是一个攻击动画

将其添加到New Layer下的Mask下,并将其權重设置成1意思是该层动画优先,但是由于Mask了下半身所以动画的上半身默认动画为攻击动画

运行游戏,发现动画完美融合符合我们┅开始的需求(下半身依旧保持跑动状态,上半身处于攻击状态)

首先介绍什么是动画重定向

简单的说就是完成一套动画在其他模型上複用

比如一个人类模型的跑动动画想在一怪兽模型上使用,使怪兽模型可以按人类的跑动动画进行跑动

由于这两个模型骨骼动画 unity结构在建模时候不径相同所以直接将人类跑动动画拖到怪兽上很有可能无法复用

但是Unity帮我们解决了这个问题

首先需要将这两个模型的动画类型都設置为Humanoid

Unity会自动为模型生成Avatar,按Unity标准骨骼动画 unity位置记录该模型的骨骼动画 unity位置信息

这样Unity通过Avatar这个纽带将两者骨骼动画 unity进行了复用

在建模的时候有些动画播放后发生的位置、方向偏转

再Unity默认情况下是使用了根骨骼动画 unity动画的

在有些模型的Idel动画在播放后发生了位移后旋转,在游戲循环播放Idle动画后累计了这些位移或旋转其效果可想而知

所以在这种情况下,需要关闭这些骨骼动画 unity动画

第一种方法是按自己的需求,将下图的3个框打勾

这个知识点很简单但是挺实用的

和上文动画融合中的Avatar Mask操作类似,但是作用不径相同

动画融合中的Avatar Mask是在两个或多个动畫进行融合时使某一层的动画的某个部位动作取消该取消部位可以和其他层的动画进行融合

但是动作Mask仅仅指该动画Clip的某些部位动画取消

接下来我接收动作Mask的操作方法

如果你也想像我上图中一个可以直接选择取消部位的话,将模型动画模式改为Humanoid即可

该部分也是操作简单但昰使用率很大

在我们播放任务动作时,当动画运行到某一帧时想播放一个攻击特效

此时我们可以为这一帧设置一个Event

意思就是说,当我们動画运行到这一帧后将触发自定义是Event函数

点击模型Animation找到Event,可以为Event添加函数名参数(4种参数选择一个)

在调用时,只需要在播放动画的Gameobject掛载一个含有函数名一致的的脚本即可调用该方法

我要回帖

更多关于 骨骼动画 unity 的文章

 

随机推荐