说明
译自 TIGsource 论坛,为介绍节奏类游戏的开发日志,本文为系列的第二篇,将介绍开发者是如何将 A Dance of Fire and Ice 不同关卡分隔到单独的场景中的。这一期内容和游戏本身关联比较紧密。
有关游戏和开发组的信息可以到这里查看本系列教程的第一篇。
你我好似又远隔重洋
在正式开始这一期的教程前,向大家展示一下我们的一些开发进展:
使用 Kyle 的新美术素材全面升级后的 A Dance of Fire and Ice 模样发生了天翻地覆的变化:
但是,这对关卡设计提出了新的挑战。事情是这样的:
据我所知,Unity 中制作多关卡游戏主要有两种方法。
- 为每一个关卡都单独制作一个场景;
- 所有关卡都使用同一场景,在关卡初始化时传入不同的参数,参数用来描述关卡布局,可能是形如“RRRUDDDLLLLLDLL”这样的字符串。
过去我一般使用第 2 种方法:游戏中的所有关卡都共用同一场景。我编写了一个解释函数,用来读入描述布局的字符串,并生成对应的关卡。而关卡内容则硬编码在 Controller
主类中。
注意看那会是什么模样:
string[] leveldata = new string[]{"RRRRRRRRR", "RRRRRRRDRRRRRRRRR", "RRRRRRRURRRRRRRRR", "RRRRRRRURRRRRRRDR", "RRRRRURURRRRRURUR", "RRRRRDRDRRRRRDRDR", "RRRRRRRRRRRRRRRR" + "RRRRRRRRRRRRRRRD" + "RRRRRRRRRRRRRRRD" + "RRRRRRRRRRRRRRRD" + "RRRRRRRRRRRRRRRU" + "RRRRRRRRRRRRRRRU"..
因此当玩家完成某个关卡后,记录关卡进度的变量 currentlevel
会 +1,关卡会重新载入布局参数。看起来挺管用。
然而问题是:
这样的话,每个关卡中独特的内容都需要编写到代码中。Unity 本身的场景编辑器中需要保持空白。
而 Kyle 则给了我这样的关卡布局设计:
……好吧,那我该如何在关卡布局的字符串中独立表示每种材质呢?恐怕会写出下面这样的字符串:
"RRRRDDDLLLL//ASSETS//CHAIN1/(230,300)/3.2x"
……如果像这样做,后期调整就会彻彻底底变成噩梦难度。我的确是可以编写一些代码让你加入材质参数,对它们进行调整,并把结果导出到 XML 文件之类的东西里。可不用太费功夫想就知道那是天大的工作量。颜色,位置,大小,附带的定制脚本,脚本的参数列表……唔,我表示拒绝。
那该怎么办呢?
是的,假如我每个场景放一个关卡,那事情会变得容易很多,这样用 Kyle 提供的材质布局也就不是那么麻烦的事情了。但是,我还是希望用“RRLDLLD”这样的字符串参数来描述地图布局,如果用 Unity 自带的场景编辑器来搭就有些折磨人了。
恰逢毕业,在回马来西亚的两天前,我在剑桥大学偶然遇到一个也在做游戏开发的哥们。我告诉他,我遇到了一点小麻烦,我们之间发生下面这场对话:
“那为啥不做成单独的场景呢?”
“可我不想手动放置方块布局呀!”
“试试拓展编辑器功能?”
“你是说像 NGUI 那种做法?是不是会难得不得了呀?!”
“其实也没那么难呀……”
那我索性就试上一试。
效果很酷!
是的,研究一番后,我发现编辑器拓展真的相当简单,文档也很全面,以上这些说法其实全都是骗人的。不过,尽管如此,克服了一些困难后,借助一些还不错的在线教程,我花了几天功夫,最终达成了下列目标:
- 在可视化的场景编辑器中编辑素材;
- 使用字符串设置关卡布局。
当然,还有一个问题,现在起,之前只有单实例的类 GUI
,Controller
等在每个场景中都会拥有一个实例。而且我觉得以后这对多场景的设置也会造成一些实际的问题。如果我想添加新的菜单对象要怎么办呢?难道我需要修改每个单独的场景,重复添加 30 次?连 PPT 都提供了主滑块之类的解决方式,Unity 里就没有类似的功能吗?
如果你知道有什么好的解决方案,可以告诉我。另外,希望这篇文章能够对你有所帮助,我们下一期再会。
(顺便,如果有人感兴趣的话,这一期的标题来自 Seafret 的 Oceans。)
确实很好用但也没那么麻烦啊。致不喜欢 unity 的翻译君。
在Unity官网上有个扩展编辑器的视频教程:https://unity3d.com/cn/learn/tutorials/modules/beginner/live-training-archive/scriptable-objects?playlist=17117
感觉还是现在的编辑器更好用