开发独立游戏需要解决的一些问题

做游戏一直是我的夙愿,也是我转行进入软件开发的动机。如今,当我已经有5年的开发经验,准备开发自己的独立游戏的时候,发现这件事远比我想的复杂,本文记录了我关于独立游戏开发的一些思考,以及对未来的展望。

<!--more-->

1. 游戏分类

与电影、音乐、文学等艺术品类似,电子游戏的分类也十分庞大,即使是单纯按玩法分类,也可以细分出数十个类型

下面参考

1、RPG(Role Playing Game)角色扮演游戏 2、ARPG (Action RPG)动作角色扮演类游戏 3、SRPG(Simulation RPG)模拟角色扮演类游戏 4、FPS(First Person Shooting)第一人称射击游戏 5、RTS(Real Time Strategy)即时战略游戏 6、AVG(Advanture Game)冒险类游戏 7、SLG(Simulation Game)策略与战棋类游戏 8、RAC(Race Game)赛车竞速类游戏 9、ACT(Action Game)动作类游戏 10、SIM(simulation)模拟经营类游戏 11、EDU(education)养成类游戏 12、FLY(Fly Game)飞行模拟类游戏 13、TAB(Table Game)桌面类游戏 14、SPG(Sport Game)体育类游戏 15、FTG(Fighting Game)格斗类游戏 16、SFTG(Simulation FTG)模拟格斗类游戏 17、PUZ(Puzzle Game)益智类游戏 18、STG(Shooting Game)射击类游戏 19、ETC(Etcetra Game)其他类游戏

上面列举的游戏类型,我或多或少都玩过一些,不同的类型的游戏,其玩法差异比较大,所需的时间成本和开发成本也不一样。

游戏开发三大件:策划、程序和美术

  • 策划决定了游戏的玩法、剧情、数值等
  • 美术决定了游戏的风格、画面、特效等
  • 程序是我当前唯一擅长的事情,负责实现各种逻辑

对于独立游戏而言,一个人的精力是有限的,对于上面三个方面需要有一些取舍。

摆在面前的第一个问题是:我到底想做什么样的独立游戏?但当我踌躇满志准备启动时,想到这个问题的却一脸茫然。游戏设计果然是最难的!!

尽管游戏存在差异,但游戏设计也有一些共同点,在《游戏迭代设计》中提到,游戏核心玩法需要考虑的6个基本要素

  • Actions(行动),指玩家在游戏里面需要进行的动作,比如可以移动、攻击、使用技能等
  • Rules(规则),玩家在游戏中可以做什么,不能做什么,比如无法攻击友军
  • Goals(游戏目标),玩家在游戏中想要达成的事情,比如战胜所有敌人
  • Objects(游戏对象),玩家在游戏中交互的对象,比如敌人、友军
  • Playspace(游戏空间),游戏进行的地方,比如一个n*n的房间
  • Players(玩家),参与游戏的人

参考:游戏设计的6个基本要素

从这几个点出发,先设计游戏、在开发程序,最后完成美术,看起来是比较明智的做法。

2. 策划

市面上已经有很多游戏了,如果选择了某种常规的玩法,那么往往能找到类似的游戏。

比如我想开发一个战棋游戏,这是一个非常经典的SLG游戏类型,

从比较早的《火焰纹章 暗黑龙与光之剑》、《曹操传》等游戏

就已经确定了游戏大概的规则和玩法,以火焰纹章为例,使用上面的游戏设计元素来进行解构

行动:在每一回合中,玩家可以选择棋子,操作棋子攻击或移动,使用道具等

规则:

  • 在对手回合无法进行操作
  • 每回合每个棋子只能操作一次
  • 棋子不能移动到其他棋子的位置上
  • ...

游戏目标:每个关卡有特定目标,如消灭全部敌人、或在指定回合内撤退到指定位置

游戏对象:玩家棋子、对手棋子

游戏空间: 1个n*n的瓦片地图

玩家:游戏玩家,只支持单人

我甚至找到了战棋类游戏核心玩法框架设计之类的文章,写的挺好。

再比如想开发一个消除类游戏,从宝石迷阵,到天天爱消除、糖果消消乐之类的,其核心玩法都是固定的,无非是在原有的消除玩法基础上添加一些新的规则(不同的消除道具)、新的游戏对象(不同的宝石)、新的游戏空间(不同的地图)。

所以如果只是想参考现有的玩法,去复刻某款游戏,看起来并不是那么复杂。

