用樹實現客戶端紅點系統

紅點大家一定不陌生,不管是遊戲還是軟件,甚至是手機系統都通過紅點的直觀方式來告知用戶或者玩家“你有新的消息,請注意查收”。

紅點系統是一個比較讓人討厭的系統,至少對於遊戲開發人員來說是的。因爲涉及的地方多,層次深,邏輯判定複雜,表現多樣,有的需要服務器判定,有的需要客戶端判定,所以處理起來十分麻煩。

經歷過的幾個項目,都因爲前期沒有針對紅點系統做整體規劃,所以後期就栽在紅點的需求和表現上,有3-4套紅點系統並行,重構了1次仍然不能從根本上解決,但總的來說已經好很多了,那麼紅點系統的方法在這裏跟大家分享一下。


紅點系統總覽

 

 

如上圖所示,規劃紅點系統的時候,我們將整個系統分爲獨立的三個部分:結構層、驅動層和表現層。

結構層用來部署紅點的層級結構,做過紅點系統的都知道,很多時候紅點系統的層級都很深,所以我們要用一個結構來描述層級,這個就是我們今天的主題——樹結構。

驅動層是指如何驅動這個樹結構產生狀態變化,以及狀態變化之後如何將變化的行爲通知到指定的表現層,在一定的程度上將數據和表現分離開。

表現層就專門承擔表現的職責,比如:有的紅點就是一個單純的紅點,有的需要顯示數字,有的可能是圖標晃動,有的是顯示new標籤,有的是播放特效等等。這些都可以歸屬在表現層統一去管控。


結構設計

我們先來看一個示例,示例是我用UGUI擺的,大家將就看下吧。

 

我們可以看到主界面有三個主要入口,分別是:公會、任務、郵件。郵件界面裏,又分爲三個標籤:系統、隊伍、公會。

那麼如果按照樹的結構去分析,樹結構大概如下圖:

 

以主界面爲根節點,其它節點都爲樹的各個子節點或者葉子節點。這裏只對郵件一個模塊做了規劃,所以郵件下面還有3個子節點,本章節也是基於這個規劃去設計的Demo和代碼。


代碼設計

既然是樹結構,那麼我們首先看看樹結構怎麼規劃。如下:

 

定一個const類,按照系統來劃分樹的各個節點,比如:上面展示的紅點樹結構,代碼可以使用string來完成。這個定義不僅僅是用來規劃結構,也會爲後面事件驅動的時候提供key。

有了樹結構的表示之後,再看看節點怎麼表示:

 

幾個字段的意義註釋比較清楚,就不多做講解。節點也定義清楚了之後,看看RedPointSystem要做哪些事情。

 

第一個是定義一個事件驅動的Delegate類型,第二個是要持有紅點樹的Root節點,第三個是將需要關心的紅點樹加入到List中方便啓動時候進行初始化。

接下來就是初始化了:

 

代碼很簡單,就是把每一個string都切割成數組,然後把數組處理成樹的結構。

現在樹結構有了,那麼我們要對樹結構設置事件驅動,其實就是給這棵樹綁定一個事件回調:

 

這裏要注意的是,因爲傳進來的是string,所以必須要處理到最後一個節點纔是真正需要綁定回調的節點。

到這裏,樹結構也好了,事件監聽也好了,那麼驅動層呢?如下:

 

這個函數和上面那個設置Callback的非常像,實際項目需要考慮將2個公有部分抽出來做公共函數,我這裏爲了快速展示,代碼寫的不簡潔。總的來說,其實就是找到對應的節點,給它設置具體的紅點數量。

也就是說紅點的數量其實跟整套紅點系統無關,它可以是來自服務器的協議通知,也可以是客戶端自己傳遞的數據,或者從文件裏讀取出來的。總之,紅點系統本身只關注紅點的產生和管理以及表現,不關心數據的來源。

上面的代碼裏關聯了一個SetRedPointNum的函數,這個是寫在RedPointNode解構裏的。看看這個函數:

 

這裏需要特別注意,我們的紅點樹是有嚴格層級界定的,也就是說所有非葉子節點的紅點都應該是來自於它孩子節點的統計,比如:主界面上郵件顯示的數量,是郵件界面裏面3個標籤的數量之和,不允許直接對非葉子節點直接設置紅點數量,如果非要有相關邏輯,比較建議在表現層做獨立表現(每個節點都是可以獨立綁定回調事件的)。

這裏又涉及了兩個自己內部的函數,一併貼出來:

 

整個紅點系統到這裏就設計完成了。


實際展示

來看看實際表現吧!

Demo代碼:

 

事件處理函數:

 

界面表現:

 

日誌輸出:

 

符合預期了!


後話

開頭我們說了,紅點系統有三個模塊,目前Demo只實現了結構層和驅動層,表現層沒有做統一規劃,不過這個沒有難度,在所有的監聽函數裏都導向到一個統一的處理類,通過傳入樣式進行分類處理就好了。

因爲是Demo演示,只展示了思想和效果,代碼不是很簡潔,性能也不是最好,所以如果大家取用需要再斟酌數據結構和性能。

另外,這只是紅點系統的一種實現方式,並不能解決所有情況,但是目前來說,絕大多數的紅點需求都可以通過這個方案解決了。


這是侑虎科技第630篇文章,感謝作者放牛的星星供稿。歡迎轉發分享,未經作者授權請勿轉載。如果您有任何獨到的見解或者發現也歡迎聯繫我們,一起探討。(QQ羣:793972859)

作者主頁:https://www.zhihu.com/people/niuxingxing,作者也是U Sparkle活動參與者,UWA歡迎更多開發朋友加入U Sparkle開發者計劃,這個舞臺有你更精彩!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章