当前位置: 首页 > wzjs >正文

模版网站建设企业关于友情链接的作用有

模版网站建设企业,关于友情链接的作用有,做外贸服装的网站,网站制作二维码红点的实现,一般都是有层级关系的,子节点的红点亮起来的时候,要把父节点的红点也给点亮,当所有子节点红点都隐藏的时候,父节点的红点也需要跟着进行隐藏。红点的逻辑在设计的时候,尽量与系统功能进行分离&a…

红点的实现,一般都是有层级关系的,子节点的红点亮起来的时候,要把父节点的红点也给点亮,当所有子节点红点都隐藏的时候,父节点的红点也需要跟着进行隐藏。红点的逻辑在设计的时候,尽量与系统功能进行分离,我们在实现红点系统的时候,只用关心最后面那个节点也就是叶子节点的显示隐藏状态,父节点会根据子节点的状态自动进行刷新处理。

在这里插入图片描述
如图所示,当我们要实现上面这个功能的红点时候,我们可以把每一层显示的红点抽出一个红点对象 RedDotModel,然后构建一个红点树,这个红点树可以通关配置进行初始化,配置内容需要包含红点类型,红点拥有的子节点,叶子节点不需要配置子节点.
红点model中保存的有自己父节点对象和所有子节点对象
红点简单配置如下

local redDotConfig = {[1] = { name = "功能A 1级界面", serverRedModelName = "", clientRedModelName = "", redType = -1, functionList = {}, childrens = {2}},[2] = { name = "功能A 2级界面", serverRedModelName = "", clientRedModelName = "", redType = -1, functionList = {}, childrens = {3,4}},[3] = { name = "功能A 3级界面A", serverRedModelName = "", clientRedModelName = "ChallengeNewChapterRedDotModel", redType = 3, functionList = {}, childrens = {}},[4] = { name = "功能A 3级界面B", serverRedModelName = "", clientRedModelName = "ChallengeRewardRedDotModel", redType = 2, functionList = {}, childrens = {}},[5] = { name = "功能B 1级界面", serverRedModelName = "", clientRedModelName = "", redType = -1, functionList = {}, childrens = {6}},[6] = { name = "功能B 2级界面", serverRedModelName = "DayTaskFinishRedDotModel", clientRedModelName = "", redType = 1, functionList = {}, childrens = {}},
}

红点配置映射到红点集合,

function RedDotManager:init(serverRedModels)---@type RedDotModel[]self.redModels = {}self.bindList = {}---初始化红点列表for id, v in pairs(redDotConfig) dolocal redModelif v.clientRedModelName and v.clientRedModelName ~= "" thenlocal redId = idprintError(v.clientRedModelName)---客户端红点需要重写一个继承RedDotModel的脚本,处理红点显示逻辑local redModelClas = require("models.redDot."..v.clientRedModelName)redModel = redModelClas.new(id, v)elseredModel = RedDotModel.new(id, v)endself.redModels[id] = redModelendlocal leafRedModes = {}  --叶节点红点model列表---初始父子级关系for i,redModel in ipairs(self.redModels) dolocal childs = redModel.config.childrensif childs and next(childs) thenfor _,childId in ipairs(childs) doif self.redModels[childId] thenlocal childModel = self.redModels[childId]redModel:addChild(childModel)elseprintError("子节点的配置有缺失,redId = " ..redModel.id..", childId = " .. childId)endendelsetable.insert(leafRedModes, redModel)endendend

在UI界面中,我们先从红点管理器中获取当前界面红点对象,然后把红点对象绑定到红点对象身上,当红点数据发生的时候,自动刷新关联的红点G阿么Object对象的显示隐藏状态

	local gob = UnityEngine.GameObject.New()gob.name = "1级界面";gob.transform.position = UnityEngine.Vector3.New(1,1,1)local redModel = RedDotManager:getRedModelById(1)RedDotManager:bind(gob, redModel)

完整代码如下

红点model基类

