节奏游戏开发指南 #1: 你我好似又远隔重洋

作者:indienova
2016-07-25
6 10 2

说明

译自 TIGsource 论坛,为介绍节奏类游戏的开发日志,本文为系列的第二篇,将介绍开发者是如何将 A Dance of Fire and Ice 不同关卡分隔到单独的场景中的。这一期内容和游戏本身关联比较紧密。

有关游戏和开发组的信息可以到这里查看本系列教程的第一篇。

你我好似又远隔重洋

在正式开始这一期的教程前,向大家展示一下我们的一些开发进展:
使用 Kyle 的新美术素材全面升级后的 A Dance of Fire and Ice 模样发生了天翻地覆的变化:

before
after

但是,这对关卡设计提出了新的挑战。事情是这样的:

据我所知,Unity 中制作多关卡游戏主要有两种方法。

  1. 为每一个关卡都单独制作一个场景;
  2. 所有关卡都使用同一场景,在关卡初始化时传入不同的参数,参数用来描述关卡布局,可能是形如“RRRUDDDLLLLLDLL”这样的字符串。

过去我一般使用第 2 种方法:游戏中的所有关卡都共用同一场景。我编写了一个解释函数,用来读入描述布局的字符串,并生成对应的关卡。而关卡内容则硬编码在 Controller 主类中。

注意看那会是什么模样:

string[] leveldata = new string[]{"RRRRRRRRR",
     "RRRRRRRDRRRRRRRRR",
     "RRRRRRRURRRRRRRRR",
     "RRRRRRRURRRRRRRDR",
     "RRRRRURURRRRRURUR",
     "RRRRRDRDRRRRRDRDR",
     "RRRRRRRRRRRRRRRR" +
     "RRRRRRRRRRRRRRRD" +
     "RRRRRRRRRRRRRRRD" +
     "RRRRRRRRRRRRRRRD" +
     "RRRRRRRRRRRRRRRU" +
     "RRRRRRRRRRRRRRRU"..

因此当玩家完成某个关卡后,记录关卡进度的变量 currentlevel 会 +1,关卡会重新载入布局参数。看起来挺管用。

然而问题是:

这样的话,每个关卡中独特的内容都需要编写到代码中。Unity 本身的场景编辑器中需要保持空白。

而 Kyle 则给了我这样的关卡布局设计:

pd5lQHL

……好吧,那我该如何在关卡布局的字符串中独立表示每种材质呢?恐怕会写出下面这样的字符串:

"RRRRDDDLLLL//ASSETS//CHAIN1/(230,300)/3.2x"

……如果像这样做,后期调整就会彻彻底底变成噩梦难度。我的确是可以编写一些代码让你加入材质参数,对它们进行调整,并把结果导出到 XML 文件之类的东西里。可不用太费功夫想就知道那是天大的工作量。颜色,位置,大小,附带的定制脚本,脚本的参数列表……唔,我表示拒绝。

那该怎么办呢?

是的,假如我每个场景放一个关卡,那事情会变得容易很多,这样用 Kyle 提供的材质布局也就不是那么麻烦的事情了。但是,我还是希望用“RRLDLLD”这样的字符串参数来描述地图布局,如果用 Unity 自带的场景编辑器来搭就有些折磨人了。

恰逢毕业,在回马来西亚的两天前,我在剑桥大学偶然遇到一个也在做游戏开发的哥们。我告诉他,我遇到了一点小麻烦,我们之间发生下面这场对话:

“那为啥不做成单独的场景呢?”
“可我不想手动放置方块布局呀!”
“试试拓展编辑器功能?”
“你是说像 NGUI 那种做法?是不是会难得不得了呀?!”
“其实也没那么难呀……”

那我索性就试上一试。

CFVGJ0i

效果很酷!

是的,研究一番后,我发现编辑器拓展真的相当简单,文档也很全面,以上这些说法其实全都是骗人的。不过,尽管如此,克服了一些困难后,借助一些还不错的在线教程,我花了几天功夫,最终达成了下列目标:

  1. 在可视化的场景编辑器中编辑素材;
  2. 使用字符串设置关卡布局。

当然,还有一个问题,现在起,之前只有单实例的类 GUIController等在每个场景中都会拥有一个实例。而且我觉得以后这对多场景的设置也会造成一些实际的问题。如果我想添加新的菜单对象要怎么办呢?难道我需要修改每个单独的场景,重复添加 30 次?连 PPT 都提供了主滑块之类的解决方式,Unity 里就没有类似的功能吗?

如果你知道有什么好的解决方案,可以告诉我。另外,希望这篇文章能够对你有所帮助,我们下一期再会。

(顺便,如果有人感兴趣的话,这一期的标题来自 Seafret 的 Oceans。)