因此,当我开始决定要做一款战棋类的游戏时,看起来前景一片明朗:游戏玩法和规则都了然于胸,无非就是添加一些关卡、一些棋子嘛...

但当我花了三天整个程序逻辑写完(甚至写了很容易扩展的棋子配置表)之后才发现,我想要表达的是一个什么东西呢?游戏剧情是什么?控制的角色目标是什么?

在这个茫然的时候,我才意识到,游戏的核心并不是算法、不是技术实现,而是游戏的设计、游戏的剧情。

这也是我目前遇见的最大的问题。

3. 程序

游戏开发和常规的应用开发的确有一些差异,抛开技术栈、业务的差异之外,我感觉最大的区别在于

  • 应用开发主要是处理现实世界的逻辑
  • 游戏开发需要创建一个完全不同虚拟世界

类似于应用开发各种各样的框架,游戏开发经常需要基于引擎开始,且重度依赖于引擎的功能。

因此,在开发游戏时,需要选择一种游戏引擎。在过去的几年我一直在从事web前端开发,现在想开发一个2d游戏,因此决定选择cocos creator(目前最擅长的编程语言JavaScript),这是我刚学写代码时接触到的游戏引擎,当时还是cocos 2dx。

其实我很想尝试unity,但又得重新去学习C#以及unity相关工作流程。由于我的目标是先做出游戏,并不是为了学习新的引擎,因此暂时搁置了。在初学阶段,游戏开发跟编程语言的关系并没有想象中的大,因此没有过多纠结。

在确定了引擎之后,就是各种功能的实现了,最基本的就是OOP,目前的开发体验下来,最简单的管理代码方式就是使用面向对象。

此外在开发中还会遇见各种问题,碰见的时候去查相关的解决方案就行,比如

  • 加载各种资源素材
  • 怎么接入物理引擎
  • 怎么检测碰撞
  • 怎么实现可配置的技能系统
  • ...

单机游戏的好处是不需要服务端,这个看起来可以减少很多的工作量。

但单机游戏也会存在一个绕不开的问题:如何实现游戏的AI。当然有的游戏是不需要AI的,这类游戏基本上都是只有玩家单人,比如

  • flappy bird,一个重力系统 + 碰撞检测 + 管道生成器就可以了
  • 消除类游戏
  • ...

游戏的类型决定了游戏是否需要AI,很显然,战棋游戏是需要的,主要表现在在敌人回合,如果操作棋子与玩家对抗,如果是固定不动的对手,玩家肯定也会失去乐趣。

炉石传说在某个版本上了一张 叫做"了不起的杰弗里斯"的卡牌

了不起的杰弗里斯,2费3/2,战吼:如果牌库里没有相同的牌,则许愿获得一张完美的卡牌

这实际上也是游戏AI的表现,实际背后实现,很有可能是一堆if...else...

不管是常规的A*寻路,还是有限状态机或行为树,都是游戏AI的一些实现方式,在《游戏人工智能编程案例精粹》这本书中列举了一些游戏的AI实现,感兴趣可以阅读一下。

我感觉游戏AI是开发程序部分最复杂的部分,这是一个跟游戏类型和游戏内容高度相关的东西。

4. 美术

假设我们设计了游戏的玩法,也用代码写出了demo,那么剩下需要解决的部分就是美术了。

2d游戏中大部分的呈现都是靠美术来实现的,玩家是贴图、地图是贴图、技能动画也是贴图,但是:不要在一开始就纠结美术!不要在一开始就纠结美术!不要在一开始就纠结美术!

前期的美术资源,可以去网上下载付费或免费的通用素材、模型、贴图等,等到整个游戏玩法和逻辑得到了验证,再找外包或者靠谱的朋友帮忙,不然会浪费很多精力。

我之前在游戏玩法和程序都没有准备好的情况下,就开始纠结哪种风格的图片更酷炫、哪里该放粒子效果等,会分散很多精力很时间,对于独立游戏开发初期并不是很明智的选择。

下面列举了一些美术资源

  • 编辑瓦片地图,可以使用tiled map
  • 想绘制像素风格的图片,可以使用aseprite

一些资源网站

5. 小结

本文从策划、程序、美术方面列举了开发独立游戏遇见的一些问题,写的比较简陋,会陆陆续续进行补充,希望我的游戏能尽快上线哈哈~

一种易扩展游戏技能系统的实现方案petite-vue源码分析