尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

CocosBuilder 3.0可视化编辑器实战:ccbi资源与Cocos2d-x UI开发

CocosBuilder 3.0可视化编辑器实战:ccbi资源与Cocos2d-x UI开发 简介CocosBuilder3.0是面向Cocos2d-x引擎的图形化2D场景编辑器定位于帮助游戏开发者、UI设计师及小型团队在少写代码的前提下完成场景搭建、资源管理与交互事件绑定从而提升研发效率并降低入门门槛。压缩包采用zip格式共含933个文件整体仅8.46MB文件类型覆盖plist配置、nib界面定义、png图片素材、strings本地化文本、h头文件以及ccb场景文件等可支撑编辑器运行、示例查阅与二次开发参考。目前已有347人浏览学习既适合刚接触Cocos2d-x的初学者也适合需要快速搭建UI原型与场景模板的团队借鉴。包内除了macOS平台的可执行主程序外还附带多个可打开的示例场景及粒子系统、菜单、标签等常见组件演示便于直观理解CocosBuilder的工作流与节点组织方式。该工具曾被Zynga用于Dream PetHouse、Zynga Slots等项目的实际生产中其3.0版本在性能与兼容性上均有优化对学习引擎工具链与可视化编辑思路具有借鉴意义。 做Cocos2d-x项目有些年头的人大概都听过CocosBuilder 3.0这个名字。很多人接手老项目时打开资源目录都会看到一堆ccb/ccbi文件那就是这个可视化编辑器的产物。CocosBuilder 3.0是Zynga开源的可视化场景编辑器主打所见即所得直接把控件拖到画布上排位置、调层级、做动画然后导出成ccbi文件给引擎加载省掉大量手写坐标和反复编译的苦力活。这篇文章我按自己的实际使用经验从定位、核心功能到接入流程和踩坑记录完整讲一遍适合正在做Cocos2d-x 2.x老项目、维护历史代码或者对可视化编辑器设计思路感兴趣的朋友参考。1. 项目定位CocosBuilder 3.0 是什么解决了什么问题1.1 没有可视化编辑器之前大家是怎么写UI的在说CocosBuilder 3.0之前先聊聊没有它的时候一个Cocos2d-x开发者的日常有多难受。那时候最普遍的做法是在代码里创建所有UI元素比如一个按钮要写创建、设置位置、设置锚点、设置点击回调、添加到父节点全部靠手。做一张稍微复杂点的主界面光setPosition就能写几十行而且位置全靠肉眼估改一次编译一次到了真机上往往又是另一番光景。这其实不只是效率问题更是协作问题。美术和策划调界面时总不能每次都来改代码。程序帮忙调了一版策划觉得按钮应该再往左挪一点美术觉得字体大小不合适来回几次就崩溃了。所以可视化编辑器的需求一直存在CocosBuilder 3.0就是在这个背景下流行起来的。它把节点树的构建、属性设置、布局调整甚至动画关键帧全部搬到了图形化界面里直接用鼠标拖拽改完立刻能看到效果导出后交给程序集成到项目里。1.2 CocosBuilder 3.0 在技术栈里的位置CocosBuilder 3.0对应的是Cocos2d-x 2.x时代也是这个开源项目最后的一个大版本后面因为官方推出了Cocos Studio再后来是Cocos CreatorCocosBuilder逐渐退出了主流。但很多老项目里的ccb资源依然是基于CocosBuilder 3.0制作的而且后面其它编辑器在设计上大量借鉴了它的思路所以理解这一代工具的运作原理对阅读历史代码和做技术选型都很有帮助。顺便说一句如果你现在要新开项目我肯定不建议再回头用CocosBuilder 3.0官方早已停止维护对高分屏和现代引擎的支持也有问题。但如果项目里已经有大量ccbi资源或者你正在维护一个使用Cocos2d-x 2.x的老游戏那么这套工具链是绕不开的。我当时就接手过一个运营了好几年的老项目里面几十个ccbi文件都是CocosBuilder 3.0排出来的为了改一个商城界面硬是把这套工具从角落里翻出来重新熟悉了一遍所以下面这些经验都是实打实从项目里摸出来的。2. 核心功能拆解编辑器凭什么能提高效率2.1 场景节点树所见即所得的基础CocosBuilder 3.0最核心的设计就是“节点树”概念。整个场景就是一棵节点树根节点下面可以挂很多子节点每个节点可以是普通节点、精灵、按钮、标签、粒子、滚动视图等等。你在左侧的层级面板里拖拽调整父子关系和绘制顺序右侧的画布上实时刷新效果这比代码里addChild来得直观太多。我最喜欢的是它支持多选和批量编辑。比如一排菜单按钮在画布上框选后可以直接在属性面板里统一设置宽度、位置偏移、锚点和对齐方式这在代码里反而要循环处理。属性面板里基本覆盖了CCNode类的所有常用属性位置、缩放、旋转、锚点、透明度、可见性、颜色混合以及一些特殊控件独有的属性比如CCControlButton的标题、背景图、字体大小CCScrollView的滚动方向和是否弹性等等。这种“改属性即时看效果”的体验能让人明显感受到可视化编辑器在UI开发上的优势。每个ccb文件本质上保存的就是节点树的序列化数据。导出的时候如果选ccb格式是偏文本的格式方便调试和看diff如果选ccbi格式就是压缩过的二进制体积小加载快正式发版一般用ccbi。CocosBuilder 3.0还支持嵌套ccb文件也就是一个场景里可以实例化另一个ccb文件作为子节点这在实际项目里非常适合做复用模块比如一个通用的能力图标组件、一个血条组件编辑一次到处引用。2.2 时间线动画把动画做进了编辑器除了静态布局CocosBuilder 3.0还附带了一个相当灵活的时间线动画系统。你可以在编辑器里选中任意节点给它添加关键帧关键帧能记录的属性包括位置、缩放、旋转、透明度、颜色等然后时间线会自动补间形成平滑动画。比如一个按钮的淡入效果只需要在起始帧把opacity设为0在结束帧设为255中间动画它自己算出来不需要写任何Tween代码。时间线上还支持多个动画序列。一个场景里可以定义多条序列比如idle、show、hide、refresh每个序列拥有独立的关键帧运行时可以通过代码播放指定序列也可以通过事件触发。这个设计对界面进出场动画特别实用比在代码里到处写动画回调优雅得多。更妙的是动画序列里还可以插入CCCallback回调事件在某个时刻触发一个代码方法。这意味着你可以在编辑器里把“播放到一半时调用某个逻辑”这件事安排好不用在代码里跟踪动画进度。我经常用它来做引导流程先播放手指点按的动画动画播到某个节点时触发气泡弹出整个节奏在编辑器里就能反复调试非常舒服。2.3 多分辨率适配方案CocosBuilder 3.0在设计时就考虑了多分辨率适配问题这也是它比早期手写坐标时代先进很多的地方。它可以设置设计分辨率和对应的屏幕适配策略然后预置多个设备下的预览效果。你在编辑器里排版时可以选择“固定宽度”“固定高度”或者“按比例适配”等模式节点会自动按照屏幕长宽比进行布局调整。这个适配逻辑的核心是理解“参考分辨率”和“位置对齐”的关系。比如一个顶部标题栏在固定高度适配下无论屏幕宽度如何变化它都能自动居中在屏幕顶部不会跑偏。CocosBuilder 3.0里还有“相对位置”的选项例如让节点相对于父节点右上角对齐这样在宽屏和窄屏上就能自动保持正确的边距。不过要注意这种自动适配并不是万能的尤其是背景图和需要扩展区域的元素处理不当就会出现拉伸或边缘露白。我一般会在编辑器里同时切换几个预置设备尺寸预览一遍确认没有明显布局问题再导出。3. 实操从空场景到完整的注册界面3.1 环境准备与工程创建CocosBuilder 3.0当年支持Mac和Windows我实际用得最多的是Mac版因为和Xcode配合起来比较顺手。安装好之后第一次启动会让你创建新工程这时要指定两个关键目录一个是资源目录也就是你存放png、plist等素材的地方另一个是发布目录也就是导出ccbi文件的输出路径。这两个目录建议都放在Cocos2d-x工程的Resources目录下或者放在一个能在工程里同步引用的位置。我当时习惯把资源目录和发布目录都指向工程目录下的Resources/ccb这样导出后直接能在Xcode的资源列表里看到新生成的文件不用再手动拷贝。创建完成后我会先在“项目设置”里把设计分辨率写清楚比如960x640或者1136x640同时把需要适配的设备比例加进去。然后新建一个ccb文件。新建时会让你选择根节点的类型一般选CCNode或者CCLayer。如果这个界面要处理触摸事件我一般选CCLayer因为后面方便挂自定义逻辑类。根节点的内容大小也设置成和设计分辨率一致这样画布上看到的范围就是最终游戏画面的范围。3.2 界面搭建与属性设置以一个注册界面为例我在CocosBuilder 3.0里搭界面的过程大概是这样的先把背景图拖进画布设置大小为屏幕尺寸锚点调成(0,0)位置设为(0,0)这样背景就铺满整个设计区域。接着拖入返回按钮、标题标签、输入框背景、确认按钮等按照UI原型图摆放好位置。摆放过程中我习惯先把锚点统一调好而不是一直依赖坐标微调。比如按钮锚点设在(0.5,0.5)这样我按中心点定位时自然居中标签则可能需要锚点在(0,0.5)让文字左对齐。锚点这些小细节在编辑器里随手改一下导出到代码后可以省很多逻辑因为运行时你拿到节点的位置就是编辑器所见的位置。关键的一步是设置“代码连接”。如果需要某个对象在运行时绑定到代码里的成员变量就在属性面板的Code Connections里设置Doc root var或Member variable名称。例如我把根节点命名为registerLayer再把确认按钮命名为confirmButton这样在代码里就能通过成员变量直接访问到这个按钮。这套机制是利用CCBReader的成员变量绑定功能实现的它会在加载ccbi时自动把同名的节点指针赋值给你的成员变量。3.3 动画序列与回调绑定界面静态部分排好后我开始加动画。在时间线区域新建一个show序列然后选中最外层的容器节点在第0帧记录初始位置和透明度在第0.3秒记录目标位置和透明度形成淡入上移的效果。再把容器里的子元素分别做一点偏移和延迟让它们依次浮现这样整个界面看起来有层次感而不是一坨一起冒出来。接下来做回调绑定。CocosBuilder 3.0里给CCControlButton指定回调的方法是选中按钮在Code Connections面板里设置Selector名称比如onConfirmClicked:。注意这个selector名字必须和代码里实现的方法名一致。然后在代码里实现对应的selector解析方法。下面这段代码是我在Cocos2d-x 2.x项目里常用的写法简单说明一下selector解析的流程// 假设注册界面根节点对应的自定义类叫 RegisterLayer bool RegisterLayer::onAssignCCBMemberVariable(CCObject* pTarget, const char* pMemberVariableName, CCNode* pNode) { CCB_MEMBERVARIABLEASSIGNER_GLUE(this, confirmButton, CCControlButton*, m_confirmButton); return false; // 如果都匹配不到返回 false } SEL_CCControlHandler RegisterLayer::onResolveCCBCCControlSelector(CCObject* pTarget, const char* pSelectorName) { CCB_SELECTORRESOLVER_CCCONTROL_GLUE(this, onConfirmClicked:, RegisterLayer::onConfirmClicked); return NULL; } void RegisterLayer::onConfirmClicked(CCObject* sender, CCControlEvent controlEvent) { // 处理按钮点击逻辑 }这里有两个容易犯错的地方。第一CCB_MEMBERVARIABLEASSIGNER_GLUE宏里第二个参数必须和编辑器里设置的名称完全一致大小写都不能错。第二onResolveCCBCCControlSelector里的selector名称也要和编辑器里填的一致而且方法签名必须是(CCObject*, CCControlEvent)写错任何一个细节加载阶段就会报错或静默失败。3.4 导出ccbi与代码加载所有东西都调整完毕后执行导出。CocosBuilder 3.0会检查当前ccb里的资源引用是否完整有问题会提示。导出成功后发布目录下会生成一个同名的.ccbi文件以及可能有配套的plist和png资源文件。下一步就是引擎侧加载。在Cocos2d-x 2.x里加载ccbi的代码通常长这样#include cocos-ext.h using namespace cocos2d; using namespace cocos2d::extension; CCScene* RegisterScene::createScene() { CCScene* scene CCScene::create(); CCNode* node CCBReader::nodeGraphFromFile(RegisterScene.ccbi, this); scene-addChild(node); return scene; }这里第二个参数传this是允许CCBReader把selector和成员变量绑定到当前类实例上。如果你新建的ccb没有绑定任何自定义类也没有selector那么直接传NULL也行。加载成功后节点树会完整恢复所有在编辑器里排好的子节点、动画、回调都会自动生效。动画可以通过CCBAnimationManager来播放比如拿到manager后执行runAnimationsForSequenceNamed(show)。4. 常见问题与排查技巧实录4.1 版本不匹配导致的编译错误我踩过最多的坑其实是版本匹配问题。CocosBuilder 3.0需要配合Cocos2d-x 2.1以上的版本使用但具体到2.2.x和2.3.x头文件路径和类名有细微差异尤其是在cocos-ext.h的引用方式上。有些老项目用的CocosBuilder版本更早导出的ccbi拿到3.0里又无法打开。后来我总结的解决方案是统一编辑器版本和引擎版本尽量用同一套官方示例中使用的组合。在代码里CocosBuilder相关类和宏基本都位于cocos2d::extension命名空间下编译时如果报类找不到先检查是否已经include了cocos-ext.h并链接了libExtensions库。这个库在Xcode工程的cocos2d-ext目录下有时候项目里没把这个文件加进编译源就会报出一堆Undefined symbol。4.2 加载ccbi后白屏、资源找不到加载ccbi后出现白屏是很多新手最常遇到的问题。主要原因大多不是ccbi文件损坏而是引用的图片资源路径不对。CocosBuilder 3.0在导出ccbi时保存的是相对路径比如common/button_bg.png引擎加载时会从资源目录下找这个路径。如果你的png文件和ccbi不在同一个可访问目录下或者工程里没有把对应文件夹添加到资源拷贝阶段就会加载失败白屏也就在所难免。解决方法也很直接先在Xcode的Build Phases里确认Copy Bundle Resources中包含了ccbi和所有依赖资源然后检查CocosBuilder工程里资源的相对路径尽量不要用绝对路径。另外路径中最好不要包含中文和空格有些老版本在真机上对这类路径处理不够好这也是个历史遗留问题。4.3 回调不触发或成员变量为空回调不触发最常见的几个原因我在帮同事排查时也都遇到过。第一selector名写错包括冒号漏写或者大小写不一致导致解析时匹配不到。第二根节点绑定自定义类的方式不对CCBReader在加载ccbi时会尝试创建你自定义类的实例如果这个类没有正确注册你会发现整个节点加载失败或者回调永远不会被调用。第三成员变量绑定时用了错误的控件类宏比如明明是CCControlButton却用CCMenuItem的解析方法同样会导致绑定失败。排查这类问题我一般会在onAssignCCBMemberVariable和onResolveCCBCCControlSelector里加日志打印出传入的pSelectorName或pMemberVariableName然后在初始化时和编辑器里设置的名字做比对。基本上打印出来就能一眼看出是哪边多打了字或者写错了大小写。4.4 动画不执行或多分辨率适配异常动画不执行通常是序列名称对不上。CocosBuilder 3.0里每个序列都有一个名字运行时通过runAnimationsForSequenceNamed来播放这个名字自然也要和编辑器里的完全一致。如果你在代码里播放show但编辑器里序列叫showAnim那自然没反应。还有一点是编辑器的“自动播放”属性如果你没有为某个序列开启autoPlay加载时就不会自动进入播放状态需要手动调用。多分辨率适配异常则往往是因为节点没有正确设置“相对位置”相关的属性。CocosBuilder 3.0里的适配策略是基于节点在父节点中的相对位置和锚点计算出来的比如靠右的节点要设置右对齐不能只是简单地把X坐标设成屏幕宽度减某个值。把适配思路从“手工计算坐标”切换到“对齐策略”是适应这套编辑器的关键一步。5. 实操过程中的一些体会与建议用CocosBuilder 3.0做了大半年老项目维护后我最直观的感受是工具虽然老了但它奠定的“编辑器即关卡/UI设计器”的思路到现在依然是主流方向。它把程序从纯坐标调试里解放出来也让策划和美术能自己动手调界面沟通成本明显降低。当然它的短板也很多比如不支持热更新时动态刷新、对复杂控件的扩展能力弱、部分接口设计比较绕这些都促成了后面Cocos Creator这类新工具的诞生。如果现在有人问我手头老项目里还在用CocosBuilder 3.0要不要迁移我的建议是如果只是小改动、只想修Bug那可以继续用毕竟迁移成本摆在那但如果规划里还有大量新功能和UI迭代那真不如趁早切入Cocos Creator或者别的支持x2.x的替代方案。编辑器本身不复杂真正难的是项目里那些依赖ccbi资源、并和业务逻辑深度绑定的加载流程这部分迁移起来远比想象中麻烦。最后分享一个小技巧在CocosBuilder 3.0里做的任何修改导出前建议先回到引擎工程里重新跑一遍全量编译因为ccbi加载是运行时行为很多资源路径错误只有跑到真机上才能暴露出来。我习惯把编辑器工程和引擎工程放在同一个大的项目目录下导出后顺手提交到版本库这样每次改动都能清晰追踪哪些ccbi文件变了配合代码review一起看能避免很多莫名其妙的线上UI问题。本文还有配套的精品资源点击获取
返回列表