思考并回答以下问题:
前言
我们使用Unity能快速开发一款小游戏。但是如果涉及到稍微大型的游戏,就不是那么轻松了。因为大型游戏会包含很多模块,例如游戏模块,UI模块,角色模块,网络模块等等。面临的问题之一就是模块之间的耦合性,就是一个模块如何调用另一个模块。
当然也有一些框架摆在我们面前。比如单例模式框架,每个模块都使用Instance单例模式,通过模块.Instance.方法可以让脚本之间访问调用。缺点也很明显,就是耦合度很高,一个脚本修改了,会影响其他的脚本。
另一种是MVC式框架,类似于通信的接收发送消息,由中间的命令层来控制逻辑。优点就是脚本之间独立。缺点是受到框架的限制,要遵守框架的规则。
在这里给大家介绍的就是一种基于消息机制的框架。每个脚本都有发送消息和处理消息的功能。
**什么是消息机制?**就好比人类一样,两个人要交流必须要事先沟通好。比如,我们在打仗我一喊“撤退”,其他人就走。这就是一个发送者,发出“撤退”这个消息,还有一个接收者接收到“撤退”这个消息。当然这个消息也有可能有很多接收者,每个接收者也可以根据自己的状态,不处理消息。比如,断腿的人虽然听到了,但是也无法做出“撤退”这个动作。在程序里,一个脚本A发出一个消息,另外一个脚本B或多个脚本接收这个消息,并处理自身要执行的事件。
**为什么要用消息机制?**很简单,就是为了解耦合。开发线上游戏,需求变更是非常频繁的。基于消息机制的框架可以很轻松的扩展功能。
创建MsgCenter和AreaCode
MonoBase.cs
1 | using UnityEngine; |
AreaCode.cs
1 | using UnityEngine; |
MsgCenter.cs
1 | using UnityEngine; |
ManagerBase
具体的每一个模块需要做什么还不知道,需要开发一个模块的基类ManagerBase来统一管理模块能做的事情。以一个字典为核心,进行字典的增删,foreach操作。
ManagerBase.cs
1 | using System.Collections; |
使用
原来的写法
1 |
存在的问题
使用框架的写法
AudioEvent.cs
1 | using System; |
AudioManager.cs
1 | using System.Collections; |
AudioBase.cs
1 | using System.Collections; |
MainAudioCtrl.cs
1 | using System.Collections; |
UI
UIManager.cs
1 | using System.Collections; |
新建一个UI Panel,在其下创建一个按钮和Text,实现点击按钮Text内容改变。新建一个脚本TestPanel.cs。
TestPanel.cs
1 | using System.Collections; |