大伙儿晚上今天又到了咱的分享时间。这回,我想跟各位聊聊我最近捣鼓的一个小玩意儿,我管它叫“无码监督管理器”,就是个游戏里头控制流程的小东西。别看名字唬人,做起来也就那么回事儿,主要是记录一下自己摸索的过程,希望能给有需要的朋友一点点启发。
最初的混沌
是这样的,我最近在瞎琢磨一个小游戏,就是那种特简单的,点点点,然后得分,死了就重来。代码写得那叫一个随心所欲,玩家的逻辑写在玩家脚本里,敌人的逻辑在敌人脚本,UI显示,又在UI脚本里。结果,玩着玩着就发现不对劲了。
比如说,玩家挂了,游戏应该结束?我得在玩家脚本里通知UI脚本显示“游戏结束”,还得通知敌人脚本别再生成新的敌人了,还得让计分板停止计分。这一通知起来,东一个引用西一个引用的,代码拉拉扯扯,跟蜘蛛网似的。改一个地方,好几个地方都得跟着动,特别麻烦,还容易出错。
灵光一闪:得有个总管!
我就寻思,这不行,太乱了。就像一个公司,各个部门各干各的,没有个总经理协调,那还不乱套?我这游戏也是一个道理。我需要一个“总管”,一个能站在上帝视角看问题、发号施令的家伙。这家伙,就是我后来琢磨出来的“无码监督管理器”,或者说,就是一个GameManager。
小编温馨提醒:本站只提供游戏介绍,下载游戏推荐89游戏,89游戏提供真人恋爱/绅士游戏/3A单机游戏大全,点我立即前往》》》绅士游戏下载专区
“无码”的意思,不是说真的一行代码都不写,那不成神仙了嘛我的意思是,我没用啥现成的高级框架或者插件,就是用最基础的逻辑,一点点把它给搭起来,尽量让它保持简单、清晰,不被花里胡哨的代码逻辑给“编码”了,一眼就能看明白它在干
动手开干:搭建管理器的架子
说干就干。我先新建了一个空的脚本,就叫它MyGameManager
,接地气。然后我就开始琢磨,这个总管主要得管哪些事儿?
我想了想,主要有这么几块:
- 游戏状态管理:这是最核心的。比如游戏是正在玩,还是暂停了,还是已经结束了,或者在主菜单界面。我用了一个简单的变量来标记当前的状态。
- 玩家分数管理:得分了得加分,游戏结束了可能要记录最高分,重新开始了要清零。
- 游戏流程控制:比如什么时候开始游戏,什么时候结束游戏,什么时候重新开始。
- 协调各个模块:比如游戏结束了,它得负责通知UI显示结束画面,通知玩家不能再操作了等等。
一点点塞东西进去
有了大概的框架,我就开始往里面填东西。
第一步,搞定游戏状态。 我定义了几个状态,比如Playing
, Paused
, GameOver
, MainMenu
。然后写了几个函数,比如StartGame()
,调用它就把状态改成Playing
;PauseGame()
就把状态改成Paused
;EndGame()
就把状态改成GameOver
。
第二步,处理分数。 这个简单,一个整型变量score
,再来个AddScore(int amount)
的方法,每次得分就调用一下。还得有个ResetScore()
,重新开始游戏的时候用。
第三步,也是比较关键的一步,是怎么让其他脚本和这个管理器“对话”。 我不希望它们之间还是乱糟糟地互相引用。我想的是,其他脚本有事儿,尽量都通过这个管理器来中转,或者由管理器主动去通知它们。
比如说,玩家碰到了一个加分道具。以前是玩家脚本自己加分,自己更新UI。玩家脚本就只负责告诉MyGameManager
:“我吃到分了!” 然后MyGameManager
去更新分数,再去通知UI脚本:“老弟,分数变了,赶紧刷新一下显示!”
这样一来,玩家脚本就不用关心UI是怎么显示的,UI脚本也不用关心分数是怎么来的,它们都只跟MyGameManager
打交道,或者说,被MyGameManager
“监督”着。
遇到的坎和解决的办法
过程也不是一帆风顺的。一开始我想让这个管理器知道得太多,恨不得把所有东西都塞给它管,结果它自己也变得臃肿起来,违背了我“无码”(简洁)的初衷。
后来我调整了一下思路,管理器应该只管那些真正需要“统筹”的事情。比如游戏状态、核心数据的流转。至于某个按钮具体的动画效果,或者某个敌人具体的移动方式,这些细枝末节的东西,还是让它们各自的脚本自己处理比较管理器只需要在合适的时机告诉它们“开始行动”或者“停止行动”就行了。
还有一个就是怎么让其他脚本方便地找到这个唯一的MyGameManager
实例。我用了一个比较土的办法,就是在MyGameManager
脚本初始化的时候,把自己赋值给一个静态变量。这样其他脚本就能通过这个静态变量轻松访问到它了。虽然有人说静态变量不太但在这种全局管理器的场景下,我觉得还是挺方便的,省了不少事儿。
最终的效果:清爽多了!
经过一番折腾,这个“无码监督管理器”算是基本成型了。现在我的游戏逻辑清晰多了:
- 想知道游戏当前是什么状态?问
MyGameManager
。 - 想改变游戏状态(比如开始、暂停、结束)?告诉
MyGameManager
,让它去执行。 - 玩家得分了?玩家脚本通知
MyGameManager
,MyGameManager
更新分数并通知UI。 - 游戏结束了?
MyGameManager
负责停止敌人生成、禁止玩家操作、显示结束界面、记录分数等一系列善后工作。
整个游戏的流程都由这个管理器串起来了,代码之间的依赖关系也大大减少了。以后想加新功能,或者修改某个模块,也更容易下手了,不用再像以前那样牵一发而动全身。
虽然这套东西可能在专业人士看来还很初级,但对我自己来说,算是一次挺有价值的实践。它让我明白了集中管理和模块解耦的重要性。有时候,不一定非要用多高深的技术,把基础的逻辑理顺了,就能解决很多问题。这就是我这回捣鼓“无码监督管理器”的一点心得体会,分享给大家,希望能有点用处!