一切的开始
“愿你的世界充满光明。”(泰拉瑞亚)
我从高中开始就一直有制作独立游戏的想法,不过由于繁忙的课业与相关技术知识的缺乏,一直没能真正去实现,只是尝试过用比如RPGMaker这样的软件制作一些简单的游戏……如果那些东西能称得上游戏的话。
算是一次机遇吧,大学忽然新开设了游戏设计的计算机选修课。于是我想,为什么不试一试呢?结果是,当时的好奇和心动,在后来可以证明是正确的,我也在开发的过程中收获了许多的成就与快乐。
原型蓝图
课程分为了两部分,前半部分是Unity学习以及用户体验的一些知识,后半部分才是重头戏——把时间完全留给团队来合作开发游戏。
Unity本身并不难学,官方教程和文档加上丰富的社区资源完全足够让一个人在短时间内学会Unity的大部分功能。重点是用户体验,也就是如何设计游戏,使得玩家不会在游戏过程中感到无聊。这一点也会有一个衍生的问题,就是如何平衡创意和技术。
分析与决策
游戏的形式多种多样,开发者自然也会有许多的创意。比如复杂的机制,漂亮的美术,或是感人的剧情等等……想要添加的东西太多了。
因此,需要评估资源:所有的时间是大约是12周,两个部分的时间基本上是对半分,前6周需要从Unity零基础到开发出游戏原型,后6周则是组建队伍并开发出真正可以玩的游戏。
可以看出,时间并不是很充裕,而且可以预见的是后6周组队的潜在对象水平会参差不齐,并且大概率不会特别好。那么,游戏的整体设计就不能过于复杂,必须抛弃掉很多创意。
“我们称之为高效。” (群星)
首先,不能像八方旅人那样以剧情设计为主体,对话,过场动画和流程都会消耗大量的时间和精力,除非设计成例如Galgame的文字类游戏。其次,沙盒或是战略类也不现实,这类游戏的核心是不同程度的复杂的系统,以提供玩家的深度交互,而复杂的系统又容易引起众多恶性Bug,因此不是个好选择。最后,需要庞大物理和美术支持才有良好体验的游戏自然也难以在短时间内实现,比如赛车类,体育类,或是模拟类游戏。
其实我还是有不少游戏点子的,不过同时考虑到有限的精力和未来的可拓展性,以及个人对于各个游戏种类的熟悉程度,最后我选择了俯视角第三人称射击游戏来进行这个项目。
团队合作
开发不算难,很快基本的元素就齐全了。由于是原型,不需要使用资产。主角可以在场景中移动,鼠标控制射击,主角拥有能量条和闪避技能等等……遗憾的是,当时的开发截图丢失了,否则用图片展示会更清楚一些。
“与天使共舞吧!” (皇牌空战)
到了第7周组队的时间。队伍可以说是随机分配的,而和我预计的差不多,水平参差不齐。一般来说,团队的游戏会融合各个成员的原型的特点来进行开发。不过实际上等到各个成员展示自己的游戏后,一致认为直接基于我的原型开发好了……
顺理成章的,我成为了Leader,并且负责项目的核心代码和架构设计。那么接下来,基本上就是需要判断每个成员的能力以分配任务。根据各个成员所做的游戏原型其实就可见一斑,比如游戏画面有精心打磨过的组员擅长视觉设计,可以分配UI和动画效果的任务。
核心架构
我们为每一种实体,比如玩家,敌人,掉落的补给,子弹等,都分别创建了脚本,比如PlayerControl,EnemyControl,AidControl,BulletControl等。原型模式在我们的游戏中起到了关键作用,不管是敌人还是掉落物,都需要被批量制造出来。我们创建的脚本中留有不少手动配置的参数,以创造出不同种类的敌人或者掉落物。
“万物皆虚,万事皆允。” (刺客信条)
这里有个有趣的事情:在每一关结束的能力强化选择界面场景中,其实有一个玩家角色实体,不过是在镜头之外,而且被封在空气墙组成的“屋子”里,主要是为了更方便的跨场景传递数据。
改进方案
虽然游戏开销并没有显著影响性能,但是我也计划使用以下技术来优化游戏,不过由于时间不足,最终没有时间去实现:
-
工厂类(Factory):为不同类型的游戏对象(如敌人、武器、掉落物)创建专门的工厂类。工厂类负责对象的创建和初始化,使得对象创建的逻辑集中管理,提高代码的可维护性。例如,
EnemyFactory可以根据不同的敌人类型创建对应的实例。 -
对象池(Object Pool):对于频繁创建和销毁的对象(如子弹、粒子效果),使用对象池技术可以显著提高性能。具体来说:
- 预先创建一定数量的子弹对象并存储在对象池中
- 当需要发射子弹时,从对象池中取出一个子弹对象并激活它
- 当子弹命中目标或超出范围时,不是销毁它,而是将其重置并放回对象池中
- 这样可以避免频繁的内存分配和回收,减少GC(垃圾回收)的压力
尽管如此,整个开发过程还是相当充实的。我们最终完成了游戏的主要玩法:主角可以在场景中移动和闪避,配备能量系统,有三种不同类型的敌人,简单的关卡设计以及技能提升系统……甚至还在开头设计了教学关卡。虽然美术素材基本是免费的Low-Poly资产,但整体体验还算不错。
经验总结
课程结束,虽然个人成绩相当不错,不过在班级投票最喜欢的游戏中,还是没能获得大家的青睐。
“蛋糕是个谎言。” (传送门)
我总结了不少经验教训。技术方面,除了可以使用工厂类和对象池来优化架构和性能,一开始如果能根据ECS(实体-组件-系统)架构来设计游戏,可能会更好的优化开发流程。团队协作方面,我意识到作为Leader,不能只埋头写自己的代码,还需要花更多时间去了解其他成员的进度和困难。
这次Unity开发经历让我收获颇丰。它不仅是一次技术实践,更是一次项目管理、团队协作和解决问题的综合锻炼。虽然游戏本身算不上精美,但这个过程中的经验与成长才是最重要的。
结束
“我该走了。” (质量效应)
如果你也想和我一样尝试游戏开发,我的建议是:直接开始,边干边学。从简单的原型开始,在实践中学习,在错误中成长。游戏开发的路上会有挫折,但看到自己的想法一点点变成可玩的游戏,那份成就感是无与伦比的。
附加:游戏链接可以点这里