RedDotModel = class("RedDotModel")
---@class RedDotModel
local RedDotModel = RedDotModel
---RedDotModel主要内容
---1 保存子节点列表 和 父节点对象
---2 通关setNum方法设置红点数量的时候,通关回调函数刷新界面显示
function RedDotModel:ctor(id, cfg)self.id = idself.config = cfg---@type RedDotModel[] 子节点列表self.childs = {}---@type function[] 回调函数集合self.callbacks = {}self.num = 0
endfunction RedDotModel:onInit()self:refreshNum()
end---添加子节点
function RedDotModel:addChild(child)table.insert(self.childs, child)child:_addParent(self)
end---@param trarget GameObject
---@param callback function
function RedDotModel:addCallback( trarget, callback )self.callbacks[trarget] = callback
endfunction RedDotModel:removeCallback(target)if self.callbacks[target] thenself.callbacks[target] = nilend
end		---移除子红点(通常功能红点是不需要移除的,但是如果红点对象是某个武器,武器分解后,这个武器相关的红点是需要移除的)
---@param child RedDotModel
function RedDotModel:removeChild(child)local index = table.indexof(self.childs, child)if index and index > 0 thentable.remove(self.childs, index)if #self.childs > 0 thenself:refreshNum()elseif self.parent thenself.parent:removeChild(self)self.parent:refreshNum()endendendchild:onDestroy()
endfunction RedDotModel:removeAllChild()for i,child in ipairs(self.childs) doself:removeAllChild(child)end
endfunction RedDotModel:getChildById(redId)for i,model in ipairs(self.childs) doif model.id == redId thenreturn modelendendend---设置红点数量,只用于刷新没有父节点的对象,父节点的num通关通过子节点自动获取
function RedDotModel:setNum(num)assert(not next(self.childs), "父节点不能直接设置数量: " .. self.id)self:_setNum(num)
end---refreshNum用于刷新父节点红点数量,子节点红点发生变化时候用setNum 方法
function RedDotModel:refreshNum()if  next(self.childs) thenlocal num = 0local oldNum = self.num--获取所有子红点数量for idx, childModel in ipairs (self.childs) donum = num + childModel:getNum()endself:_setNum(num)endendfunction RedDotModel:getNum()return self.num
end---红点对象消耗时候调用
function RedDotModel:onDestroy()end---添加父节点
function RedDotModel:_addParent(parent)self.parent = parent
endfunction RedDotModel:_setNum(num)local oldNum = self.numself.num = numself:_onNumChange(self.num - oldNum)
endfunction RedDotModel:_onNumChange(diffNum)if diffNum and diffNum ~= 0 thenfor target, callback in pairs(self.callbacks) docallback(target)endendif self.parent thenself.parent:refreshNum()end
end

红点管理类

RedDotManager = {}
---@class RedDotManager
local RedDotManager = RedDotManager
require("RedDot/RedDotBinder")RedDotShowType = {Normal = 1, --常规红点Reward = 2, --奖励类型红点New = 3,    --“新” 红点
}---红点配置
local redDotConfig = {[1] = { name = "功能A 1级界面", serverRedModelName = "", clientRedModelName = "", redType = -1, functionList = {}, childrens = {2}},[2] = { name = "功能A 2级界面", serverRedModelName = "", clientRedModelName = "", redType = -1, functionList = {}, childrens = {3,4}},[3] = { name = "功能A 3级界面A", serverRedModelName = "", clientRedModelName = "ChallengeNewChapterRedDotModel", redType = 3, functionList = {}, childrens = {}},[4] = { name = "功能A 3级界面B", serverRedModelName = "", clientRedModelName = "ChallengeRewardRedDotModel", redType = 2, functionList = {}, childrens = {}},[5] = { name = "功能B 1级界面", serverRedModelName = "", clientRedModelName = "", redType = -1, functionList = {}, childrens = {6}},[6] = { name = "功能B 2级界面", serverRedModelName = "DayTaskFinishRedDotModel", clientRedModelName = "", redType = 1, functionList = {}, childrens = {}},
}function RedDotManager:init(serverRedModels)---@type RedDotModel[]self.redModels = {}self.bindList = {}---初始化红点列表for id, v in pairs(redDotConfig) dolocal redModelif v.clientRedModelName and v.clientRedModelName ~= "" thenlocal redId = idprintError(v.clientRedModelName)---客户端红点需要重写一个继承RedDotModel的脚本,处理红点显示逻辑local redModelClas = require("models.redDot."..v.clientRedModelName)redModel = redModelClas.new(id, v)elseredModel = RedDotModel.new(id, v)endself.redModels[id] = redModelendlocal leafRedModes = {}  --叶节点红点model列表---初始父子级关系for i,redModel in ipairs(self.redModels) dolocal childs = redModel.config.childrensif childs and next(childs) thenfor _,childId in ipairs(childs) doif self.redModels[childId] thenlocal childModel = self.redModels[childId]redModel:addChild(childModel)elseprintError("子节点的配置有缺失,redId = " ..redModel.id..", childId = " .. childId)endendelsetable.insert(leafRedModes, redModel)endend---初始化子红点方法for i,redModel in ipairs(leafRedModes) doredModel:onInit()endif serverRedModels and  next(serverRedModels) then---填充服务器数据for i,v in ipairs(serverRedModels) doself:updateRedModelByServerData(v)endendend---绑定红点对象
---@param targetGo GameObject
---@param redDotModel RedDotManager
function RedDotManager:bind(targetGo, redDotModel)if self.bindList[targetGo] then---@type RedDotBinderlocal binder = self.bindList[targetGo]binder:unBind()binder:onDestroy()end---@type RedDotBinderlocal binder = RedDotBinder.new(targetGo, redDotModel)self.bindList[targetGo] = binder
endfunction RedDotManager:unBind(targetGo)if self.bindList[targetGo] then---@type RedDotBinderlocal binder = self.bindList[targetGo]binder:unBind()end
end---通关服务器数据刷新红点
function RedDotManager:updateRedModelByServerData(serverRedData)local redId = serverRedData.redIdif self.redModels[redId] thenlocal isShow = serverRedData.isShowlocal num = isShow and 1 or 0self.redModels[redId]:setNum(num)end
end---获取红点数据
---@return RedDotModel
function RedDotManager:getRedModelById(redId)if self.redModels[redId] thenreturn self.redModels[redId]endprintError("没有找到红点数据,红点Id="..redId)
end

