我发现题主当前的状态简直和我刚毕业到游戏公司时一样,作为过来人(滑稽)我觉得我可以聊聊我的经历,应该对题主来说是比较有用的。
在我刚进入公司时,我们技术让我用Unity做一个贪吃蛇(是不是觉得超简单?)正如所有初学者一样我做了以下几件事:
- 我先写了一个脚本挂在Camera上来生成场景(就是一堆nxn的Cube)
- 在一个GameObject上挂了一个叫Snake的脚本,在Start上创建Cube并保存在List里,这些Cube还挂载了一个SnakeBody的脚本;并在Update里面接受用户的输入并且移动这堆Cube
- 在一个GameObject上挂了挂了一个叫Food的脚本,该脚本提供了随机换一个位置的功能
- 在SnakeBody里面写了触发器,在与Food相碰时先去找Food脚本,然后让它随机一下位置然后找Snake增加一下身体长度;如果碰到自己或着墙,那就能知Snake脚本自己死掉了
差不多就是这个样子,GameEnter完全不知道自己在干什么,Snake,SnakeBody和Food之间各种乱调各种找。现在看着才四个脚本相互调用好像也没有太乱,但当你的游戏有十来个脚本,各种UI,各种脚角在调用时会是一种多么可怕的场景。
可想而言,我们公司的技术将我批评了一番,并让我去用MVC的方法想一下这东西要怎么写。于是乎,这版完全没有任务设计可言的贪吃蛇进入了第一次重构的阶段。
在看了网上很多资料后,我其实一点也没看懂他们所谓的设计,所谓的框架是什么情况= =但是想到第一版本中三个脚本各种相互调用的混乱情况,我新加了一个脚本:EventManager
这个脚本是做什么的呢,它里面保存着一个通过字符串为key,委托为value的字典;通过注将字符串与对应的回调关联起来。所以刚才的三个东西就变成了下面的样子:
- Snake的update和之前一样,还是加了一堆的控制,但把增加身子长度的方向注册进去了
- 把Food随机位置的方法注册进去了
- SnakeBody里面通过EventManager来调用以上说的两个方法
然后就变成了这样
这样看起来各个脚本之间都没有乱调了,随之而来的还有很多问题:
- 我就不能F12直接找到我要调用的方法,不好调试
- 如果我 A调用B的方法,B调用C的方法,难道我要一次又一次地用EventManager来调吗?
- 而且代码中,数据和GameObject还是绑在一起的,控制也写在GameObejct里面,想要拓展功能都不行。
- 技术老大要求的是采用MVC的方式去做
这些问题依然存在,而且这种奇怪的EventManager调用方法又被技术老大批了一顿,然后告诉我其实在开发过程中往往只要降低耦合性,方便拓展和开发就行,很多所谓的设计模式反而会成有累赘。
于是,现在要进行MVC的第三版,第三版做了以下几件事:
- 将原本不知道自己做做什么的GameEnter直正做成了一个游戏的入口,在开始时创建场景并实例化Snake和Food的控制器。
- Snake,Food并不再用MonoBehaviour来写,而是直接写成C#的类。在初始化是,由Snake来生成SnakeBody;Food来生成一个FoodCube来做为食物。在这里时,SnakeBody和FoodCube都分别有Snake和Food自己执有。
- SnakeBody中添加一个interface做为吃到食物时的回调,该回调由Snake实现。
- FoodCube中添加一个interface做为被吃到的回调,该回调由Food实现。
现在这一版就变成了这样了
这样子变成了由控制器直接去调用自己的实体,而SnakeBody和FoodCube则在有变化时反过来通知控制器去改变自己。不过上面的内容似乎还有一个问题就是数据呢?说好的MVC怎么好像只有V和C啊,关于这个问题只能说贪吃蛇这个游戏我真想不出有什么M,如果说加入计分系统的话应该就有了。
以上就是我进入公司后学到的第一个东西;说真的这还谈不上什么框架可言,但是它提供了一个思路,就是将控制器和视图分视,然后制定通信方式(通过委托回调或着接口)。
当开发内容变得更大时,例如我们公司做的MMOrpg,数据分为模版数据和实例数据;实例数据,游戏中的角色,UI组等又有专门的Manager来管理;而游戏中的角色还有各种分类,通过各种方式来实现增删改查,通信调用。
以上这么多,我想说明的是什么呢。在开发过程中能够实现功能是第一步;第二步就是要想着如何重构它,如何将每个类的职能单一化;接着下就要去思考如何让各个功能之间的通信变得方便,耦合性更底,如何方便地管理数据,资源,实例。
所有的这些都不是一步能做到的,而且光看网上各种奇怪的框架也不一对有用,因为多数东西你并不需要。只有自己一步一步写过来,一次一次自己去重构才能明白如何为游戏开发制定一个构框。
以上说了好多都是废话,不过算是我工作以来的一点心得,希望对题主有用。大的方向楼上有很多人都说得很清楚了。
制作游戏时该如何为程序建立起一个框架?
1 条评论