首页 > 代码库 > 游戏开发中的银弹

游戏开发中的银弹

第一次看到"没有银弹"这句话,是在《C++程序设计语言(特别版)》中。这里的银弹我认为是广义的,就是说没有那种万能的模式,只要我们循着这种模式就能开发所有软件。但在游戏开发中是有一些通用部分的,那就是UI还有游戏流程。当然即使是UI和游戏流程,也有N种办法来搞定。比如UI,可以直接写个MonoBehaviour,名字先叫UIRefresh,里面有一堆public成员变量,对应于各个界面,角色信息、背包之类的,使用NGUI或者UGUI的话,UI的零件都是在场景里的,就可以把这些零件统统拖到UIRefresh里,然后在UIRefresh里UpdateCharacterInfo、UpdateInventory之类的。游戏流程可以硬编码,就是用一个GameController之类的,里面包含一大堆游戏整体流程相关的逻辑。上面举得这两个例子在小游戏里可以这么做,如果UI多了或者游戏流程复杂了,这么做会让整个代码都显得很凌乱。我就在这篇文章里讲讲我常用的做法。

首先是UI。UI,User Interface,顾名思义是给玩家用的,而且是一个Interface。它其实是一种垂直的结构,就是说有一个界面用来接收输入,反馈信息。这个跟网页很像,所以把MVC拿来用是很常见的做法,应该也是一种标准做法?按照MVC的话,比如一个背包,可能要有这么几个东西, PlayerModel,InventoryView,InventoryController,这几个类都没有基类,因为背包的数据通常放在Player里,所以这里用PlayerModel。但是在游戏里,玩家除了有背包,还有很多其他东西,比如CharacterInfo、Skills等,这里CharacterInfoController、SkillsController不需要用基类,但是CharacterView、SkillsView,这俩跟InventoryView有一些共性,比如他们需要Show、Hide,如果界面更多,还可能需要互斥等等,所以View可以再抽一个基类出来,ViewPresenter,里面包含Show、Hide之类的东西。现在的UI架构就是这样的:

View(可以是NGUI、UGUI的Prefab,也可以是FairyGUI的Component)

ViewPresenter

||

Controller

||

Model

接下来是游戏流程。其实用游戏逻辑我感觉更顺口,但是用游戏流程可能更容易让人理解。游戏流程是什么?比如玩打飞机,首先显示一个界面,然我们开始游戏,按下这个按钮后,才进入游戏界面,这时候就可以打飞机了,如果不幸被击落了,就会跳转到游戏结束界面,然后显示我们得到的分数。分析一下就会得到,这里面其实有三个流程,GameStateStart,GameStateMain,GameStateOver。这里其实也提示我们,划分游戏流程可以根据场景来做。用上面的UI架构,可以弄一个StartViewPresenter、StartController,StartModel则不需要了,因为开始界面里没有数据。在StartController里,可以给开始游戏按钮添加一个处理函数。在GameStateStart里,就要创建出StartController,然后显示StartViewPresenter,一旦按下了开始游戏这个按钮,条撞到GameStateMain,在GameStateMain里再做其他操作。这样就很清晰地把整个游戏划分成不同的模块,化整为零。在GameStateMain里其实还可以再划分。因为我们控制的飞机也会处在不同状态,PlayerStateIdle、PlayerStateMove、PlayerStateDead等等。但是注意,在这里使用FSM控制飞机,并不属于游戏整体的流程。在打飞机这种小游戏里可以用FSM控制飞机,但是在其他游戏里,控制玩家的方式可能完全不同。注重AI的游戏可能用AI系统来控制玩家,比如战神、鬼泣还有最近出的仁王等等格斗游戏,敌人是很敏感的,玩家的任何动作得到敌人不同的反馈。这类游戏的AI可不是Idle、Move、Attack、Dead这种简单的能搞定的。注重角色本身的游戏可能用角色系统来控制玩家,比如使命召唤这类射击游戏,玩家控制的角色跟现实世界的人没什么两样,能跑能跳能上天,就是说角色的动作很丰富,动作捕捉只是其中的一个方面,另一个方面是需要一个强大的角色系统来控制玩家对不同的输入产生不同的反馈,同样这种系统也不是简单的FSM能搞定的。当然你如果硬是说我写上几百个状态,在这几百个状态之间建立连接,难道搞不定这些东西?当然可以搞定的,只是很明显FSM是不适合做这种系统的。这样做会得不偿失。

讲了这么多,还有一句话要讲,其实就是之前有好多人说MVC开发整个游戏。读者读到这里其实应该明白了,如同FSM不是万能的一样,MVC也不是万能的,FSM都搞不定的东西,指望MVC就更不可能了。MVC这种垂直的结构,比FSM更加死板。

总结一下,UI使用MVC,游戏流程使用FSM,还是可以省不少心的。这算是游戏开发中的两个银弹吧。至于其他部分,仍然是没有银弹的。

游戏开发中的银弹