事件名称

eventTypes = {ChallengeChapterUnlock = "ChallengeChapterUnlock",ChallengeChapterFinish = "ChallengeChapterFinish",
}

事件管理器

EventManager = {}function EventManager:init()self.eventListenList_ = {}self:addEvent("APP_ENTER_FOREGROUND_EVENT", self, self.EnterBack)self.sdkEventList = {}
endfunction EventManager:addEvent(eventName, target, handler)if eventName == nil thenreturnendif type(eventName) == "table" thenfor _, subEventName in pairs(eventName) doif type(subEventName) == "number" thensubEventName = tostring(subEventName)endself:addEvent_(subEventName, target, handler)endelseif type(eventName) == "string" thenself:addEvent_(eventName, target, handler)elseif type(eventName) == "number" thenself:addEvent_(tostring(eventName), target, handler)elseprint("uncall " .. eventName)end
endfunction EventManager:addEvent_(eventName, target, handler)local eventTable = self.eventListenList_[eventName] or {}for _, eventHandle in pairs(eventTable) doif eventHandle.target == target theneventHandle.handler = handlerreturnendendtable.insert(eventTable, { target = target, handler = handler })self.eventListenList_[eventName] = eventTable
endfunction EventManager:pushEvent(eventName, ...)if self.eventListenList_ thenlocal eventsTabel = self.eventListenList_[eventName]if eventsTabel thenlocal args = { ... }for index, hanlderItem in pairs(eventsTabel) doif hanlderItem.target and hanlderItem.handler thenxpcall(function() hanlderItem.handler(hanlderItem.target, eventName,unpack(args))end,function(err)printError(err)end)endendendend
endfunction EventManager:removeEventByName(eventName)self.eventListenList_[eventName] = {}
endfunction EventManager:removeEventByTarget(target)if target thenfor name, eventTable in pairs(self.eventListenList_) dofor index, handler in pairs(eventTable) doif handler.target == target theneventTable[index] = nil--清理没有监听的事件@libinif not next(eventTable) thenself.eventListenList_[name] = nilbreakendendendendend
end---@param target table
---@param eventName string
function EventManager:removeEvent(target, eventName)local eventslist = self.eventListenList_[eventName]if eventslist thenfor index, eventTable in pairs(eventslist) doif eventTable.target == target theneventslist[index] = nilbreakendendend
endfunction EventManager:dump()--debugLuaObj(self.eventListenList_,"ddd",true)for eventName, tbl in pairs(self.eventListenList_) dolocal eventsTabel = self.eventListenList_[eventName]if eventsTabel and not table_is_empty(eventsTabel) thenprint("eventName: [" .. eventName .. "]")for index, hanlderItem in pairs(eventsTabel) doif hanlderItem.target and hanlderItem.target.name thenprint(hanlderItem.target.name)elselocal obj = hanlderItem.targetlocal t = type(obj)local mtif t == "table" thenmt = getmetatable(obj)elseif t == "userdata" then-- mt = tolua.getpeer(obj)endif mt thenprint(mt.__cname)else--print("mt == null")local key = table.keyof(_G, obj)if key thenprint(key)elsedump(obj, "", 3)endendend--if hanlderItem.handler then--	print("hanlderItem.handler")--	print(hanlderItem.handler)--endprint("_______________________________________")endendendendfunction EventManager:destory(...)self.eventListenList_ = {}_G["EventManager"] = nil
endEventManager:init()return EventManager

