如何较为优雅地实现新手引导功能?

file

早期的项目中晓衡遇到游戏终于要完成了,辛苦了一阵满觉得能够稍微放松一下了,但策划、运营要求,增长一个他们认为很是“简单”且重要的功能:新手引导html

回想起当年,接到这个任务时的感受是手脚冒汗、天晕地暗、日月无光,游戏代码原本就千疮面孔,逻辑错综复杂,根本不知道该怎么下手?更困难的是,游戏自己功能和需求还不稳定,老板随便一个想法可能就会被改、改、改...,我该怎么办?git

在这种情艰难的状况下必定要,须要保持冷静,在痛定思痛以后,我开始了引导功能的开发,在作的过程当中不断积累,编写了一套配置式、可编程的引导框架,而后交给其余开发人员或策划人员作具体的引导内容,真的是:“杀不死你的会使你更强大”github

实现新手引导的困难

一般实现新手引导的困难在于,它与当前需求、功能密切相关,并且稍有不甚连正常流程都走不通,下面一块儿看看新手引导到底有那些痛点。编程

开发中的痛点

  1. 须要在正常流程中插入引导代码,干扰流程;
  2. 引导代码的增长会影响原有代码逻辑,增长维护难和成本;
  3. 界面或需求的变化会致使引导功能大幅修改,甚至从新制做;
  4. 手指提示对应的矩形区定位麻烦,不能简单使用固定的位置和矩形大小;
  5. 编写引导的代码也很困难,须要策划—程序之间高度配合。

指望的编程体验

在了解到传统的引导制做过程当中的难点与弊端后,一直在思考没有更好的实现方式,我心中的引导功能的编程方式但愿有如下几点:数组

  1. 引导功能代码,不能混入正常游戏逻辑代码中,后患无穷,应尽可能分离;(难以忍受优雅的代码被无情的打乱,更难忍受糟糕的代码被弄的支离破碎)
  2. 界面只发生简单的UI位移、Size大小、节点层次的调整,不须要修改具引导代码;
  3. 定位UI指引矩形区域应尽量简单,能自适应不一样的屏幕尺寸;
  4. 最好能作到策划人员均可以来制做部分流程引导;
  5. 在引导需求明确、游戏功能正常的状况下,制做一个常规的引导步骤应该很是快捷。

下面是我使用Cocos Creator 官方 demo-ui 工程上嵌入的引导案例演示:浏览器

demo体验地址:
http://game.ixuexie.com/godGuide框架

这里有一个视频演示:
https://www.bilibili.com/video/av60001770/ide

框架要点

演示中的引导操做,是使用下面JSON配置进行控制:测试

module.exports = {
    name: '进入商店',
    debug: true,
    autorun: true,
    steps: [
        {
            desc: '文本提示',
            command: { cmd: 'text', args: ['欢迎体验Shawn的新手引导框架', '本案例演示:\n1.文本提示指令\n2.手指定位指令\n3.自动执行引导\n4.点击操做录像', '首先,请点击首页按钮'] },
        },

        {
            desc: '点击主界面主页按钮',
            command: { cmd: 'finger', args: 'Home > main_btns > btn_home'},
            delayTime: 0.5,
        },

        {
            desc: '文本提示',
            command: { cmd: 'text', args:  '点击主界面设置按钮' }
        },

        {
            desc: '点击主界面设置按钮',
            command: { cmd: 'finger', args: 'Home > main_btns > btn_setting'},
        },

        {
            desc: '文本提示',
            command: { cmd: 'text', args: '点击主界面商店按钮' }
        },
}

配置中的重点是 steps 数组项目,其中的 desc 是引导步骤的描述,主要用于调试,command是引导指令,这里实现的是一个手指指示指令:finger, 后面的args是指令参数,借助CSS中的选择器概念,我这里简单实现了一个节点获取的方法,称之为:定位器ui

定位器

点定位器的概念,其实它很是简单,以下图所示:

file

你可能会想到,引擎提供的 cc.find 就搞定,代码以下:

cc.find('Canvas/Home/lower/main_btns/layout/btn_home')

节点路径字符串能够精肯定位到 btn_home 节点,但在实际使用中时会感受很繁琐:

  1. 字符串太长,容易出错;
  2. 节点名字、层级变化,节点路径字符串就失效了,容易被误伤。

为了使路径表达更简洁可靠,笔者引入了两个定位符号:

/: 右斜杠,表明1级子节点(与cc.find相同)
>: 大于符号,表示1~n级子节点

能够将上面btn_home节点的定位符改成

godGuide.find('Canvas > btn_home');

若是咱们默认从Canvas节点开始检索,也能够直接写成下面这样:

godGuide.find('btn_home');

这样将从 Canvas 节点一层层开始遍历,想提升检索节点的效率能够改成:

godGuide.find('Home > main_btns > btn_home');

若是场景中有同名节点,也可使用 '>'符号解决,但同一层级不能有同名节点(若是你须要检查的话)。

自动引导

引导的测试工做效率低下,既然有了可配置的引导,可否让它自动去执行呢?看下面视频:
file

https://v.qq.com/x/page/v3017l51xep.html

晓衡最先只是在浏览器上实现了鼠标的点击模拟,后来扩展到了原生App上也可使用。 自动引导,能够方便对引导流程的测试和验证。

流程录制

引导的核心是获取目标节点,咱们是经过手写节点定位器(一种简化的节点路径表达方式)获取节点。若是实现一个功能,记录下咱们点击的节点路径,是否能够实现自动生成引导流程呢?而后再让它自动播放出来?

file

结语

新手引导框架已经开源,而且支持最新版本的 Cocos Creator 2.2.0 下,Github仓库地址献上:
https://github.com/ShawnZhang2015/GodGuide

原创不易,若是以为有帮助,请点个赞吧!

相关文章
相关标签/搜索