博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
红点系统
阅读量:6675 次
发布时间:2019-06-25

本文共 12525 字,大约阅读时间需要 41 分钟。

01.RedManager

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

using System.Collections;using System.Collections.Generic;using UnityEngine; public enum RedDotType:ushort{
None=0, Email_UnReadSstem=1, Email_UnReadPlayer=2,}
using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;public class RedDotItem : MonoBehaviour{
//红点物体 [SerializeField] private GameObject GO_RedDot; //红点类型 public List
redDotTypes; private bool bCacheRedDot = false; void Start() {
RedDotManager.Instance.RegisterRedDot(redDotTypes, this); bool bRedDot = RedDotManager.Instance.Check(redDotTypes); SetData(bRedDot, true); } public void SetData(bool bRedDot,bool bForceRefresh=false) {
if (bForceRefresh) {
GO_RedDot.SetActive(bRedDot); bCacheRedDot = bRedDot; return; } if (bCacheRedDot != bRedDot) {
GO_RedDot.SetActive(bRedDot); bCacheRedDot = bRedDot; } } public List
GetRedDotTypes() {
return this.redDotTypes; } private void OnDestroy() {
RedDotManager.Instance.UnRegisterRedDot(this); }}
using System.Collections;using System.Collections.Generic;using UnityEngine;public abstract class RedDotBase{
public virtual bool ShowRedDot(object[] objs) {
return false; }}
using System.Collections;using System.Collections.Generic;using UnityEngine;public class RedDot_EmailUnReadSystem : RedDotBase{
public override bool ShowRedDot(object[] objs) {
return MailManager.Instance.IsSystemRedDot(); }}
using System.Collections;using System.Collections.Generic;using UnityEngine;public class RedDot_EmailUnReadPlayer : RedDotBase{
public override bool ShowRedDot(object[] objs) {
return MailManager.Instance.IsPlayerRedDot(); }}
using System.Collections;using System.Collections.Generic;using UnityEngine;public class MailManager{
private static MailManager _inctance; public static MailManager Instance {
get {
if (_inctance == null) {
_inctance = new MailManager(); } return _inctance; } } private bool bSystemRedDot = true; public bool IsSystemRedDot() {
return bSystemRedDot; } public void SetSystemRedDot(bool bRedDot) {
this.bSystemRedDot = bRedDot; } private bool bPlayerRedDot = true; public bool IsPlayerRedDot() {
return bPlayerRedDot; } public void SetPlayerRedDot(bool bRedDot) {
this.bPlayerRedDot = bRedDot; }}
using System.Collections;using System.Collections.Generic;public class RedDotManager {
private static RedDotManager _inctance; public static RedDotManager Instance {
get {
if (_inctance == null) {
_inctance = new RedDotManager(); } return _inctance; } } //红点数据 Dictionary
RedDotConditionDict = new Dictionary
(); //红点物体 Dictionary
> RedDotObjDict = new Dictionary
>(); public void Initilize() {
RedDotConditionDict.Clear(); RedDotConditionDict.Add(RedDotType.Email_UnReadSstem,new RedDot_EmailUnReadSystem()); RedDotConditionDict.Add(RedDotType.Email_UnReadPlayer, new RedDot_EmailUnReadPlayer()); } // 注册红点 public void RegisterRedDot(List
redDotTypes,RedDotItem item) {
for (int i=0;i
items = new List
(); items.Add(item); RedDotObjDict.Add(redDotType,items); } } //取消注册红点 public void UnRegisterRedDot(RedDotItem item) { Dictionary
>.Enumerator itor = RedDotObjDict.GetEnumerator(); while (itor.MoveNext()) { List
redDotItems = itor.Current.Value; if (redDotItems.Contains(item)) { redDotItems.Remove(item); break; } } } // 检查红点提示 public bool Check(List
redDotTypes, object[] objs = null) { for (int i = 0; i < redDotTypes.Count; i++) { if (Check(redDotTypes[i], objs)) { return true; } } return false; } private bool Check(RedDotType redDotType, object[] objs) { if (RedDotConditionDict.ContainsKey(redDotType)) { return RedDotConditionDict[redDotType].ShowRedDot(objs); } return false; } // 更新该类型的所有红点组件 public void NotifyAll(RedDotType redDotType, object[] objs = null) { if (RedDotObjDict.ContainsKey(redDotType)) { for (int i = 0; i < RedDotObjDict[redDotType].Count; i++) { RedDotItem item=RedDotObjDict[redDotType][i]; if (item!=null) { List
redDotTypes=item.GetRedDotTypes(); bool bCheck=Check(redDotTypes, objs); item.SetData(bCheck); } } } }}
using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;public class UIEmail : MonoBehaviour{
/// /// 系统邮件按钮; /// [SerializeField] Button Button_EmailSystem; /// /// 玩家邮件按钮; /// [SerializeField] Button Button_EmailPlayer; void Awake() {
// 注意这个函数只需要初始化一次; RedDotManager.Instance.Initilize(); } // Use this for initialization void Start() {
// 设置按钮回调; Button_EmailSystem.onClick.AddListener(OnClickEmailSystem); Button_EmailPlayer.onClick.AddListener(OnClickEmailPlayer); } /// /// 系统按钮的回调; /// void OnClickEmailSystem() {
// 点击之后表示邮件读取过了,设置邮件为已读状态; // (注意这里不能够设置红点的显隐,因为是有数据控制的,所以要控制数据那边的红点逻辑); // RedDot.RedDotManager.Instance.SetData(RedDot.RedDotType.Email_UnRead,false); MailManager.Instance.SetSystemRedDot(false); RedDotManager.Instance.NotifyAll(RedDotType.Email_UnReadSstem); } /// /// 玩家按钮的回调; /// void OnClickEmailPlayer() {
// 点击之后表示邮件读取过了,设置邮件为已读状态; // (注意这里不能够设置红点的显隐,因为是有数据控制的,所以要控制数据那边的红点逻辑); // RedDot.RedDotManager.Instance.SetData(RedDot.RedDotType.Email_UnRead,false); MailManager.Instance.SetPlayerRedDot(false); RedDotManager.Instance.NotifyAll(RedDotType.Email_UnReadPlayer); }}
using System.Collections;using System.Collections.Generic;using UnityEngine;public class RedPointNode{
public string nodeName;// 节点名称 public int pointNum = 0;// 红点数量 public RedPointNode parent = null;// 父节点 public RedPointSystem.OnPointNumChange numChangeFunc; // 发生变化的回调函数 // 子节点 public Dictionary
dicChilds = new Dictionary
(); ///
/// 设置当前节点的红点数量 /// ///
public void SetRedPointNum(int rpNum) {
if (dicChilds.Count > 0) // 红点数量只能设置叶子节点 {
Debug.LogError("Only Can Set Leaf Node!"); return; } pointNum = rpNum; NotifyPointNumChange(); if (parent != null) {
parent.ChangePredPointNum(); } } ///
/// 计算当前红点数量 /// public void ChangePredPointNum() {
int num = 0; foreach (var node in dicChilds.Values) {
num += node.pointNum; } if (num != pointNum) // 红点有变化 {
pointNum = num; NotifyPointNumChange(); } } ///
/// 通知红点数量变化 /// public void NotifyPointNumChange() {
numChangeFunc?.Invoke(this); }}public class RedPointConst{
public const string main = "Main";// 主界面 public const string mail = "Main.Mail";// 主界面邮件按钮 public const string mailSystem = "Main.Mail.System";// 邮件系统界面 public const string mailTeam = "Main.Mail.Team";// 邮件队伍界面 public const string mailAlliance = "Main.Mail.Alliance";// 邮件公会界面 public const string task = "Main.Task";// 主界面任务按钮 public const string alliance = "Main.Alliance";// 主界面公会按钮}public class RedPointSystem{
public delegate void OnPointNumChange(RedPointNode node);// 红点变化通知 RedPointNode mRootNode; // 红点树Root节点 static List
lstRedPointTreeList = new List
// 初始化红点树 {
RedPointConst.main, RedPointConst.mail, RedPointConst.mailSystem, RedPointConst.mailTeam , RedPointConst.mailAlliance , RedPointConst.task, RedPointConst.alliance, }; public void InitRedPointTreeNode() {
mRootNode = new RedPointNode(); mRootNode.nodeName = RedPointConst.main; foreach (var s in lstRedPointTreeList) {
var node = mRootNode; var treeNodeAy = s.Split('.'); if (treeNodeAy[0] != mRootNode.nodeName) {
Debug.Log("RedPointTree Root Node Error:" + treeNodeAy[0]); continue; } if (treeNodeAy.Length > 1) {
for (int i = 1; i < treeNodeAy.Length; i++) {
if (!node.dicChilds.ContainsKey(treeNodeAy[i])) {
node.dicChilds.Add(treeNodeAy[i], new RedPointNode()); } node.dicChilds[treeNodeAy[i]].nodeName = treeNodeAy[i]; node.dicChilds[treeNodeAy[i]].parent = node; node = node.dicChilds[treeNodeAy[i]]; } } } } public void SetRedPointNodeCallBack(string strNode, RedPointSystem.OnPointNumChange callBack) {
var nodeList = strNode.Split('.');// 分析树节点 if (nodeList.Length == 1) {
if (nodeList[0] != RedPointConst.main) {
Debug.Log("Get Wrong Root Node! current is " + nodeList[0]); return; } } var node = mRootNode; for (int i = 1; i < nodeList.Length; i++) {
if (!node.dicChilds.ContainsKey(nodeList[i])) {
Debug.Log("Does Not Contains Child Node :" + nodeList[i]); return; } node = node.dicChilds[nodeList[i]]; if (i == nodeList.Length - 1) // 最后一个节点了 {
node.numChangeFunc = callBack; return; } } } ///
/// 激发数据变化 /// ///
///
public void SetInvoke(string strNode, int rpNum) {
var nodeList = strNode.Split('.');// 分析树节点 if (nodeList.Length == 1) {
if (nodeList[0] != RedPointConst.main) {
Debug.Log("Get Wrong Root Node! current is " + nodeList[0]); return; } } var node = mRootNode; for (int i = 1; i < nodeList.Length; i++) {
if (!node.dicChilds.ContainsKey(nodeList[i])) {
Debug.Log("Does Not Contains Child Node :" + nodeList[i]); return; } node = node.dicChilds[nodeList[i]]; if (i == nodeList.Length - 1) // 最后一个节点了 {
node.SetRedPointNum(rpNum); // 设置节点的红点数量 } } }}
using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;public class BootStart : MonoBehaviour{
public Image imgMail; public Image imgMailSystem; public Image imgMailTeam; public Text txtMail; public Text txtMailSystem; public Text txtMailTeam; private void Start() {
RedPointSystem rps = new RedPointSystem(); rps.InitRedPointTreeNode(); // 设置 红点节点的处理函数 rps.SetRedPointNodeCallBack(RedPointConst.mail, MailCallBack); rps.SetRedPointNodeCallBack(RedPointConst.mailSystem, MailSystemCallBack); rps.SetRedPointNodeCallBack(RedPointConst.mailTeam, MailTeamCallBack); // 激发节点变化 rps.SetInvoke(RedPointConst.mailSystem,3); rps.SetInvoke(RedPointConst.mailTeam, 4); } void MailCallBack(RedPointNode node) {
txtMail.text = node.pointNum.ToString(); imgMail.gameObject.SetActive(node.pointNum > 0); Debug.Log(node.nodeName + " rp Num changed! num = " + node.pointNum); } void MailSystemCallBack(RedPointNode node) {
txtMailSystem.text = node.pointNum.ToString(); imgMailSystem.gameObject.SetActive(node.pointNum > 0); Debug.Log(node.nodeName + " rp Num changed! num = " + node.pointNum); } void MailTeamCallBack(RedPointNode node) {
txtMailTeam.text = node.pointNum.ToString(); imgMailTeam.gameObject.SetActive(node.pointNum > 0); Debug.Log(node.nodeName + " rp Num changed! num = " + node.pointNum); }}

转载地址:http://efrxo.baihongyu.com/

你可能感兴趣的文章
归档与反归档
查看>>
Learning Data Structure_5_图(2)
查看>>
HDS G1000和Gx00的端口属性
查看>>
Innodb中mysql如何快速删除2T的大表
查看>>
bash基本命令的使用(笔记)
查看>>
windows_learn 002 用户管理和组策略
查看>>
kafka性能优化
查看>>
含有echart 图表的报表打印
查看>>
域控迁移为08 R2后无法访问Linux服务器共享
查看>>
我的友情链接
查看>>
华为认证考试
查看>>
我的友情链接
查看>>
nosql之redis简单安装与使用
查看>>
System Center Operation Manager 2012(一) 拓扑变化
查看>>
基于LVS的NAT模式实现PHP应用
查看>>
在物质与精神之间实现平衡
查看>>
vim 文本编辑器
查看>>
使用angular做微信内html5开发时碰到的两个坑
查看>>
pvst+
查看>>
关于gradle的入门教程
查看>>