从零开始设计游戏引导框架(一)

背景叨叨叨

大学毕业后入坑Cocos游戏开发已经快三年了,参与了两三个游戏的开发,经历过三四次颠覆式的版本迭代,其中涉足最深的莫过于游戏引导框架的设计开发,一路走来踩过许多坑,感觉有必要写一个引导框架设计的系列博客,就叫《从零开始设计游戏引导框架》吧!文章基于Cocos-2dx平台,使用Lua脚本开发,涉及配表和代码编写,有不足之处,望读者们批评指正!

本文是系列文章的第一篇,先从理论层面开始梳理吧!

引导的作用

假如一款全新的游戏上市,新的玩法、新的角色、新的场景摆在玩家面前,玩家一进入游戏而没有被告知玩法,一切的操作都需要玩家自己去摸索,那么这款游戏给人的感觉是“生硬”的,往往这一类游戏很难让玩家接受并耐着性子玩下去。

这时候如果给这个游戏加一个开场引导,交代游戏的背景,引导玩家按照核心玩法点击各个按钮,并告知每一步操作的作用,这样游戏会更能被玩家接受。

有时候,为了引起玩家的兴趣,开场引导中往往会加入更有代入感的剧情,加上华丽的美术特效,让玩家在玩游戏的过程中分泌更多的快乐素(多巴胺)。

至此,引导的作用就知晓了:

  • 增加代入感
  • 交代核心玩法

引导是分段的

然而游戏不仅只有开场引导,随着游戏进度的深入,玩家会接触越来越多的玩法操作,每个玩法都有其专属的引导。这时一个概念需要被树立:引导是分段的,一段引导对应一个玩法介绍。

拿率土之滨举例子!

进入游戏后,玩家的主城被流寇抢夺,引导人物出来说几句话,然后引导玩家进行点击操作,这是游戏开场引导

在一系列引导操作后,玩家可以自由操作了。这时玩家点击“演武”按钮进入了演武界面,一个新的引导——演武引导出现了,它会告诉玩家演武功能的基本操作。

从演武界面出来后,玩家进入招募界面,招募引导会告知玩家点指定卡包抽卡。

引导会根据需要,在玩家首次进入某个界面或满足条件时触发,以帮助玩家理解对应玩法。

每一个功能点都可以以一段引导辅助说明。

每段引导分步骤

上面说的引导分段只是从功能层面定义,而引导里具体做什么是需要程序员去定义拆分的,简言之,引导需要分步骤

以率土的开场引导为例,玩家进入游戏:

  • 第1步,流寇部队进攻玩家主城;
  • 第2步,流寇将领出现在屏幕上,说一句话;
  • 第3步,引导主人公出现,说一句话;
  • 第4步,引导玩家点击地图格……

一段引导就是这样一步接一步进行的。当策划提出一个引导需求时,最多只会给出大致流程,至于如何将一段引导拆分成步骤,需要程序员自行梳理。

分步,是一种思维方式,如何合理拆分,让代码更容易维护,是一个日积月累的过程。

引导的触发

引导的触发,是针对一段引导而言,一段引导是交代做什么事情,而触发则是交代什么时候做事。

为了让读者们更容易理解,我们代入一个场景。

场景代入

假设在一个卡牌养成类游戏中,卡牌有等级,可以进阶(每进阶一级,黄色星星会有一颗变成红色),大概像这样:

(蓝色框框:等级,红色框框:星级 或 “阶”)

接下来策划提出要做一个卡牌的进阶引导,已知进阶的条件是:

  • 英雄等级达到20级;
  • 有其他同名卡牌作为进阶素材;

同名卡牌:名字相同的卡牌。
比如我有两张吕蒙,可以把其中一张吕蒙作为另一张吕蒙进阶材料。

触发点 & 触发条件

场景有了,接下来聊聊引导的触发。

如果说,引导是什么时候,该做什么事
那么,引导的触发就是什么时候

但是这个时候包含着两层含义:

  • 触发点
  • 触发条件

