Unity 紅點系統

首先明確一個,即紅點系統的數據結構是一顆樹,并且紅點的數據結構的初始化需要放在游戲的初始化中,之后再是對應的紅點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 List<Button> tabs = new List<Button>();void Awake(){mailButton = GetComponent<Button>();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")).GetComponent<MailTab>();var index = i;tab.Init("Mail/Tab" + index);tab.GetComponent<Button>().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")).GetComponent<MailContent>();newMail.transform.SetAsLastSibling();var index= i;var path = "Mail/" + tabName + "/" + index;newMail.Init(path, tabName);}}/// <summary>/// 初始化紅點數據/// </summary>public 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. 效果

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/905571.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905571.shtml
英文地址,請注明出處:http://en.pswp.cn/news/905571.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

極新攜手火山引擎,共探AI時代生態共建的破局點與增長引擎

在生成式AI與行業大模型的雙重驅動下&#xff0c;人工智能正以前所未有的速度重構互聯網產業生態。從內容創作、用戶交互到商業決策&#xff0c;AI技術滲透至產品研發、運營的全鏈條&#xff0c;推動效率躍升與創新模式變革。然而&#xff0c;面對AI技術迭代的爆發期&#xff0…

【Redis】SDS結構

目錄 1、背景2、SDS底層實現 1、背景 redis作為高性能的內存數據庫&#xff0c;對字符串操作&#xff08;如鍵、值的存儲&#xff09;有極高的要求。c語言原生字符串&#xff08;以\0結尾的字符串數據&#xff09;有一些缺點&#xff1a;長度計算需要遍歷&#xff08;O(n)時間…

STM32硬件I2C驅動OLED屏幕

本文基于STM32硬件I2C驅動SSD1306 OLED屏幕&#xff0c;提供完整的代碼實現及關鍵注意事項&#xff0c;適用于128x32或128x64分辨率屏幕。代碼通過模塊化設計&#xff0c;支持顯示字符、數字、漢字及位圖&#xff0c;并優化了顯存刷新機制。 零、完整代碼 完整代碼: 1&#x…

鴻蒙 PC 發布之后,想在技術上聊聊它的未來可能

最近鴻蒙 PC 剛發布完&#xff0c;但是發布會沒公布太多技術細節&#xff0c;基本上一些細節都是通過自媒體渠道獲取&#xff0c;首先可以確定的是&#xff0c;鴻蒙 PC 本身肯定是無法「直接」運行 win 原本的應用&#xff0c;但是可以支持手機上「原生鴻蒙」的應用&#xff0c…

【JAVA】抽象類與接口:設計模式中的應用對比(16)

核心知識點詳細解釋 Java抽象類和接口的定義、特點和使用場景 抽象類 抽象類是使用 abstract 關鍵字修飾的類。它不能被實例化&#xff0c;主要用于作為其他類的基類&#xff0c;提供一些通用的屬性和方法。抽象類可以包含抽象方法和具體方法。抽象方法是使用 abstract 關鍵…

HTML 顏色全解析:從命名規則到 RGBA/HSL 值,附透明度設置與場景應用指南

一、HTML 顏色系統詳解 HTML 中的顏色可以通過多種方式定義&#xff0c;包括顏色名稱、RGB 值、十六進制值、HSL 值等&#xff0c;同時支持透明度調整。以下是詳細分類及應用場景&#xff1a; 1. 顏色名稱&#xff08;預定義關鍵字&#xff09; HTML 預定義了 140 個標準顏色名…

LVS負載均衡群集和keepalive

目錄 一. 集群概述 1.1 集群的定義 1.2 集群的分類 1. 高可用集群 HA 2. 高性能運輸群集 HPC 3.負載均衡群集 LB 4. 分布式存儲集群 二. LVS概述 2.1 LVS的定義 2.2 LVS的工作原理 2.3 LVS 的三種工作模式 2.4 LVS 三種工作模式的對比 2.5 LVS 調度算法 1. 靜態…

ZTE 7551N 中興小鮮60 遠航60 努比亞小牛 解鎖BL 刷機包 刷root 展訊 T760 bl

ZTE 7551N 中興小鮮60 遠航60 努比亞小牛 解鎖BL 刷機包 刷root 3款機型是一個型號&#xff0c;包通用&#xff0c; ro.product.system.modelZTE 7551N ro.product.system.nameCN_P720S15 #################################### # from generate-common-build-props # Th…

單片機-STM32部分:12、I2C

飛書文檔https://x509p6c8to.feishu.cn/wiki/MsB7wLebki07eUkAZ1ec12W3nsh 一、簡介 IIC協議&#xff0c;又稱I2C協議&#xff0c;是由PHILP公司在80年代開發的兩線式串行總線&#xff0c;用于連接微控制器及其外圍設備&#xff0c;IIC屬于半雙工同步通信方式。 IIC是一種同步…