红点绑定关系处理类

RedDotBinder = class("RedDotBinder")
---@class RedDotBinder
local RedDotBinder = RedDotBinder
function RedDotBinder:ctor(targetGo, redDotModel)---@type GameObjectself.targetGo = targetGo--self.targetImage = self.targetGo:GetComponent(typeof(Image))self:bind(redDotModel)
end---绑定红点数量变化事件
---@param redModel RedDotModel
function RedDotBinder:bind(redModel)self:unBind()---@type RedDotModelself.redDotModel = redModelself.redDotModel:addCallback(self.targetGo,  function()self:onRedNumChange()end)self:onRedNumChange() --初始化显示刷新
endfunction RedDotBinder:unBind()if self.redDotModel thenself.redDotModel:removeCallback(self.targetGo)end
end---红点数量变化时候需要处理的内容
function RedDotBinder:onRedNumChange()self:refreshRedShow()
end---刷新红点显示
function RedDotBinder:refreshRedShow()local redNum = self.redDotModel:getNum()local isShow = redNum > 0self.targetGo:SetActive(isShow)if isShow then  --刷新红点显示的图片--如果是父节点类型红点,需要获取所有显示的叶子节点,根据优先级进行排序,筛选出需要显示的红点类型self:collectEndChild(self.redDotModel, true)table.sort(self.collectList, function (a, b)if a.config.redType < b.config.redType thenreturn a.id < b.idelsereturn a.config.redType < b.config.redTypeendend)---根据优先级最高的红点类型,刷新红点image需要显示的图片local redShowType = self.collectList[1].config.redTypelocal spriteIdif redShowType == RedDotShowType.Reward thenspriteId = 10001elseif redShowType == RedDotShowType.New thenspriteId = 10002elsespriteId = 10001endprint("显示红点图片:"..spriteId)-- self.targetImage.sprite = ResourceManage.getSpriteById(spriteId)end
end---获取红点显示类型
---@return RedDotShowType
function RedDotBinder:getRedShowType()local redType = RedDotShowType.Normalif next(self.redDotModel.childs) then --存在子红点local visibleRedList = {}else --不存在子红点redType = self.redDotModel.config.redTypeendreturn redType
end---获取所有红点num大于0的叶子节点对象
---@param redModel RedDotModel
---@param isRoot boolean
function RedDotBinder:collectEndChild(redModel, isRoot)if isRoot thenself.collectList = {}endif next(redModel.childs) then --存在子节点for i,v in ipairs(redModel.childs) doself:collectEndChild(v)endelseif redModel:getNum() > 0 thentable.insert(self.collectList, redModel)endend
endfunction RedDotBinder:onDestroy()end

具体实现逻辑的红点类

