注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

穷到掉渣的超级奶爸阿赵

阿赵的博客

 
 
 

日志

 
 

在Unity3D引擎里使用DragonBone(龙骨)2D骨骼动画  

2016-10-22 13:44:47|  分类: Unity教程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
之前阿赵我在博客上面介绍过在unity3d里面使用Spine骨骼动画。实际上现在Unity上面开发2D游戏的人非常多,所以2D动画非常受到用户关注。现在Unity3D上面做2D骨骼动画的插件也挺多的。最近,老牌2D骨骼动画解决方案DragonBone(龙骨)也推出支持Unity3D的库,意味着我们也可以在Unity3D里面使用龙骨了。龙骨的优点是有强大的动画编辑器,和可以跨多个平台使用。龙骨的unity支持插件是最近才推出的,阿赵尝了个鲜,下载来用了一下,并做了一些分析。
如果不了解龙骨的朋友,可以去他们的官网看看:
http://dragonbones.com/cn/index.html#.WArsoHEYzRI
上面有视频介绍龙骨的编辑器使用和游戏中的效果
在Unity3D引擎里使用DragonBone(龙骨)2D骨骼动画 - 阿赵 - 穷到掉渣的超级奶爸阿赵 
在Unity3D引擎里使用DragonBone(龙骨)2D骨骼动画 - 阿赵 - 穷到掉渣的超级奶爸阿赵
如果以前用过龙骨的朋友估计对这只小龙会挺有印象的。
 
在Unity3D引擎里使用DragonBone(龙骨)2D骨骼动画 - 阿赵 - 穷到掉渣的超级奶爸阿赵
这是龙骨的动画编辑器。不过这次我不打算去研究龙骨编辑器的用法,只针对龙骨在unity里面的使用情况进行一些尝试。
 
以下是我在试用之后的一些体会:
一、龙骨在Unity内的表现
龙骨的demo里面带有多个范例,包括了动画播放、换装、控制等等,个人感觉表现力挺不错的,有兴趣可以自己下载来运行看看。
在Unity3D引擎里使用DragonBone(龙骨)2D骨骼动画 - 阿赵 - 穷到掉渣的超级奶爸阿赵
换装和控制的demo 
在Unity3D引擎里使用DragonBone(龙骨)2D骨骼动画 - 阿赵 - 穷到掉渣的超级奶爸阿赵
 同屏多角色的demo

二、对龙骨的资源的一些解释:
在Unity3D引擎里使用DragonBone(龙骨)2D骨骼动画 - 阿赵 - 穷到掉渣的超级奶爸阿赵
从龙骨里面导出的文件,会有三个,分别是骨骼配置(skeleton.txt)、图集配置(texture.txt)和图集图片(texture.png)
这些文件的格式并不是针对unity的,而是通用的,配置文件是json,然后图片是png。这就是跨平台的用法,在不同的平台可以用通用的动画数据。

看看详细的数据结构:
这是skeleton.txt里面的内容:包括了版本号、骨骼名称、角色骨骼支架(armature)信息和帧率
 在Unity3D引擎里使用DragonBone(龙骨)2D骨骼动画 - 阿赵 - 穷到掉渣的超级奶爸阿赵

接下来详细看看armature的信息:一个armature其实就是一个独立的角色了。这里看到这种结构的原因,说明了龙骨里面,一个skeleton.txt骨骼里面可以包含多个不同的角色,他们是用同一张图集的。
 一个armature里面会包含蒙皮信息(skin)、动画信息(animation)和骨骼信息(bone)

在Unity3D引擎里使用DragonBone(龙骨)2D骨骼动画 - 阿赵 - 穷到掉渣的超级奶爸阿赵
蒙皮信息

 
在Unity3D引擎里使用DragonBone(龙骨)2D骨骼动画 - 阿赵 - 穷到掉渣的超级奶爸阿赵
动画信息
 
