游戏框架概述

最下面一行所有的脚本都继承于 ComponentBase 类(便于监听消息),而 ComponentBase 类 继承于 cc.component。

第二层 UI等单例 继承于 Manager 管理类,而第三层的 消息中心 继承于 MessageCenter 类

每一次传递消息 我们也需要给 消息 定义一个类 Message

具体实现例子

首先创建四个上述类

Message 类

Message 类 用于传递消息,但是我们怎么知道它这个消息要给谁呢

Message 类 里必须包含的内容:

1. 先确定我要找哪个大类(ui/npc/enemy)

2.我要找大类里面的哪个小类(也就是哪个脚本,比如铁匠、防具)

3.我要传递的内容是什么

确定好了 Message 类里面要包含什么内容,我们开始写脚本:

因为是传递消息用的类所以不需要继承于任何东西,他只是一个 Message 类。

我们把大类定义为Type,用数字来代表每个类。

Command为小类,也就是每个小脚本。

Content 为传递的内容消息,因为传递的消息可能什么类型都有,所以是any。

 

 再设置一个构造方法,把三个参数传递进来,这个类就基本完成了。

 因为如果直接用数字代替的话,我们很容易搞混我们用的是哪个大类或者哪个小类

于是我们可以定义另一个类 MessageType ,用于对应相应的数字。这样以后我们要是需要用到里面的类,我们可以很清晰准确的用上,比如要用 UI大类 的时候,我们只需要写:

就可以直接找到他,也便于后面阅读调试等。看起来很清晰,但实际上他还是个数字。

 

ComponentBase 类

ComponentBase 类 用于管理每个小类,也就是每个脚本。

在里面设置一个方法 ReceiveMessage 用于接收消息message,message的类型是Message类。

这样子ComponentBase 类 的子类 都能拥有接收消息的功能。

 

ManagerBase 类

ManagerBase 类 用于管理每个大类。

他要继承于 ComponentBase 类 ,因为它本身也要接收消息的。

 定义 被管理的消息接收者数组(里面是各个小类,也就是脚本), 命名为 ReceiveList 类型为 ComponentBase[ ] (因为这些脚本其实都是继承于 ComponentBase类的),初始化为空。

 定义 当前接收的具体消息类型,也就是说当前我接收到的是哪个大类。

messageType 类型为 number,先默认为空。

这时,我们需要设置当前管理类接收的消息类型,让它尽早初始化完成,于是写在 onLoad()  里面会比 start() 更好,让他提前预加载好。

 在下面写个方法 SetMessageType() 返回当前管理类的消息类型,具体怎么操作呢?

比如我们在 敌人管理类 就要设置这个方法 让他返回对应的消息类型:

 

把小类加进数组里,我们称之为 注册消息监听。

 也就是设置一个方法 RegisterReceiver(),传进来一个个小类,让它加进数组里面。

就比如 UI大类 里面有四个小类,那么它会调用四次这个方法,其他同理。

接下来,我们知道这个管理者的类也具备接收功能,那么我们也设置一个方法:

 这个方法要先继承父类的方法,如上代码。

我们接收消息的话一定要接收对应的消息,比方说 消息要是 UI类型的,那么要是到了 NPC那里 ,那么 NPC 是不管这个消息的,只有类型一样才可以接收。

那么我们就需要在这里面判断一下类型:

 如果不是对应的类型,则return返回。

如果是的话,那么向下分发消息(把接收到的消息派发给每一个子类,由子类自己判断是否是对应的消息,不是的话就不管该消息),遍历数组里面所有的小类。每一个小类我们都让他调用接收消息的方法(也就是上面第37行代码)。

MessageCenter 类

消息中心是单独的一个类,不需要继承组件。

 

因为消息中心是要管理所有的管理类的,所以我们要在管理类(ManagerBase)那边再做一件事:

就是我们每次实例化的时候,也就是管理类(ManagerBase)创建的时候会调用 onLoad()方法,那我们要把他自己加进消息中心列表里,这样我们每次写一个管理类的子类都会 被加进 消息中心的管理列表 里,只要你是继承于 管理类(ManagerBase)的,那么你就会自动被消息中心管理

 

 实操:

设置一个 空节点 命名为 UIManager,在它里面再添加一个空节点命名为 HP 血量,在HP 里面添加两个文字节点,如图所示。

另外添加一个玩家节点。

接下来我们通过消息的方式使得,当我们点击一次玩家,玩家的血量就减少10.

 

写一个 玩家脚本PlayerControl 挂载在玩家节点身上:

写一个 脚本UIManager 挂载在 空节点UIManage 上:

我们先把他写成一个单例:

 这样外界调用他的时候,直接写 UIManager.Instance 就直接调用他了。

最终该脚本的代码是这样的:

 

最后写一个 血量控制脚本HPControl  挂载在 HP节点 上面:

其中,第21行代码我们接收到的消息是 Message类型,用<>强转为number类型。

这样就实现了!

(b站飞羽老师视频总结~)

更多推荐