Unity模型和动画拆分与运行时加载动画资源

    这两天一直在研究Unity里将模型资源与动画资源拆分,分开加载,并实现在运行过程中,动态的加载、播放模型动画。起因是我们AI智能模型内容越来越丰富,导致包含的动画数量众多,模型包越来越大,但考虑到实际用户玩一个模型未必会要用到所有的动画资源,所以产生了将模型资源与动画资源拆分的想法。考虑到我们模型的动画既使用了旧版的Animation动画,又使用了新版的Animator状态机动画,经过我再网上的搜索,关于这两种动画能否动态加载的文章比较少,有些说的也不是很清楚,所以我自己写了一些测试程序验证了一下,这里写一篇博客总结一下。
    首先,我们都知道给Unity做动画的动画师在导出资源时通常有两种方案,一种是一个FBX里既包含了模型又包含了所有的动画,还有一种是导出很多FBX,其中既有模型本身,也有这个模型所使用的动画,是多个文件。我之前使用的是第一种方案,原因是使用起来比较方便。现在由于需要将资源拆分,那么肯定是改用第二种方案,不过考虑到动画的复用,就需要模型骨骼名称和绑定等保持一致。然后将动画资源与模型资源分别打成AssetBundle,再在运行时动态加载,另外说一个在加载时遇到的小坑,就是有可能动画fbx的名称和fbx里面实际的动画名称不一致,比如fbx是叫walk,里面的动画叫Take 001,那么当我们在加载动画资源时,例如:
    AnimationClip loadedAnim = ab.LoadAsset<AnimationClip>("Take 001");
这样是加载不到里面的动画资源的,也就是说LoadAsset里传入的这个字符串参数实际是你本身资源的名称例如叫walk那就是walk,而不应该使用Take 001。然后再通过调用Animation组件里的AddClip 和 Play来增加和播放对应的动画就可以了。但是之前说的都是基于旧版的Animation动画的,对于新版的Animator是不适用的,因为Animator是基于AnimatorController状态机来驱动动画的,而即使能够在运行时获取到当前正在播放的Animator动画,但是你却无法动态的替换它(没有相应的API)。那么考虑到这种的话,就只能创建多个AnimatorController然后分别打包成AssetBundle。然后在运行期间动态的替换AnimatorController,这个是可以实现的。所以如果使用的是新版Animator动画的话,在动态的替换动画资源这里是有一定的局限性的。
   以上就是我要分享的动画和模型拆分的方法,考虑到这些其实属于Unity的资源规划范畴,本应事先做好,但项目的发展总是有它自己的特殊性,经常会有一开始没有这样的需求,在做的过程中满满的发现需要了,再添加进去,但事实上,资源规划做的越好越早,制订好规范的美术流程,对于项目有条不紊的进行是有很大帮助的。

fantasycoding.net 2016-2024 © All rights Reserved京ICP备2020039454号-1