在Unity3D引擎里使用DragonBone(龙骨)2D骨骼动画 - 阿赵 - 穷到掉渣的超级奶爸阿赵
骨骼信息
骨骼动画的原理我之前也有介绍过,对于骨骼动画有了解的朋友应该都知道这三个数据是做什么用的。骨骼是一个角色骨架在初始蒙皮状态时候的骨骼位置,蒙皮信息是网格模型皮肤在蒙皮状态时候相对骨骼的位置,还有受到骨骼影响的权重大小。动画信息是每一个关键帧里面骨骼对应的矩阵变化,简单来说就是位移旋转缩放之类的信息。当需要播放骨骼动画的时候,会根据动画信息算出每根骨骼当前帧应该在的位置,然后网格模型皮肤根据蒙皮信息得出网格模型当前帧需要的位移旋转缩放或者形变的情况,然后渲染出来。


 接下来是图集图片的配置数据:里面包括了图片对应角色的名称、图片的路径,还有图集里面每一张小图的位置信息:
在Unity3D引擎里使用DragonBone(龙骨)2D骨骼动画 - 阿赵 - 穷到掉渣的超级奶爸阿赵
图集配置数据
 
在Unity3D引擎里使用DragonBone(龙骨)2D骨骼动画 - 阿赵 - 穷到掉渣的超级奶爸阿赵
小图片数据

图集的原理就更简单了,根据小图在大图里面的开始位置和长宽,生成出小sprite。由于这些sprite都是从同一个texture里面生成出来的,那么他们的drawcall就只有一个了。
 
