小红点系统

欢迎 来到 王国聪的博客!

小红点系统

模块预览图:

内部小红点-图1:

模块预览图

外部父节点-图2:

父节点小红点

图1为子层,图2为主层,当子层拥有信息时,往主层通知。
一般的思路是:子层绑定主层。当消息状态来了,通知主层,主层亮起红点。这就意味着,我们要把这个系统写成树形结构。这样我们就会在主层和子层都要写小红点

但是我们使用事件系统和单例模式改造一番。

用一个小红点管理器类(单例)来做监听器,注册事件,调用事件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private class Listener//这儿是监听
{
public System.Object m_kReceiver = null;
public string m_kEventKey = null;
public UnityEngine.GameObject m_kGameObject = null;
public int m_iRedPointType = 0; //模块类型
public string m_kParamString = string.Empty; //参数1
public int m_iParamsInt = 0; //参数2
public float m_fNextUpdateTime = -1.0f; //下次触发的时间间隔,负数表示不触发

public override bool Equals(object obj)
{
Listener tmpObj = (Listener) obj;
return m_kEventKey.Equals(tmpObj.m_kEventKey) && m_kGameObject == tmpObj.m_kGameObject;
}

public override int GetHashCode()
{
return m_kGameObject.GetHashCode();
}
}

但是游戏中一般模块众多,如果直接通用全部注册在类里(随着游戏迭代会冗余),会导致调用时越来越缓慢。

​ 我们可以用一个类定义一个最基本的小红点属性,方法,然后每一个模块小红点单独继承它,然后调用时,通过在父类里定义的每一个子类的枚举类型,直接调用到对应的类型里面去,避免了调用到其他模块去,尽可能解耦合。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public enum RedPointType
{
RP_NONE = 0,
RP_SPECIAL, //特殊的模块,解决多模块查找的问题
RP_MAIL, //邮件
RP_FRIEND, //好友
RP_GETNEWWARRIOR, //抽奖
RP_TRANSCRIPT_AWARD, //副本宝箱
RP_WARRIOR, //英雄
RP_CHANLLENGE, //挑战
RP_MAINCHAR, //主角
RP_COMPITITIVE, //竞技
RP_BACKPACK, //背包
RP_LEAGUE, //公会
RP_NEWWARRIOR, //新英雄
RP_CHAT, //聊天
RP_WELFAREACTIVITY, //福利
RP_WingSystem, //羽翼系统
RP_Pet, //宠物
RP_Partner, //伙伴
RP_AcheiveTitle, //成就和称号
}

定义成类似的框架:

框架

在使用时,就可以在父节点和子节点注册一个单独事件:对应的函数,对应的小红点类型,对应的小红点,然后在小红点触发的地方调用该事件。

子节点注册小红点

子节点注册单一的事件,类型,调用的方法

父节点注册小红点

在外层父节点将所有子节点的事件全部注册

调用

在资产刷新时或者触发小红点时调用对应事件
坚持原创技术分享,您的支持将鼓励我继续创作