ChallengeNewChapterRedDotModel = class("ChallengeNewChapterRedDotModel", RedDotModel)
---@class ChallengeNewChapterRedDotModel:RedDotModel
local ChallengeNewChapterRedDotModel = ChallengeNewChapterRedDotModel-- function ChallengeNewChapterRedDotModel:ctor(id, cfg)
--     RedDotModel.ctor(self, id, cfg)
-- endfunction ChallengeNewChapterRedDotModel:onInit()EventManager:addEvent(eventTypes.ChallengeChapterUnlock,self, self.check)--添加监听事件,处理红点刷新self.isHaveNewChapter = trueself:check()endfunction ChallengeNewChapterRedDotModel:check()---判断是否有没有查看过的新章节local num = self.isHaveNewChapter and 1 or 0self:setNum(num)self.isHaveNewChapter = not self.isHaveNewChapter
endfunction ChallengeNewChapterRedDotModel:onDestroy()--移除监听事件EventManager:removeEventByTarget(self)
endreturn ChallengeNewChapterRedDotModel
ChallengeRewardRedDotModel = class("ChallengeRewardRedDotModel", RedDotModel)
---@class ChallengeRewardRedDotModel:RedDotModel
local ChallengeRewardRedDotModel = ChallengeRewardRedDotModelfunction ChallengeRewardRedDotModel:onInit()EventManager:addEvent(eventTypes.ChallengeChapterFinish, self, self.check)self.isHaveRewards = true--添加监听事件,处理红点刷新self:check()endfunction ChallengeRewardRedDotModel:check()---判断是否有没有需要领取的章节奖励local num = self.isHaveRewards and 1 or 0self:setNum(num)self.isHaveRewards = not self.isHaveRewards
endfunction ChallengeRewardRedDotModel:onDestroy()--移除监听事件EventManager:removeEventByTarget(self)
endreturn ChallengeRewardRedDotModel

红点显示状态测试

创建红点对象

function testRedModle(...)local gob = UnityEngine.GameObject.New()gob.name = "1级界面";gob.transform.position = UnityEngine.Vector3.New(1,1,1)local redModel = RedDotManager:getRedModelById(1)RedDotManager:bind(gob, redModel)local gob2 = UnityEngine.GameObject.New()gob.transform.position = UnityEngine.Vector3.New(11,1,1)gob2.name = "2级界面";local redModel2 = RedDotManager:getRedModelById(2)RedDotManager:bind(gob2, redModel2)local gob3 = UnityEngine.GameObject.New()gob3.name = "3级界面";gob.transform.position = UnityEngine.Vector3.New(31,1,1)local redModel3 = RedDotManager:getRedModelById(3)RedDotManager:bind(gob3, redModel3)local gob4 = UnityEngine.GameObject.New()gob4.name = "4级界面";gob.transform.position = UnityEngine.Vector3.New(41,1,1)local redModel4 = RedDotManager:getRedModelById(4)RedDotManager:bind(gob4, redModel4)
end

模拟状态变化时候,发送事件刷新显示

  EventManager:pushEvent(eventTypes.ChallengeChapterFinish)
 EventManager:pushEvent(eventTypes.ChallengeChapterUnlock)
http://www.dtcms.com/wzjs/519346.html

相关文章:

  • wordpress循环调用最新文章seo教程百度网盘
  • 郑州哪里做网站最好营销方式和渠道有哪些
  • 济南网站建站推广杭州排名优化软件
  • 现在主流的web框架北京seo优化外包
  • 站外推广网站平台优化是什么意思
  • 北仑做网站唐老鸭微信营销软件
  • 浙江网站建设推广公司找哪家链接搜索
  • 昆山市建设工程交易中心网站企业培训网
  • 四川网站建设咨询怎么制作网站链接
  • 门户网站建设教程google推广技巧
  • 造纸公司网站建设站长工具app
  • 杭州做公司网站的公司武汉网站制作
  • 做网站的说3年3年包括什么软件巨量算数数据分析入口
  • 北京小程序开发价格上饶seo博客
  • 加强酒店网站建设的建议安徽网站推广优化
  • 做旅游网站教程seo查询系统源码
  • 抖音小程序商城常德网站优化公司
  • 如何用kali做网站渗透网站关键词怎么快速上排名
  • 昆山市做网站的公司关键词排名优化教程
  • 专业建站公司费用百度怎样发布信息
  • 中山专业门户网站制作策划网盟推广平台
  • 哪儿能做邯郸网站建设舆情监测系统排名
  • 网站建设的整体框架关键词排名怎么快速上去
  • 做360网站中保存的图片存在哪里的免费网站建站2773
  • 网站改版 影响google 404跳首页2019年度最火关键词
  • 商城网站开发那家好电工培训技术学校
  • 广州网站优化平台seo标题优化导师咨询
  • 桂林网站建设找骏程河北网站推广
  • 彩票网站是怎么做的广州网络推广服务商
  • 微信公众平台制作网站企业网站开发费用