|
|
-
- --需要处理例子特效的ui对象 需要继承该类 比如baseview baseitem
- UIPartical = UIPartical or BaseClass(UIZDepth)
- local UIPartical = UIPartical
- local UIDepth = UIDepth
- local rawget = rawget
- local IsNull = IsNull
- --每个layer的起始值
- UIPartical.Start_SortingOrder_list = {
- ["Scene"] = 0,
- ["Main"] = 200,
- ["UI"] = 400,
- ["Activity"] = 600,
- ["Top"] = 800,
- ["UpTop"] = 1000,
- }
-
- --每个layer的当前层数
- UIPartical.curr_SortingOrder_list = {
- ["Scene"] = UIPartical.Start_SortingOrder_list.Scene,
- ["Main"] = UIPartical.Start_SortingOrder_list.Main,
- ["UI"] = UIPartical.Start_SortingOrder_list.UI,
- ["Activity"] = UIPartical.Start_SortingOrder_list.Activity,
- ["Top"] = UIPartical.Start_SortingOrder_list.Top,
- ["UpTop"] = UIPartical.Start_SortingOrder_list.UpTop,
- }
-
- --设置渲染特效所在的layer层
- UIPartical.RenderingOther_List = {
- DEFAULT = 0,
- UI = 5,
- UIForward = 8,
- Role = 9,
- Blackground = 10,
- UIBackward = 14,
- UIBackRole = 15,
- Reflection = 29,
- Ground = 30,
- UI3D = 16,
- }
-
- function UIPartical:__init()
- self.layer_name = "Main"
- self.depth_counter = 0
-
- self.partical_list = {}
- self.callback_list = {}
- self.lastTime_list = {}
- self.cache_partical_map = {}
- self.show_partical_map = {}
- self.wait_load_effect_trans = {}
- self.speed = 1
- self.effect_cd_list = {}--特效冷却时间列表
- self.effect_timer_list = {}--特效时间定时器列表
- end
-
- function UIPartical:__delete()
- self:ClearAllEffect()
- self:ClearCacheEffect()
- end
-
- function UIPartical:ClearCacheEffect()
- for abname,state in pairs(self.cache_partical_map) do
- lua_resM:ClearObjPool(abname)
- end
- self.cache_partical_map = {}
- self.wait_load_effect_trans = {}
- self.show_partical_map = {}
- end
-
- function UIPartical:DeleteCurrLayerDepth(layer_name,count)
- if UIPartical.curr_SortingOrder_list[layer_name] then
- UIPartical.curr_SortingOrder_list[layer_name] = UIPartical.curr_SortingOrder_list[layer_name] - count
- end
-
- if UIPartical.Start_SortingOrder_list[layer_name] then
- if self:GetCurrLayerDepth(layer_name) < UIPartical.Start_SortingOrder_list[layer_name] then
- UIPartical.curr_SortingOrder_list[layer_name] = UIPartical.Start_SortingOrder_list[layer_name]
- end
- end
- end
-
- function UIPartical:AddCurrLayerDepth(layer_name,count)
- if UIPartical.curr_SortingOrder_list[layer_name] then
- UIPartical.curr_SortingOrder_list[layer_name] = UIPartical.curr_SortingOrder_list[layer_name] + (count or 1)
- end
- end
-
- function UIPartical:GetCurrLayerDepth(layer_name)
- return UIPartical.curr_SortingOrder_list[layer_name]
- end
-
- --打开界面的时候 设置UI SortingOrder深度
- function UIPartical:SetUIDepth(gameObject)
- if self.layer_name and self.layer_name ~= "Main" then
- if UIPartical.GetCurrLayerDepth(self, self.layer_name) < UIPartical.Start_SortingOrder_list[self.layer_name] then
- UIPartical.curr_SortingOrder_list[self.layer_name] = UIPartical.Start_SortingOrder_list[self.layer_name]
- end
-
- self.depth_counter = self.depth_counter + 1
- UIPartical.AddCurrLayerDepth(self, self.layer_name)
- gameObject.layer = LayerMask.NameToLayer("UI")
- UIDepth.SetUIDepth(gameObject,true,self:GetCurrLayerDepth(self.layer_name))
- end
- end
-
- function UIPartical:SetGameObjectDepth(gameObject)
- if gameObject == nil then return end
-
- if self.layer_name and self.layer_name ~= "Main" then
- self.depth_counter = self.depth_counter + 1
- UIPartical.AddCurrLayerDepth(self, self.layer_name)
- UIDepth.SetUIDepth(gameObject,true,self:GetCurrLayerDepth(self.layer_name))
- gameObject.layer = LayerMask.NameToLayer("UI")
- end
- end
-
- function UIPartical:SetGameObjectDepthByLayerName(gameObject, layer_name)
- if gameObject == nil then return end
- layer_name = layer_name or "UI"
- self.depth_counter = self.depth_counter + 1
- UIPartical.AddCurrLayerDepth(self, layer_name)
- UIDepth.SetUIDepth(gameObject,true,self:GetCurrLayerDepth(layer_name))
- gameObject.layer = LayerMask.NameToLayer("UI")
- end
-
- --关闭界面的时候重置UI深度
- function UIPartical:ResetUIDepth(count)
- if rawget(self, "layer_name") and (self.layer_name ~= "Main" or self.need_to_reset_layer) then
- if count then
- if count > 0 then
- UIPartical.DeleteCurrLayerDepth(self, self.layer_name,count )
- self.depth_counter = self.depth_counter - count
- end
- else
- if self.depth_counter > 0 then
- UIPartical.DeleteCurrLayerDepth(self, self.layer_name,self.depth_counter )
- self.depth_counter = 0
- end
- end
- end
- end
-
- --这里分为UI层跟其它层,UI层的粒子层级加1,而其他层级,例如主界面,则固定为1
- function UIPartical:SetParticleDepth(gameObject, forceAdd)
- if self.layer_name then
- if self.layer_name == "Main" and not forceAdd then
- local depth = UIPartical.Start_SortingOrder_list[self.layer_name] + 1
- if depth ~= nil then
- UIDepth.SetUIDepth(gameObject,false,depth)
- end
- else
- self.depth_counter = self.depth_counter + 1
- UIPartical.AddCurrLayerDepth(self, self.layer_name)
- UIDepth.SetUIDepth(gameObject,false,self:GetCurrLayerDepth(self.layer_name))
- end
- end
- end
-
- --添加屏幕特效
- function UIPartical:AddScreenEffect(resname, pos, scale, is_loop ,last_time)
- local parent_go = UiFactory.createChild(panelMgr:GetParent(self.layer_name), UIType.EmptyObject, resname)
- local function call_back_func()
- destroy(parent_go)
- end
- self:AddUIEffect(resname, parent_go.transform, self.layer_name, pos, scale, is_loop ,last_time, nil, call_back_func)
- end
-
- --[[
- 功能:添加到UI上的特效 如果是baseview里面设置特效 需要在opencallback方法里设置才行 baseitem需要再baseview调用opencallback的时候重新设置
- uiTranform 只能挂接一个特效
- 其他. lastTime为-1时播放结束不主动销毁
- save_by_batch: 合并批处理,这个和useMask是互斥关系,如两个特效的resname相同时,不能一个用useMask另一个用save_by_batch。因为共享材质只有一个。
- ]]
- function UIPartical:AddUIEffectConfig(config)
- config = config or {}
- local resname = config.resname
- local pos = config.pos
- local scale = config.scale or 1
- local is_loop = config.is_loop
- local last_time = config.last_time
- local useMask = config.useMask
- local call_back_func = config.call_back_func
- local load_finish_func = config.load_finish_func
- local speed = config.speed
- local layer = config.layer
- local not_delete_old_ps = config.not_delete_old_ps
- local save_by_batch = config.save_by_batch
- local need_cache = config.need_cache
- local uiTranform = config.uiTranform
- local layer_name = config.layer_name
- local use_ex_depth = config.use_ex_depth --修改深度时候处理隐藏节点,根据特效决定是否使用
-
- self:AddUIEffect(resname, uiTranform, layer_name, pos, scale, is_loop ,last_time, useMask, call_back_func,load_finish_func, speed, layer, not_delete_old_ps, save_by_batch, need_cache, use_ex_depth)
- end
-
-
- function UIPartical:AddUIEffect(resname, uiTranform, layer_name, pos, scale, is_loop ,last_time, useMask, call_back_func,load_finish_func, speed, layer, not_delete_old_ps, save_by_batch, need_cache, use_ex_depth)
- if uiTranform then
- local instance_id = uiTranform:GetInstanceID()
- if self.wait_load_effect_trans[instance_id] then
- return
- end
- self.layer_name = layer_name or self.layer_name
- pos = pos or Vector3.zero
- scale = scale
- if is_loop == nil then
- is_loop = true
- end
-
- if need_cache == nil then
- need_cache = true
- end
-
- local function load_call_back(objs, is_gameObject)
- self.wait_load_effect_trans[instance_id] = false
- if self.transform then --没有删除根变换
- if self._use_delete_method then
- return
- end
- if IsNull(uiTranform) then return end
-
- --如果没特效,则返回
- if not objs or not objs[0] then
- return
- end
-
- local curr_effect_sortingOrder = nil
- if self.layer_name and self.layer_name ~= "Main" then
- self.depth_counter = self.depth_counter + 1
- self:AddCurrLayerDepth(self.layer_name)
- curr_effect_sortingOrder = self:GetCurrLayerDepth(self.layer_name)
- end
-
- local go = is_gameObject and objs[0] or newObject(objs[0])
-
- local shader_mask = UIParticleMaskShader.Res[resname]
- if shader_mask then
- local objs = go:GetComponentsInChildren(typeof(UnityEngine.Renderer))
- for i=1,objs.Length do
- local mats = objs[i-1].sharedMaterials
- for i=0, mats.Length - 1 do
- if mats[i] then
- local shader_config = UIParticleMaskShader.Shader[mats[i].shader.name]
- if shader_config then
- mats[i].shader = ShaderTools.GetShader(shader_config)
- end
- end
- end
- end
- end
-
- self.partical_list[go] = true
-
- local gameobject_id = go:GetInstanceID()
- self.show_partical_map[gameobject_id] = resname
-
- local transform = go.transform
- transform:SetParent(uiTranform)
- transform.localPosition = pos
- SetLocalRotation(transform)
-
- if type(scale) == "number" then
- if scale ~= -1 then
- -- if not is_gameObject or (Scene and Scene.Instance:IsPreLoadPoolEffect(resname)) then
- -- 备注Hierarchy = 0,Local = 1,Shape = 2
- -- local particleSystems = go:GetComponentsInChildren(typeof(UnityEngine.ParticleSystem))
- -- if particleSystems and scale ~= 1 then
- -- for i = 0, particleSystems.Length - 1 do
- -- particleSystems[i].main.scalingMode = UnityEngine.ParticleSystemScalingMode.IntToEnum(1)
- -- end
- -- end
-
- -- cs_particleM:SetScale(go,scale)
- -- end
- transform.localScale = Vector3.one * scale * 100
- end
- elseif type(scale) == "table" then
- local particleSystems = go:GetComponentsInChildren(typeof(UnityEngine.ParticleSystem))
- if scale.z == nil then scale.z = 1 end
- for i = 0, particleSystems.Length - 1 do
- local ps = particleSystems[i]
- ps.main.scalingMode = UnityEngine.ParticleSystemScalingMode.IntToEnum(1)
- ps.transform.localScale = Vector3(scale.x, scale.y, scale.z)
- end
- transform.localScale = Vector3(scale.x, scale.y, scale.z) * 100
- else
- transform.localScale = Vector3(72,72,72)
- end
-
- PrintParticleInfo(go)
-
- self:SetSpeed(go, speed)
- go:SetActive(false)
- go:SetActive(true)
- self:SetUILayer(uiTranform, layer)
-
- if useMask then
- self:SetEffectMask(go)
- else
- if curr_effect_sortingOrder then
- if use_ex_depth then
- self:SetUIDepthEx(go, false, curr_effect_sortingOrder)
- else
- UIDepth.SetUIDepth(go, false, curr_effect_sortingOrder)
- end
- else
- self:SetParticleDepth(go, maskID)
- end
- if save_by_batch then
- --需要动态批处理,设置共享材质
- local renders = go:GetComponentsInChildren(typeof(UnityEngine.Renderer))
- for i = 0, renders.Length - 1 do
- local mats = renders[i].sharedMaterials
- for j = 0, mats.Length - 1 do
- mats[j]:SetFloat("_Stencil", 0)
- end
- end
- local curTrans = go.transform.parent
- local maskImage
- while(curTrans and curTrans.name ~= "Canvas") do
- maskImage = curTrans:GetComponent("Mask")
- if maskImage then
- break
- else
- curTrans = curTrans.parent
- end
- end
- if maskImage then
- local canvas = curTrans:GetComponent("Canvas")
- if canvas then
- UIDepth.SetUIDepth(go,false,canvas.sortingOrder + 1)
- end
- end
- else
- --由于使用遮罩的材质调用了共享材质,这里对不使用遮罩的特效使用实例化材质
- local renders = go:GetComponentsInChildren(typeof(UnityEngine.Renderer))
- for i = 0, renders.Length - 1 do
- local mats = renders[i].materials
- for j = 0, mats.Length - 1 do
- mats[j]:SetFloat("_Stencil", 0)
- end
- end
- end
- end
-
- self.callback_list[go] = call_back_func
- if last_time and last_time > 0 and not self.lastTime_list[go] then
- local function onDelayFunc()
- self.show_partical_map[gameobject_id] = nil
- self:PlayEnd(go,need_cache,resname)
- if not need_cache and not self._use_delete_method then
- lua_resM:reduceRefCount(self, resname)
- end
- end
- self.lastTime_list[go] = GlobalTimerQuest:AddDelayQuest(onDelayFunc,last_time)
- end
- if is_loop then
- cs_particleM:SetLoop(go,is_loop)
- elseif last_time ~= -1 and not self.lastTime_list[go] then
- local function playEndCallback(go)
- self.show_partical_map[gameobject_id] = nil
- self:PlayEnd(go,need_cache,resname)
- if not need_cache and not self._use_delete_method then
- lua_resM:reduceRefCount(self, resname)
- end
- end
- ParticleManager:getInstance():AddUIPartical(go,playEndCallback)
- end
-
- if load_finish_func then
- load_finish_func(go)
- end
-
- ClearTrailRenderer(go)
- end
- end
-
- if not not_delete_old_ps then
- self:ClearUIEffect(uiTranform)
- end
-
- self.wait_load_effect_trans[instance_id] = true
- lua_resM:loadPrefab(self,resname,resname, load_call_back,false,ASSETS_LEVEL.HIGHT)
- end
- end
-
- function UIPartical:SetUIDepthEx( go, isUI, order )
- if isUI then
- local canvas = go:GetComponent(typeof(UnityEngine.Canvas))
- if (canvas == nil) then
- canvas = go:AddComponent(typeof(UnityEngine.Canvas))
- end
- canvas.overrideSorting = true
- canvas.sortingOrder = order
- else
- local renders = go:GetComponentsInChildren(typeof(UnityEngine.Renderer), true)
- if renders then
- for i=0,renders.Length-1 do
- renders[i].sortingOrder = order
- end
- end
- end
- end
-
- -- {resname,--资源名
- -- uiTranform, --
- -- layer_name,
- -- pos, scale,
- -- is_loop
- -- ,last_time, --持续时间
- -- useMask, --遮罩
- -- call_back_func,
- -- load_finish_func,
- -- speed, --速度
- -- layer, --
- -- not_delete_old_ps--不删除旧特效
- --}
- --id唯一 判断是否是同一个类型(类型不一定是特效不相等)比如"SceneSpecialTipView_ui_effcet_rolelvup"
- function UIPartical:AddUIEffectByTime(data, time_cd, id)
- if not data or not data.resname then
- print("huangcong:UIPartical [269]特效资源名为空: ")
- return
- end
-
- time_cd = time_cd or 1
- id = id or data.resname
-
- if not self.effect_cd_list[id] then
- self.effect_cd_list[id] = {id = id, can_effect = false}
- elseif self.effect_cd_list[id] and self.effect_cd_list[id].can_effect then
- self.effect_cd_list[id].can_effect = false
- else
- print("huangcong:UIPartical [289]特效还在冷却!: ",data.id)
- return
- end
-
- self.effect_timer_list[id] = GlobalTimerQuest:AddDelayQuest(function()
- self.effect_cd_list[id].can_effect = true
- self.effect_timer_list[id] = nil
- end, time_cd)
-
- self:AddUIEffect(
- data.resname,
- data.uiTranform,
- data.layer_name,
- data.pos,
- data.scale,
- data.is_loop,
- data.last_time,
- data.useMask,
- data.call_back_func,
- data.load_finish_func,
- data.speed,
- data.layer,
- data.not_delete_old_ps)
- end
-
- function UIPartical:SetSpeed(go, speed)
- self.speed = speed or self.speed
- if self.partical_list[go] and self.speed then
- cs_particleM:SetSpeed(go,self.speed)
- end
- end
-
- --清除挂接在父容器的所有对象, 判断进入对象缓存池
- function UIPartical:ClearUIEffect(uiTranform)
- if not IsNull(uiTranform) then
- for i = 0,uiTranform.childCount - 1 do
- local go = uiTranform:GetChild(0).gameObject
- local cache_res = self.show_partical_map[go:GetInstanceID()]
- if cache_res then
- self:PlayEnd(go,cache_res,cache_res)
- end
- end
- else
- PrintCallStack()
- end
- end
-
- --删除所有特效
- function UIPartical:ClearAllEffect()
- UIPartical.ResetUIDepth(self)
- for go,callback in pairs(self.callback_list) do
- callback()
- self.partical_list[go] = nil
- end
-
- for go,last_time_id in pairs(self.lastTime_list) do
- TimerQuest.CancelQuest(GlobalTimerQuest, last_time_id)
- self.lastTime_list[go] = nil
- end
- for go,_ in pairs(self.partical_list) do
- ParticleManager.RemoveUIPartical(ParticleManager:getInstance(), go)
-
- local gomeobject_id = go:GetInstanceID()
- local cache_res = self.show_partical_map[gomeobject_id]
- if cache_res then
- self.show_partical_map[gomeobject_id] = nil
- if not IsNull(go) then
- go:SetActive(false)
- lua_resM:AddObjToPool(self, cache_res, cache_res, go)
- self.cache_partical_map[cache_res] = true
- end
- else
- destroy(go,true)
- end
- self.partical_list[go] = nil
- end
- end
-
-
- --单个特效播放结束
- function UIPartical:PlayEnd(go,need_cache,resname)
- if go and not IsNull(go) then
- local callback = self.callback_list[go]
- if callback and not self._use_delete_method then
- callback()
- end
- self.callback_list[go] = nil
-
- local last_time_id = self.lastTime_list[go]
- if last_time_id then
- TimerQuest.CancelQuest(GlobalTimerQuest, last_time_id)
- end
- self.lastTime_list[go] = nil
-
- ParticleManager.RemoveUIPartical(ParticleManager:getInstance(), go)
-
- self.partical_list[go] = nil
-
- if need_cache and resname then
- self.cache_partical_map[resname] = true
- go:SetActive(false)
- lua_resM:AddObjToPool(self, resname, resname, go)
- else
- destroy(go,true)
- end
-
- if self.layer_name ~= "Main" and self.depth_counter > 0 then
- self.depth_counter = self.depth_counter - 1
- UIPartical.DeleteCurrLayerDepth(self, self.layer_name, 1)
- end
- end
- end
-
- function UIPartical:SetUILayer(obj, layer)
- layer = layer or UIPartical.RenderingOther_List.UIForward
- if IsNull(obj) then
- return
- end
- for i = 0,obj.childCount - 1 do
- obj:GetChild(i).gameObject.layer = layer
- self:SetUILayer(obj:GetChild(i), layer)
- end
- end
-
- function UIPartical:SetForwardUILayer(obj, layer)
- layer = layer or UIPartical.RenderingOther_List.UIForward
- if IsNull(obj) then
- return
- end
- for i = 0,obj.childCount - 1 do
- obj:GetChild(i).gameObject.layer = layer
- self:SetUILayer(obj:GetChild(i), layer)
- end
- end
-
-
- function UIPartical:SetRTUILayer(obj, layer)
- layer = layer or UIPartical.RenderingOther_List.UI3D
- if IsNull(obj) then
- return
- end
- for i = 0,obj.childCount - 1 do
- obj:GetChild(i).gameObject.layer = layer
- self:SetUILayer(obj:GetChild(i), layer)
- end
- end
-
-
- function UIPartical:SetUIBackwardLayer(obj, layer)
- layer = layer or UIPartical.RenderingOther_List.UIBackward
- if IsNull(obj) then
- return
- end
- for i = 0,obj.childCount - 1 do
- obj:GetChild(i).gameObject.layer = layer
- self:SetUILayer(obj:GetChild(i), layer)
- end
- end
-
- function UIPartical:SetUIbackRoleLayer(obj, layer)
- layer = layer or UIPartical.RenderingOther_List.UIBackRole
- if IsNull(obj) then
- return
- end
- for i = 0,obj.childCount - 1 do
- obj:GetChild(i).gameObject.layer = layer
- self:SetUILayer(obj:GetChild(i), layer)
- end
- end
-
- function UIPartical:SetEffectMask(obj)
- local renders = obj:GetComponentsInChildren(typeof(UnityEngine.Renderer))
- for i = 0, renders.Length - 1 do
- --使用Renderer.material获取Material引用时,会把Render里Materials列表第一个预设的Material进行实例,这样每个object都有各自的材质对象,无法实现批处理draw call
- local mats = renders[i].sharedMaterials
- for j = 0, mats.Length - 1 do
- if mats[j] then
- mats[j]:SetFloat("_Stencil", 1)
- end
- end
- end
- local curTrans = obj.transform.parent
- local maskImage
- while(curTrans and curTrans.name ~= "Canvas") do
- maskImage = curTrans:GetComponent("Mask")
- if maskImage then
- break
- else
- curTrans = curTrans.parent
- end
- end
- if maskImage then
- local canvas = curTrans:GetComponent("Canvas")
- if canvas then
- UIDepth.SetUIDepth(obj,false,canvas.sortingOrder + 1)
- end
- end
- end
-
- function UIPartical:RegisterMask(maskImage)
- self:ApplyMaskID(maskImage, 1)
- self.need_to_reset_layer = true
- return 1
- end
-
- function UIPartical:ApplyMaskID(maskImage, maskID)
- local function callback(objs)
- if objs and objs[0] and not IsNull(maskImage) then
- maskImage.material = Material.New(objs[0])
- maskImage.material:SetFloat("_StencilID", maskID)
- end
- end
-
- resMgr:LoadMaterial("scene_material", "mat_mask_image" , callback, ASSETS_LEVEL.HIGHT)
-
- maskImage.gameObject.layer = UIPartical.RenderingOther_List.UI
- self:SetUILayer(maskImage.transform)
- self.depth_counter = self.depth_counter + 1
- self:AddCurrLayerDepth(self.layer_name)
-
- local oldMask = maskImage:GetComponent("Mask")
- local showMaskGraphic = oldMask.showMaskGraphic
- UnityEngine.Object.DestroyImmediate(oldMask)
-
- local newMask = maskImage.gameObject:AddComponent(typeof(EffectMask))
- newMask.showMaskGraphic = showMaskGraphic
- UIDepth.SetUIDepth(maskImage.gameObject,true,self:GetCurrLayerDepth(self.layer_name))
-
- if self.stencilGo then
- return
- end
-
- self.stencilGo = UiFactory.createChild(maskImage.transform.parent,UIType.ImageExtend,"StencilImage")
- self.stencilGo:SetActive(true)
-
- local stencilTrans,img,rect = self.stencilGo.transform, self.stencilGo:GetComponent("Image"),maskImage.transform.rect
- stencilTrans.localPosition = Vector2(rect.center.x, rect.center.y, 0)
- stencilTrans:SetSiblingIndex(maskImage.transform:GetSiblingIndex() + 1)
-
- local sizeDelta = maskImage.transform.sizeDelta
- stencilTrans.sizeDelta = Vector2(rect.width, rect.height)
-
- img.alpha = 0
- img.raycastTarget = false
- img.material:SetFloat("_Stencil", 1)
- img.material:SetFloat("_StencilOp", 1)
- img.material:SetFloat("_StencilComp",8)
-
- local canvas = self.stencilGo:AddComponent(typeof(UnityEngine.Canvas))
- canvas.overrideSorting = true
-
- self:AddCurrLayerDepth(self.layer_name)
- self:AddCurrLayerDepth(self.layer_name)
-
- self.depth_counter = self.depth_counter + 2
- canvas.sortingOrder = self:GetCurrLayerDepth(self.layer_name)
- end
-
- function UIPartical:UnRegisterMask(maskID)
- end
-
- function UIPartical:AddUIComponent( ui_component )
- if not ui_component then return end
- ui_component = ui_component.New()--不想在外部.New,因为ui_component不需要在外部DeleteMe的,这样就破坏了New和DeleteMe成对出现的规范了
- ui_component:Init(self)
- if self.is_loaded then
- ui_component:OnLoad()
- end
- self.ui_components = self.ui_components or {}
- table.insert(self.ui_components, ui_component)
- return ui_component
- end
-
- function UIPartical:RemoveUIComponent( ui_component )
- if not ui_component then return end
-
- for k,v in pairs(self.ui_components or {}) do
- if v == ui_component then
- ui_component:OnDestroy()
- table.remove(self.ui_components, k)
- break
- end
- end
- end
-
- function UIPartical:BeforeLoad( )
- if self.ui_components then
- for i,v in ipairs(self.ui_components) do
- if v.OnLoad then
- v:OnLoad()
- end
- end
- end
- end
-
- function UIPartical:AfterDestroy( )
- if self.ui_components then
- for i,v in ipairs(self.ui_components) do
- if v.OnDestroy then
- v:OnDestroy()
- v:DeleteMe()
- end
- end
- self.ui_components = nil
- end
- end
|