三、龙骨在unity里面的用法的介绍:
下面从代码层级介绍一下龙骨在unity里面的用法。
1、加载资源
在使用龙骨播放角色动画之前,需要先把上一个部分说道的骨骼和图集的信息先加载进来。使用的api是
1.加载骨骼信息:
UnityFactory.factory.LoadDragonBonesData(骨骼文件(skeleton.txt)在resources里面的相对路径,角色名称)
2.加载图集信息:
UnityFactory.factory.LoadTextureAtlasData(图集配置文件(texture.txt在resources里面的相对路径,角色名称

加载角色里面有一个角色名称的参数,这个参数是可以不传进去的,因为骨骼和图集里面本身是有角色名称的,如果参数不传,就会以配置里面的角色名称来使用。这个名称是很有用的,如果你指定了角色名称,那么骨骼和图集的角色名称必须要一样。因为他们加载完之后是会存在factory里面的,根据角色名称来找到对应的关系。如果两者名字不一样,就找不到对应关系了。
角色名称还有另外一个用途,就是用于资源卸载的。之后会说。
2、创建角色
在确保骨骼动画和图集数据都加载了之后,我们可以创建一个角色
UnityFactory.factory.BuildArmatureComponent(armature的名称)
刚才也说过了,骨骼信息加载完是存在factory里面的,一个骨骼里面包含了多个armature,你就可以通过api把你想要的armature加载出来。这样创建的角色对象,是UnityArmatureComponent对象。就像一般的UnityComponent一样可以直接操作的一些属性,比如transform.localPosition等

3、播放动画
获得了UnityArmatureComponent对象之后,就可以直接播放它身上的动画了,用到的API就是
UnityArmatureComponent.animation.Play("动画名称");

4、换装
龙骨换装使用的是插槽的方式,先通过UnityFactory.factory.BuildArmature(weaponName)方法生成新的武器的Armature,然后通过 armature.GetSlot("骨骼名称").childArmature = 新武器的Armature

5、资源卸载
骨骼数据的卸载:UnityFactory.factory.RemoveDragonBonesData(角色名称,是否回收到池)
图集数据的卸载:UnityFactory.factory.RemoveTextureAtlasData(角色名称,是否回收到池)
看到了刚才指定的角色名称的用途了,在卸载的时候是需要用到的。然后后面有个参数是是否回收。龙骨对于这些数据是做了对象池的,默认是否回收到池是true。不过这个功能有bug。下面会说到。

四、使用龙骨的unity程序发布在手机上面的性能分析:
一开始也说到过,现在在Unity3D上面做2D骨骼的插件其实非常多,究竟哪些类型的插件会吸引我去用,主要是有那么几点的:
1、动画编辑的便捷性,也就是说是否有提供友好的编辑工具来很愉快的编辑动画
2、动画的通用性,也即是跨平台性。比如一个项目如果成功了,你会考虑移植到其他平台,比如你会想在开发了一个网页版的游戏成功了之后,把它移植到手机上,那么同样的一套美术资源,你想希望他可以直接用在unity、cocos或者html5上面。
3、运行的效率。刚才说得天花乱坠,骨骼动画的好处非常多,但如果运行效率低下,那么就什么都不必说了。
前两点,龙骨是做得非常好的。那么看看第三点效率的问题。
我把龙骨自带的多人同屏的demo修改了一下,发布成apk,分别在2台手机上面测试了一下单纯骨骼动画的效率,情况如下:
使用的就是上面截图的那个骨骼数据的角色"centaur/charactor",它有18个骨骼。
三星note3 :稳定维持60帧:同屏50个 角色
稳定维持30帧:同屏150个 角色
 红米note1:稳定维持 60帧:同屏45个角色
稳定维持30帧:同屏100个角色

由于龙骨是做2d游戏的,而2d游戏的一般帧率是不会超过30帧的,所以也就是说一般同屏角色数可以达到100个左右。但实际同屏支持数会受到多个方面的影响,比如机器的性能,或者角色骨骼数量的多少。18根骨骼对于2d游戏角色来说算是中等偏上的一个数量吧,除非需要做很写实很多细节的角色,不然一般很少用到30多根骨骼。
以前我自己写的骨骼动画框架,是用在as3上面的,如果单纯正常的播放骨骼动画,没有能达得到这样的同屏数量。但后来我是想了个办法,在加载的时候先把动画的每帧都渲染出来,然后直接播放序列帧。那样做,加载的文件还是很小,并可以做到同屏几百人,但缺点是需要的内存会增大很多,而且不能随意的换装。龙骨在兼顾多种功能的情况下能达到这种效率,我感觉算是不错。不过有空还是要拿其他几个骨骼动画插件做横向对比才能得出准确的结果。

五、存在的一些问题:
在试用的过程中,我发现了挺多问题的,估计是因为第一版的关系吧。我这里大概说一下:
1、获取骨骼数据和图集数据时候,没有做dictionary是否为空或者是否包含该key的判断,导致如果传入的名字有误会报错

2、资源加载方面用了assets路径下面的相对路径,这样会导致发布的时候可能会有问题。而且固定加载resources下面的路径也不是一个好的选择,那样做对于项目资源配置时会觉得不灵活。最好的做法是加载这一步只封装一个纯粹一点的接口,只把加载到的字符串传入,然后生成龙骨数据,至于是怎样加载路径的,可以留给用户自己去决定。

3、选择RemoveDragonBonesData回到池里面,由于调用了BaseObject的ReturnToPool方法,里面有_onClear方法是把ArmatureData的_defaultSkin置为了null,却没有把skins设置clear,,再次加载该资源时,在ArmatureData类里面的AddSkin方法,由于skins已经包含了该key,导致设置不了_defaultSkin,而在创建Armature的时候由于_defaultSkin,为空,会报错,不过就算skins设置clear了,还是有其他数据其他的数据没有清空,导致动画错乱,这个暂时没去细看

4、批量角色的创建和消耗都会比较耗时,不过这种问题可以通过游戏逻辑里面分帧处理或者在有loading条的时候再批量删除来解决

5、估计是龙骨开发人员对Unity的熟悉程度还不算高,在编写的过程中选用api方法有点随意,把一些UnityEditor的方法用上了,导致在发布的时候会出现一些问题。不过这个问题很快就修复了。


六、总结
龙骨作为老牌的2d骨骼动画解决方案,在编辑器、跨平台和功能上应该是有一定的保证的,现在刚推出的Unity的支持,其实不算完善,很多方面都有待优化。如果有兴趣的朋友可以留意一下他们的网站更新。
龙骨的unity库地址:https://github.com/DragonBones/DragonBonesCSharp
  评论这张
 
阅读(365)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016