Unity Unity紅點邏輯

2021-08-18 17:40:26 字數 4758 閱讀 2911

在玩遊戲的時候,尤其是手遊的時候,經常會看到那些小紅點,讓你不斷點進去,總有種逼死強迫症的感覺!從玩家的角度來說,很討厭,其實程式設計師也比較討厭的。雖然紅點就2個狀態,顯示和不顯示,但如果紅點邏輯沒寫好,對效能的影響非常大。

先簡單來說幾個原因:

1.讀表

沒法避免的要素,幾乎所有的紅點邏輯都需要讀表,這個就不說了。

2.監聽事件太多

舉個簡單的例子:**上的紅點,比如乙個商品購買最基本的必須要有錢(遊戲幣),那就需要監聽貨幣事件,有人物等級限制,需要監聽人物等級事件,有vip限制,需要監聽vip等級事件,有夠買限制,需要監聽商店事件等等。導致的結果就是有時候事件頻發的時候執行了很多遍紅點邏輯。一般的做法就是做延遲,到現在也沒遇到什麼好的解決方案。不知道有大神知道嗎?

3.子頁籤

其實一開始我認為要寫紅點邏輯一般會採用樹結構,直到我看到了神一般大**後,我服了!舉個簡單的例子:還是商店,主介面會有商店icon,商店裡有頁籤,頁籤裡有很多商品,這些全部都是分開的,比如執行一大串紅點邏輯後,顯示商店icon紅點,再執行一大串幾乎一樣的邏輯後,顯示頁籤紅點,再執行一大串幾乎一樣的邏輯後,顯示商品紅點。這個我就不太多說了。

先來幅自己畫的樹結構,不錯,符合程式美。樹結構具體什麼就不解釋了,網上一堆,看資料結構也繞不過去。只要明白葉節點決定父節點,父節點的父節點,父節點的父節點的父節點。。。是否顯示紅點就好了,這應該很清楚了。

直接上**,因為專案是lua,所以紅點也是lua寫的,易於以後熱更。

require "manager/reddotstatemgr"

local reddot = {}

reddot.__index = reddot

function reddot:new()

local new_ins = {}

setmetatable(new_ins, reddot)

new_ins.m_dotname = 0

new_ins.m_bisshow = false

new_ins.m_childdotlist = {}

return new_ins

end-- 從葉節點往根節點遞迴

function reddot:getisshowreddot()

if self.m_childdotlist == nil or next(self.m_childdotlist) == nil then

return self.m_bisshow

endlocal bisshow = false

for childdotname, childdot in pairs(self.m_childdotlist) do

if childdot:getisshowreddot() then

bisshow = true

break

endend

return bisshow

end-- 獲取紅點數量

function reddot:getreddotnum()

if self.m_childdotlist == nil or #self.m_childdotlist == 0 then

return 0

endlocal reddotnum = 0

for childdotname, childdot in pairs(self.m_childdotlist) do

if childdot:getisshowreddot() then

reddotnum = reddotnum + 1

endend

return reddotnum

end--重新整理葉節點資料

function reddot:updateleafdata(bisshow)

self.m_bisshow = bisshow

end--獲取子節點資料

function reddot:getchilddot(childdotname)

return self.m_childdotlist[childdotname]

end--新增子節點資料

function reddot:addchilddot(childdotname, childdot)

self.m_childdotlist[childdotname] = childdot

endreddotmgr = {}

reddotmgr.m_dotdatalist = {}--紅點資料

reddotmgr.m_dotuilist = {}--紅點ui

--設定紅點狀態,樹結構

--childdotname:子節點,parentdotname:根節點

--bisshow:只需要設定葉節點狀態

function reddotmgr:setreddotstate(childdotname, parentdotname, bisshow)

local childdot = self:getreddot(childdotname)

if bisshow ~= nil then

childdot:updateleafdata(bisshow)

endlocal parentdot = self:getreddot(parentdotname)

if parentdot:getchilddot(childdotname) == nil then

parentdot:addchilddot(childdotname, childdot)

endend--顯示紅點(從池裡取)

function reddotmgr:showreddotui(dotname, parenttran, pos)

if self:getreddotisshow(dotname) then

local reddotui = self:getreddotui(dotname, parenttran)

if reddotui == nil then

self:createreddotui(dotname, parenttran, pos)

endelse

self:removereddotui(dotname)

endend--刪除紅點(放回池裡)

function reddotmgr:removereddotui(dotname)

if self.m_dotuilist[dotname] ~= nil then

// 放回池裡

self.m_dotuilist[dotname] = nil

endendfunction reddotmgr:getreddotui(dotname)

return self.m_dotuilist[dotname]

endfunction reddotmgr:createreddotui(dotname, parenttran, pos)

// 動態建立紅點gamobject

// 再掛到parenttran節點下

endfunction reddotmgr:getreddot(dotname)

if dotname == nil then return end

if self.m_dotdatalist[dotname] == nil then

local tempdot = reddot:new()

self.m_dotdatalist[dotname] = tempdot

endreturn self.m_dotdatalist[dotname]

end--獲取紅點狀態:true:顯示 false:不顯示

function reddotmgr:getreddotisshow(dotname)

local dot = self:getreddot(dotname)

return dot:getisshowreddot()

end--獲取子節點紅點數量

function reddotmgr:getchildreddotnum(dotname)

local dot = self:getreddot(dotname)

return dot:getreddotnum()

end

邏輯很簡單就不解釋了,具體使用就這樣,也很簡單

function uupdatedotstate()

local isshow = false

// 一系列判斷

reddotmgr:setreddotstate(葉節點, 子節點1, isshow)

reddotmgr:setreddotstate(子節點1, 子節點2)

//。。。

reddotmgr:setreddotstate(子節點n, 根節點)

endfunction updatereddotui()

reddotmgr:showreddotui(葉節點, 葉節點transform)

reddotmgr:showreddotui(子節點1, 子節點1transform)

//。。。

reddotmgr:showreddotui(根節點, 根節點transform)

endfunction uihero:removereddotui()

reddotmgr:removereddotui(葉節點)

reddotmgr:removereddotui(子節點1)

//。。。

reddotmgr:removereddotui(根節點)

end

Laya 首日紅點邏輯

author ixenos 2019 08 26 10 50 27 1.原理 顯然,首日紅點意味著包含程序銷毀的情況,那麼就要持久化儲存資訊,這裡我們使用localstorage儲存時間點,存入時,進行時間判斷來決定是否銷毀標誌,然後在每次登陸時進行非值重新整理,時間未達到不銷毀標標誌 1 2 設定...

unity unity節點遍歷之BFS DFS

在unity的hierachy面板上,節點是以樹形結構布局的,有些時候我們需要對節點進行遍歷,通常有兩種比較常用的遍歷方式,一種是從指定節點出發 比如根節點 優先遍歷直接相鄰的子節點,即廣度優先遍歷 bfs 另一種是從指定節點出發,一路遍歷到葉子節點後再遍歷下一節點,即深度優先遍歷 dfs 遍歷節點...

UItabBar上新增紅點

系統提供的bagevalue展現形式只能為數字形式。其實小紅點展示形式的實現方式非常簡單 只需要在工程中實現如下的uitabbar分類就可以實現 直接拷貝一下 即可 在.h檔案中 import inte ce uitabbar wjbadgevalue void showbadgeonitemind...