将它代入到之前场景里,就是:在卡牌等级经验达到20级的那个触发点,卡牌满足有同名卡的触发条件,触发卡牌进阶引导。

用英文的方式理解,就是:

  • 触发点 = when
  • 触发条件 = it is

两者连在一起,就是:When it is …, 触发引导

触发的多情况判断

前面提到,当卡牌等级达到20级时,如果存在同名卡就触发引导。

那么如果吕蒙卡牌到达20级时,没有同名卡该怎么触发引导呢?

这个时候需要把引导的触发点和触发条件互换一下,也就是当玩家得到一张吕蒙时,如果吕蒙有同名卡且多张吕蒙卡牌中有至少一张卡牌等级达到20级,则引导触发。

简单写为:

1
2
3
4
触发点:获得一张卡牌
触发条件:
1. 该卡牌存在同名卡
2. 同名卡中至少存在一张等级达到20级的卡牌

综上,一个引导的触发,需要多情况判断,在设计引导时,只有尽可能细化引导触发的各个因素,才能在后期的开发中尽可能减少BUG的出现。

引导的操作

如果说引导的触发是针对引导分段,那么引导的操作则是针对引导分步,即:每一步做什么事

操作分类

引导的操作很杂,根据策划的需求,会有不同的形式,比如:

  • 点击某个按钮
  • 拖动某张卡牌
  • 高亮某个区域
  • 显示一个立绘对话
  • ……

根据操作形式的共性,将其抽象分类如下:

  • 点击
  • 拖动
  • 高亮框
  • 对话

定义了分类后,那么问题来了:为什么要将操作分类呢?

因为操作有其共性,有共性就意味着会有相同的代码逻辑,做好分类后方便对操作统一管理。

点击举例子:

在强制引导点击时,我们知道,玩家只能点击指定的控件,而不能点击控件以外的地方。这时需要做的统一逻辑,就是:在手指点击屏幕的那一刻,判断手指点击的位置,判断是不是按钮区域。是,则不阻挡事件传递;否则,阻挡触摸事件。

然而操作的分类不仅仅局限于上述几类,分类可根据策划的需求做进一步扩展。在偏剧情向的引导中,可能还需增加“剧情”类别,若剧情是有固定形式的展现,还可根据实际情况做进一步分类,如:

  • 剧情:多格漫画
  • 剧情:镜头拉伸
  • 剧情:视频
  • ……

所以操作的分类是灵活多变的,具体分类根据需求来定。

操作定义

操作最终还需落实到具体细节,也就是具体做什么事。之前定义了“点击”类别,那么具体点击什么,就需要做具体的定义了。

以之前的“卡牌进阶引导”为例,当触发引导时,引导步骤如下:

1
2
3
4
5
6
7
1. NPC说话:“主公,您有一个英雄已经满足进阶条件了,我们现在来看看吧!”
2. 引导点击满足进阶条件的卡牌,进入卡牌详情页
3. 引导点击卡牌详情页的进阶按钮,进入卡牌进阶界面
4. NPC说话:“现在请主公将材料卡拖动到消耗框里。”
5. 引导从卡牌列表框中拖动一张同名卡到消耗框中
6. 引导点击进阶按钮确认进阶
7. NPC说话:“恭喜主公成功进阶武将!”

根据上述操作步骤,对操作定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 操作类别定义
1. 立绘对话
2. 点击
3. 拖动

// 具体操作定义
0. 无操作

// 点击操作定义
201. 点击自己卡池里满足进阶条件的一张卡牌
202. 点击卡牌详情界面的进阶按钮
203. 点击进阶面板的进阶按钮

// 拖动操作定义
301. 在进阶面板拖动第1张材料卡到进阶消耗框

// 对话在流程表中填写具体对话内容和人物即可,无需定义
// 说话人物定义
0. 无人物
1. NPC

根据定义,配引导流程表如下(配表后面细讲,这里看个大概即可):