Virtualized Table 虛擬化表格 el-table-v2 表頭分組 多級表頭的簡單示例

注意添加這個屬性,會影響到有多少個層級的表頭: :header-height“[50, 40]”,即后面的columnIndex 如果有fix的列CustomizedHeader會被調用多次,如果有多個層級的表頭,也會被調用多次, 實際被調用次數是(fix數 1 * 表頭層級數量) 以下代碼均刪除了JSX TS版本代碼 <templ…

防御保護-----第十二章:VPN概述

文章目錄 第二部分&#xff0c;數據安全第十二章&#xff1a;VPN概述VPN概述VPN分類VPN關鍵技術隧道技術身份認證技術加解密技術數據認證技術 數據的安全傳輸密碼學發展史 對稱加密算法 --- 傳統密碼算法密鑰解釋流加密分組加密 --- 塊加密算法填充算法PKCS7算法分組模式 公鑰密…

前端項目打包部署流程j

1.打包前端項目(運行build這個文件) 2.打包完成后&#xff0c;控制臺如下所示:(沒有報錯即代表成功) 3.左側出現dist文件夾 4.準備好我們下載的nginx(可以到官網下載一個),然后在一個沒有中文路徑下的文件夾里面解壓。 5.在繼承終端內打開我們的項目&#xff0c;找到前面打包好…

Go語言標識符

文章目錄 標識符的組成規則Go語言關鍵字預定義標識符標識符命名慣例 特殊標識符標識符訪問權限控制 在Go語言中&#xff0c;標識符(Identifier)是用來命名變量、函數、類型、常量等程序實體的名稱。 標識符的組成規則 1、必須以字母或下劃線(_)開頭&#xff1a; 字母包括Unico…

CST軟件對OPERACST軟件聯合仿真汽車無線充電站對人體的影響

上海又收緊了新能源車的免費上牌政策。所以年前一些伙伴和我探討過買新能源汽車的問題&#xff0c;小伙伴們基本糾結的點是買插電還是純電&#xff1f;我個人是很抗拒新能源車的&#xff0c;也開過坐過。個人有幾個觀點&#xff1a; 溢價過高&#xff0c;不保值。實際并不環保…

吳恩達機器學習筆記:多變量梯度下降

1.多維特征 之前我們探討了單變量/特征的回歸模型&#xff0c;現在我們對房價模型增加更多的特征&#xff0c;例如房間數樓層等&#xff0c;構成一個含有多個變量的模型&#xff0c;模型中的特征為 &#xff08; x 1 &#xff0c; x 2 &#xff0c; x 3... x n &#xff09; &…

【Linux Nano Vim快捷鍵大全】

Nano 快捷鍵大全 常用高頻操作 功能描述快捷鍵組合替代按鍵/備注使用頻率顯示幫助CtrlGF1高保存文件CtrlOF3高退出編輯器CtrlXF2高剪切當前行CtrlKF9高粘貼內容CtrlUF10高搜索文本CtrlWF6高替換文本Ctrl\AltR高撤銷操作AltU無中重做操作AltE無中跳轉到行號Ctrl_AltG中插入文件…

uniapp vue 沉浸式窗體如何獲取并排除外部手機瀏覽器底部菜單欄工具欄高度

這個問題可以簡稱為&#xff1a;uniapp vue 獲取可視窗口高度 第一種方案&#xff0c;只改變css樣式 /* 不考慮瀏覽器UI的最小視口高度 */ .element {height: 100svh; /* small viewport height */ }/* 考慮瀏覽器UI變化的動態視口高度 */ .element {height: 100dvh; /* dyna…

React Native告別圖標體積大手動更換慢的噩夢:讓圖標更新像修改文字一樣簡單

寫在前面:凌晨三點的圖標戰爭 “所有圖標都要換成圓角風格,明天上線!”——產品經理這條消息彈出時,我的保溫杯差點從手中滑落。掃了一眼項目中的347個圖標文件,我知道今晚又是個不眠夜。但就在絕望之際,同事發來一個GIF:他只是在終端輸入了iconfont-rn --update,所有…

自然語言處理與BI融合實戰:ChatBI動態語義解析技術架構剖析

在數字經濟時代&#xff0c;數據已成為企業核心競爭力的關鍵要素。如何高效挖掘數據價值、實現智能化決策&#xff0c;成為企業數字化轉型的核心命題。傳統商業智能&#xff08;BI&#xff09;工具雖具備強大的數據處理能力&#xff0c;但其技術門檻高、交互方式復雜等局限性日…

鴻蒙OSUniApp開發支持多語言的國際化組件#三方框架 #Uniapp

使用UniApp開發支持多語言的國際化組件 在全球化的今天&#xff0c;一個優秀的應用往往需要支持多種語言以滿足不同地區用戶的需求。本文將詳細講解如何在UniApp框架中實現一套完整的國際化解決方案&#xff0c;從而輕松實現多語言切換功能。 前言 去年接手了一個面向國際市場…