Unity实现剧情动画方面的一些心得

发表于2017-07-24
评论0 3.2k浏览

本篇文章和大家介绍的是实现剧情动画方面所获得的一些心得,游戏里的剧情动画(cutscene)大体分为两种,播即时演算好的视频和纯即时演算。

 

巫师2,3就属于全实时演算,所以会发现很恶心的lod延时切换和建筑物生硬出现等。

而近年的游戏都属于比较常见的两者混合做法,但凡场景跨度较大,运动内容极多时以播放视频形式来呈现。一些简单对话或者运动内容较少使用即时演算

 

直接播放视频是在引擎中进行录制之后,以视频形式播放。还有一种是早期的播放CG,但已经越来越少了,主要是代入感太差

而即时演算代入感很高,它可以直接和冻结的角色做混合,但代价是运动角色数量和相机运动范围必须严格控制。

 

在Unity中时间是存在跳帧的,如果要渲染成视频,需要另写一个非跳帧的时间,用它来驱动动画播放。

如果是即时演算,这个跳帧倒是可以保证一定程度上的音画同步。

 

音画同步问题


 

1.Animation自定义time去驱动,不要用.play()。这样可以严格按照时间线来走

2.直接设置AudioSource的time,可以立即跳转到目标时间点。在做时间轴的时候可以用到这个接口,但不能实时驱动

3.AudioSource有一个velocityUpdateMode属性,经过测试Fixed和Dynamic好像没有变化,没有仔细研究。

4.上面说了跳帧虽然一定程度避免音画不同步,但最安全的做法应该是把对话切出来选好时间点播放。

 

 

关于调试


 

如果是3-5分钟或者更长的剧情动画,建议写一些工具解决调试问题

调试时FBX文件会很大,导出一次大概4-5分钟左右

并且有粒子特效和shader需要在Unity这边调,不可能说一次性导出

所以一天播放个几十遍是一件非常痛苦的事情。。。

 

对于导出速度问题,解决办法比较多,比如写一个选集的插件,导出FBX时,把需要导出的东西放到选集里

并且每次导出选集,可以把每次调试控制在1分钟之内。

 

这里有一个细节要说一下当FBX烘焙成逐帧导出后,Unity在对它进行一次删减关键帧操作,删减的误差默认0.5

这时候就会出现很奇怪的事情,比如某个动画不对了或者丢掉了。。所以需要注意下,把误差设为0,只删减不压缩

 

目前也有一些很黑科技的做法,比如用abc作为输出格式。没太多研究


最后最好是再做一个时间轴的工具,因为Animation提供的时间轴预览实在太卡了,而且也无法重播特效之类的

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

标签: