根据creator的龙骨组件来看的话添加一个龙骨的话需要设置五个地方,分别是DragonAsset(龙骨的配置json文件),DragonAtlas(龙骨的纹理json资源),Armature(Armature名称),Animation(Animation名称),playTimes(动画的循环次数)。
如果只是播放一个单一的龙骨的话直接把资源拖到相应的位置,设置一下动画然后就ok了,但是需要切换不同的龙骨的资源的时候要咋办?按照我的经验来说的话有如下三点可以解决:
- 制作成预制资源,在需要的时候加载不同的预制体。
- 事先把每个需要用到的龙骨附加到不同的节点,然后根据需要哪个龙骨进行显示跟隐藏。
- 动态加载龙骨,利用一个DragonBones组件,当需要不同的龙骨资源的时候动态加载龙骨资源并附到组件上面。
分析上面三点的话,肯定是3最省事省心,1跟2的话没有什么难点,无非就是控制好加载哪个预制体,控制哪个节点的显示。接下来就说说如何实现动态加载龙骨。
动态加载龙骨的思路:利用loader加载需要用到的龙骨资源,然后把需要用到的资源赋值给龙骨组件,设置好各项的参数。
代码如下
/**
* 动态加载龙骨
* @param animationDisplay 龙骨组件
* @param path 龙骨地址
* @param armatureName Armature名称
* @param newAnimation Animation名称
* @param completeCallback 动画播放完毕的回调
* @param playTimes 播放次数 -1是根据龙骨文件 0五险循环 >0是播放次数
*/
loadDragonBones(animationDisplay, path, armatureName, newAnimation, completeCallback, playTimes = 1) { //动态加载龙骨
cc.loader.loadResDir(path, function(err, assets){
if(err || assets.length <= 0) return;
assets.forEach(asset => {
if(asset instanceof dragonBones.DragonBonesAsset){
animationDisplay.dragonAsset = asset;
}
if(asset instanceof dragonBones.DragonBonesAtlasAsset){
animationDisplay.dragonAtlasAsset = asset;
}
});
animationDisplay.armatureName = armatureName;
animationDisplay.playAnimation(newAnimation, playTimes);
animationDisplay.addEventListener(dragonBones.EventObject.COMPLETE, completeCallback);
})
}
在实现的过程中遇到的几个坑记录一下,一个是armatureName跟Animation一定要一起设置,设置一个的话是不起作用的。用animationDisplay.playTimes = 1的方式设置播放次数也是不起作用,必须要在playAnimation方法里面设置才生效。