id 类别 操作 对话内容 说话人
_id _type _action _text _role
H H H D H
1 1 0 主公,您有一个英雄已经满足进阶条件了,我们现在来看看吧! 1
2 2 201 0
3 2 202 0
4 1 0 现在请主公将材料卡拖动到消耗框里。 1
5 3 301 0
6 2 203 0
7 1 0 恭喜主公成功进阶武将! 1

操作参数

假如引导的需求是拖动两张材料卡进行进阶,那么做两次定义就显得冗余了:

1
2
3
!!! 不推荐这样定义
301. 在进阶面板拖动第1张材料卡到进阶消耗框
302. 在进阶面板拖动第2张材料卡到进阶消耗框

因此需要对操作定义进行扩展,给对应操作增加参数配置,原来301的定义就变成了这样:

1
2
// 拖动操作定义
301. 在进阶面板拖动第n张材料卡到进阶消耗框 n表示第几张

相应的,引导流程表也需要多加一列:

id 类别 操作 操作参数 对话内容 说话人
_id _type _action _actParam _text _role
H H H H D H
5 3 301 1 0
6 3 301 2 0

上述配表,表示:

1
2
第5步,在进阶面板拖动第1张材料卡到进阶消耗框
第6步,在进阶面板拖动第2张材料卡到进阶消耗框

操作参数扩展

在一些逻辑复杂的引导中,一个操作参数往往不能满足需求,这是将_actParam参数由配置数字改为配置Json格式的字符串,可支持多参数的配置。

举例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 点击操作定义
201. 点击自己卡池里满足进阶条件的一张卡牌
参数:
id:卡牌的id
lv:卡牌的等级
sameNum:同名卡数量

例:
{'id':1,'lv':20,'sameNum':2}
点击卡池中id为1,等级至少为20,且同名卡数量超过2张的卡牌

// 拖动操作定义
301. 在进阶面板拖动第n张材料卡到进阶消耗框
参数:
index:表示第几张材料卡

引导流程表就变成了这样:

id 类别 操作 操作参数 对话内容 说话人
_id _type _action _actParam _text _role
H H H S D H
1 1 0 0 主公,您有一个英雄已经满足进阶条件了,我们现在来看看吧! 1
2 2 201 {‘id’:10001,’lv’:20,’moreThan’:2} 0
3 2 202 0 0
4 1 0 0 现在请主公将材料卡拖动到消耗框里。 1
5 3 301 {‘index’:1} 0 0
6 3 301 {‘index’:2} 0 0
7 2 203 0 0
8 1 0 0 恭喜主公成功进阶武将! 1

至此,引导的操作,暂告一段落,若这一块读者们没有看懂,且先放放,后续会做详细讲解。

引导的保存点

在产品里,有这么一句话,叫“你永远不知道你的用户是怎么使用你的产品的”。

游戏也类似,永远不要指望玩家一口气把你写的那一段引导流畅的跑完。在引导过程中,玩家很可能经历:游戏BUG闪退、上课玩游戏被老师抓到等情况,一旦类似的情况发生,引导肯定会中途断掉,而如果玩家再重新上线,看到之前走过的漫长的引导又要重新走一遍时,有很大的概率,玩家是没有耐心继续玩下去的。

更何况,有些操作是不可重复的,比如玩家走引导,用系统送的货币抽卡,如果重新走一遍,很有可能第二次抽卡货币就不够了,这样的异常会导致引导卡死,这无疑会劝退一大波玩家。

因此,保存点这一概念加入到引导中,以抽卡引导为例:

在点击抽卡按钮的那一步操作里,将引导的保存点设置为下一步引导的id,这样下次重新登录后,引导就会从点抽卡按钮之后的那一步开始继续引导了。

这里先简单讲解下概念,后续实操篇会详细讲解。

理论篇收尾

本文理论篇旨在为下一篇配表、编码做一个理论铺垫,防止直接讲解给读者们带来困惑。下一篇为本系列文章的实操篇,主要讲解基本的配表和初步的编码逻辑。考虑到工作因素,笔者写文章频率会较低,更新较慢,还请读者们海涵!

再小的鼓励也是一种支持!