中科汇联网站建设手册,肇庆市建设企业网站怎么样,淄博网站制作定制,一个页面的html5网站模板 psd首先明确一个#xff0c;即红点系统的数据结构是一颗树#xff0c;并且红点的数据结构的初始化需要放在游戏的初始化中#xff0c;之后再是对应的红点UI侧的注册#xff0c;对应的红点UI在销毁时需要注销对红点UI的显示回调注册#xff0c;但是不销毁数据侧的红点注册
- …首先明确一个即红点系统的数据结构是一颗树并且红点的数据结构的初始化需要放在游戏的初始化中之后再是对应的红点UI侧的注册对应的红点UI在销毁时需要注销对红点UI的显示回调注册但是不销毁数据侧的红点注册
- 具体分布
1. ReddotNode 红点结点类数据侧 红点结点类负责承载红点的数据关系其中在_reddotCnt的数据改变时判断和现有值是否相等如果不相等赋值的同时调用UI更新的回调
2. 红点UI类表现侧 这里设计的是一个红点表现的抽象基类因为红点的表现可能有多种多样比如最直接的一个红色的点或者是显示数字的红点或者其他那么对应的红点类型只需要继承这个类然后实现各自的ReddotCallback就行了 在SubReddot方法中isCallImmediate参数用来判断是否需要在UI注册时立马调用一次回调一般来说在UI注册时默认需要调用一次来判断是否需要显示红点所以这里默认是true这样的话当重新回到某个UI面板时重走一遍初始化注册时会自动调一次红点显示判断
3. 具体红点类型 这里举了个例子这是一个直接显示隐藏的红点类型所以只需要重写ReddotCallback在内部判断红点计数控制UI的显示隐藏就好
4. 红点树管理类 既然是管理类所以这个类被设计为一个单例类 在这个类的设计中在查找方法中不设置创建的部分因为之前参考某些红点框架在查找不到时会去主动创建但这里没有这么做但在设置红点时存在查找的部分 对于改变红点计数方法其传入的数字是一个增量是可正可负的因为有的时候是减红点数有的时候是加红点数这个时候就可以传入-1或1如果当前结点的红点数加上增量 0说明超出了范围那么手动将增量设置为负的当前结点红点数这样保证了即使超出范围最后得到的值是0 并且在这里一开始是用的SetReddots方法即设置因为当想要改变一个红点的计数时说明已经要用到这个结点那么没有的话一定要创建出来如果有的话刚好直接查找就好 之后遍历这条路径上的每一个结点将增量加上
- 具体使用
1. 邮件面板主页
public class Mail : MonoBehaviour{public Button mailButton;public GameObject mailPanel;public GameObject mailContent;public ReddotView reddotView;public GameObject mailTab;public GameObject Tab;public ListButton tabs new ListButton();void Awake(){mailButton GetComponentButton();mailButton.onClick.AddListener(OnMailButtonClick);//ReddotTree.Instance.SetReddots(Mail);InitMailData();reddotView.SubReddot(Mail);// var node ReddotTree.Instance.SearchNode(Mail);// if(node.ReddotCnt 0)// {// reddotView.ReddotCallback(node);// }}void OnMailButtonClick(){for (int i 0; i 3; i){var tab Instantiate(mailTab, Tab.transform.Find(Viewport/Content)).GetComponentMailTab();var index i;tab.Init(Mail/Tab index);tab.GetComponentButton().onClick.AddListener(() OnTabClick(Tab index));}OnTabClick(Tab0);}public void OnTabClick(string tabName){var content mailPanel.transform.Find(Viewport/Content);for (int i 0; i content.childCount; i){Destroy(content.GetChild(i).gameObject);}for (int i 0; i 5; i){var newMail Instantiate(mailContent, mailPanel.transform.Find(Viewport/Content)).GetComponentMailContent();newMail.transform.SetAsLastSibling();var index i;var path Mail/ tabName / index;newMail.Init(path, tabName);}}/// summary/// 初始化红点数据/// /summarypublic void InitMailData(){for (int i 0; i 3; i){var path Mail/Tab i;for (int j 0; j 5; j){var mailPath path / j;ReddotTree.Instance.ChangeReddotCnt(mailPath, 1);}}}public void OnDestroy(){reddotView.UnSubReddot(Mail);}}这是一个模拟邮件主面板的类其初始化红点数据的方法写在了InitMailData中 这里直接使用了ChangeReddotCnt方法在查找不到的时候直接设置红点结点数据这个方法会在面板初始化的时候调用 可以看到在数据初始化之后此面板才注册了自身节点 注意在OnDestroy方法中需要注销对于红点UI的注册
具体结构如下 可以看到红点的UI默认是没有激活的
2. 邮件侧边栏
public class MailTab : MonoBehaviour
{public ReddotView reddotView;public string path;public void Init(string path){reddotView.SubReddot(path);this.path path;// var node ReddotTree.Instance.SearchNode(path);// if(node.ReddotCnt 0)// {// reddotView.ReddotCallback(node);// }}public void OnDestroy(){reddotView.UnSubReddot(path);}
}这里只需要在初始化的时候注册红点就行因为红点数据已经在一开始初始化了同时OnDestroy的时候需要取消注册
3. 邮件条目
public class MailContent : MonoBehaviour{public ReddotView reddotView;public Button contentButton; public Button deleteButton;public string path;public Text contentText;public void Init(string path, string content){this.path path;reddotView.SubReddot(path);// var node ReddotTree.Instance.SearchNode(path);// if(node.ReddotCnt 0)// {// reddotView.ReddotCallback(node);// }//ReddotTree.Instance.ChangeReddotCnt(path, 1);contentText.text content;}void Awake(){contentButton.onClick.AddListener(OnContentButtonClick);deleteButton.onClick.AddListener(OnDeleteButtonClick);}public void OnContentButtonClick(){ReddotTree.Instance.ChangeReddotCnt(path, -1);}public void OnDeleteButtonClick(){ReddotTree.Instance.ChangeReddotCnt(path, -1);//ReddotTree.Instance.UnSubReddot(path);Destroy(gameObject);}void OnDestroy(){//ReddotTree.Instance.ChangeReddotCnt(path, -1);//ReddotTree.Instance.UnSubReddot(path);reddotView.UnSubReddot(path);}}同样是在初始化时注册销毁时注销
4. 效果