Egret社区

db动态换装疑问

2017-10-27 11:17
21863
根据例子:https://github.com/DragonBones/DragonBonesJS/blob/master/Egret/Demos/src/demo/ReplaceSlotDisplay.ts
https://github.com/DragonBones/DragonBonesJS/blob/master/Egret/Demos/src/demo/ReplaceSlotDisplay.ts
局部换官方建议是用 factory.replaceSlotDisplay,个人认为非常不好友



问题:
    1.dragonbone 没办法导出没有引用的纹理,那就是必须用至少两份纹理达到一个换装效果,从而产生增加drawcall的开销
    2.制作繁琐,多个文件,而且换装部件不能在可视化中预览整体效果
    3.支持性不好,如果是spine中转过来的换肤,基本报废
    4.代码繁琐,必须指定出很详细的脉络 ps:工程名字/骨架名字/插槽名字/图片名字


分享到 :
0 人收藏

3 个回复

倒序浏览
duanchunlei  官方团队 | 2017-10-27 14:47:21
本帖最后由 duanchunlei 于 2017-10-27 14:58 编辑

非常感谢你的反馈
1)虽然 dragonbones pro 无法导出没有引用的纹理,但是只需要引用一下即可,就是新建一个无关紧要骨架,将所有需要导出的图片通通丢进这个骨架里去,这样就会导出了,这个操作很简单,不知道是否使用过 flash,就像 flash 新建元件一样,这样 draw call 就是 1。(不过通常换装资源肯定是离散分开的,这时候就要分工程,当然分与不分就看开发需求)

2)这个是局部换装的例子,通常这种局部换装是用来更换大量的制式武器装备等,就是图片素材已经是由原画设计定稿了的,好不好看已经定型了,通常只需要配置或修改锚点数据,比如配置大量的刀,只需要配置刀柄的锚点位置即可。

3)dbpro 还不支持制作多皮肤,但是 db 运行时是支持的,也就是说利用 db 的批量转换工具来转换 spine 的文件为龙骨文件,就可以在龙骨运行时支持皮肤(工具地址

4)这也是为了适应更多的开发需要,而且确定唯一资源,就是需要这样的数据名称,因为这里重要的数据有两种,分别是图片名字和锚点位置,所以完全可以让图片同名但锚点不同(db/armature/slotA/display 和 db/armature/slotB/display 的区别),不提供完整的路径名,会导致图片同名而无法查找到正确数据(就好像全盘搜索 Main.ts 文件一样,一定会找出一堆的),当然如果你有更好的建议,也非常欢迎提出来一起讨论。

5)龙骨也支持全局换装,也就是按照皮肤换装,这个方案是用来支持你说的不能预览的问题的,所以上面的 2 和 3 问题其实是不完全成立的。在线例子程序源码 以及 美术源码
可以看到这里 api 一句就搞定(局部换装也是一句 api 就搞定,仅仅是提供一个路径其实完全不繁琐的),并且全局换装也非常灵活,皮肤里只有一个附件,其实就相当于换局部,而且换的时候还可以指定哪些装扮是需要排除的,这都很贴心不是吗?:)




ZhuoJianHuang  登堂入室 | 2017-10-27 16:48:11
duanchunlei 发表于 2017-10-27 14:47
非常感谢你的反馈
1)虽然 dragonbones pro 无法导出没有引用的纹理,但是只需要引用一下即可,就是新建一 ...

感谢回复解惑
1.角色换装,是应该分工程。但是一些特效之类的,例如一个复杂的片头特效,只是场景名字资源不一样,或者icon资源不一样,那么就最好是一个工程中解决最好。 所以最好是dbpro支持制作多皮肤。出个api切换皮肤使用组。
这样做就可以就使用一纹理,不用增加drawcall,又能达到纹理最少化。而且不需要在代码指明详细路径(毕竟美术从业者,对于命名还是相当随意的)
2.主题上说的spine转db,是说带已带有换装的spine文件,转进dbp,只能解析读取到一套动作。dbpro不支持spine的换装
3.亲试 db 的批量转换工具,通过 2db -t spine 命令,转出来的db没有导入dbpro转换出来的准确,部分spine会出现错乱,具体原因不明。另外2db 没有从新命名参数? -o 只是指定path??
duanchunlei  官方团队 | 2017-10-30 09:57:08
本帖最后由 duanchunlei 于 2017-10-30 10:10 编辑
ZhuoJianHuang 发表于 2017-10-27 16:48
感谢回复解惑
1.角色换装,是应该分工程。但是一些特效之类的,例如一个复杂的片头特效,只是场景名字资 ...

dbpro 确实不支持制作多皮肤,但是 db 运行时为了帮助 dbpro 实现皮肤功能,实现了皮肤共享功能,也就相似骨架之间可以共享皮肤,而这些骨架是否制作在同一个工程中,完全取决于开发者,(同一个龙骨工程可以包含多个骨架的,想  drawcall 是 1,就可以做在同一个工程里,想分资源就做在不同的工程里,很灵活),而切换皮肤的 api 上面的第一个回复已经写出了使用方式,很简单的。参考如下伪代码:

factory.loadDragonBonesData("projectA");
factory.loadDragonBonesData("projectB");
let armatureA = factory.buildArmatureDisplay("armatureA", "projectA");
let skinDefault = factory.getDragonBonesData("projectA").getArmature("armatureA").getSkin("default"); // 假设是 spine 数据则可以包含多皮肤
let skinA = factory.getDragonBonesData("projectA").getArmature("armatureA").getSkin("spineSkinA"); // 假设是 spine 数据则可以包含多皮肤
let skinB = factory.getDragonBonesData("projectA").getArmature("armatureB").getSkin("default"); // 同工程的皮肤共享
let skinC = factory.getDragonBonesData("projectA").getArmature("armatureC").getSkin("default"); // 同工程的皮肤共享
let skinAP = factory.getDragonBonesData("projectB").getArmature("armatureA").getSkin("default"); // 不同工程的皮肤共享
let skinBP = factory.getDragonBonesData("projectB").getArmature("armatureB").getSkin("default"); // 不同工程的皮肤共享

// 一个 api 换肤
factory.changeSkin(armatureA, skinDefault); // 想换哪个皮肤都可以
factory.changeSkin(armatureA, skinA); // 想换哪个皮肤都可以
factory.changeSkin(armatureA, skinB); // 想换哪个皮肤都可以
factory.changeSkin(armatureA, skinC); // 想换哪个皮肤都可以
factory.changeSkin(armatureA, skinAP); // 想换哪个皮肤都可以
factory.changeSkin(armatureA, skinBP); // 想换哪个皮肤都可以

db 转换工具将 spine 转换成 db 的方式,是最大限度保留 spine 数据,但是因为 dbpro 暂时不支持 spine 的缩放和图片旋转(这里 dbpro 的贴图旋转算法有错误)所以转出的 db 数据在 dbpro 里查看是各种不行,暂时没法二次编辑,我们会在后续的 dbpro 版本中修复这个问题,你可以将 spine 转换后的 db 数据拖拽到这个查看器这个查看器查看效果(三个文件同时选中拖拽到窗口内即可)
如果仍有什么疑问,或者建议,非常欢迎继续讨论。






您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|京网文[2014]0791-191号|京ICP证150115号|Egret社区 ( 京ICP备14025619号 )

Powered by Discuz! X3.4 © 2001-2019 Comsenz Inc.

返回顶部