local UIEntityHurtNumber3DPanel = UIViewClass() local ShakeType = 0 local TagCritical = "C" local TagDefense = "B" local TagLifeSteal = "H" local TagDamageReturn = "T" local MinusStr = "-" local PlusStr = "+" local ThreeParamStr = "%s%s%s" local TwoParamStr = "%s%s" local HurtNumberColor = { AttEnemy = {r = 1, g = 1, b = 1}, CritAttEnemy = {r = 249/255, g = 203/255, b = 94/255}, BeAtt = {r = 219/255, g = 70/255, b = 65/255}, Reply = {r = 121/255, g = 210/255, b = 99/255}, } local HurtNumCurveCollection_PVE = { AttEnemy = 10001, CritAttEnemy = 10002, BeAtt = 10003, OwnBuff = 10004 } local HurtNumCurveCollection_PVP = { AttEnemy = 20001, CritAttEnemy = 20002, BeAtt = 20003, OwnBuff = 20004, } function UIEntityHurtNumber3DPanel:OnCreated() -- 用于保存Data数据方便在Updata中使用,这里的顺序不重要 Key为RenderEntity,value为Dic,里面Key是element, value为elementData self.elementDic = {} self.elementPool = {} -- 用作简单池子 end function UIEntityHurtNumber3DPanel:OnOpened(context) self:RegistSystemEvent(EventID.UIBattle_HurtNumber3D_Create, self.CreateHurtNumber3DElement) -- 创建伤害字UI self:RegistSystemEvent(EventID.UIBattle_ExpEntity_UIDispose, self.ElementDispose) -- 移除伤害字UI(按照entity) self:RegistSystemEvent(EventID.UIBattle_HurtNumber3D_DisposeByElementTf, self.ElementDisposeByElementTf)-- 移除伤害字UI(移除单个tf) self:RegistSystemEvent(EventID.UIBattle_HurtNumber3D_ClearAllHurtNumber, self.ClearAllHurtNumber) -- 移除伤害字UI self:RegistSystemEvent(EventID.Level_Start, self.ResetHurtNumberCollection) self:RegistSystemEvent(EventID.UI_ShowOrHideHurt, self.ShowOrHideHurt) self:RegistSystemEvent(EventID.UI_ActiveAllModelElement, self.ShowOrHideHurt) AuxUtil.InitHurtNumCurveCollection(self.hurtNumberCollection) self:ResetHurtNumberCollection() if GameAppInfo.IsVersionGreaterThan119000() then AuxUtil.InitHurtNumCurveStartRange(-0.2, 0.2, -0.1, 0.2) end end function UIEntityHurtNumber3DPanel:OnClosed() self:ClearAllHurtNumber() end function UIEntityHurtNumber3DPanel:CreateHurtNumber3DElement(renderEntity, num, pcHurt, hurtType) local element = table.remove(self.elementPool) if not element then element = self:InstantiateCollection(self.HurtNumber3DModelList, self.template_ModelHurtNumber3D.gameObject) end local elementTf = element.gameObject.transform local elementData = { element = element, } if self.elementDic[renderEntity] == nil then self.elementDic[renderEntity] = {} end self.elementDic[renderEntity][elementTf] = element local number = math.abs(num) local increase = num > 0 self:SetStartPattern(elementData, number, hurtType, increase, pcHurt) UIUtils.SetActive(element.HurtNumber3D, true) self:ElementActive(element, true) renderEntity:CreateHurtNumber(elementTf, ShakeType, elementData.curveCollection) end function UIEntityHurtNumber3DPanel:ResetHurtNumberCollection() if BattleDataGetter.IsPVPLevel() then self.curHurtNumberCollection = HurtNumCurveCollection_PVP else self.curHurtNumberCollection = HurtNumCurveCollection_PVE end end function UIEntityHurtNumber3DPanel:ClearAllHurtNumber() for renderEntity, elementDataDic in pairs(self.elementDic) do for elementTf, element in pairs(elementDataDic) do self:ElementActive(element, false) table.insert(self.elementPool, element) elementDataDic[elementTf] = nil end self.elementDic[renderEntity] = nil end end function UIEntityHurtNumber3DPanel:ShowOrHideHurt(isShow) UIUtils.SetActive(self.gameObject, isShow) end ---------- Start 具体的子项Element操作 Start ---------- function UIEntityHurtNumber3DPanel:SetStartPattern(elementData, number, hurtType, increase, pcHurt) if hurtType == LuaConst.UIDamageType.Invincible or hurtType == LuaConst.UIDamageType.Absord or hurtType == LuaConst.UIDamageType.SuperArmor or hurtType == LuaConst.UIDamageType.Blind then if pcHurt then elementData.curveCollection = self.curHurtNumberCollection.OwnBuff else elementData.curveCollection = self.curHurtNumberCollection.AttEnemy end UIUtils.SetMeshTextOneColor(elementData.element.HurtNumber3D, 1, 1, 1) self:SetTextNumber(elementData, number, pcHurt, false, hurtType) else if pcHurt then if increase then UIUtils.SetMeshTextOneColor(elementData.element.HurtNumber3D, HurtNumberColor.Reply.r, HurtNumberColor.Reply.g, HurtNumberColor.Reply.b) self:SetTextNumber(elementData, number, pcHurt, false, hurtType) else UIUtils.SetMeshTextOneColor(elementData.element.HurtNumber3D, HurtNumberColor.BeAtt.r, HurtNumberColor.BeAtt.g, HurtNumberColor.BeAtt.b) self:SetTextNumber(elementData, number, pcHurt, true, hurtType) end elementData.curveCollection = self.curHurtNumberCollection.BeAtt else if increase then UIUtils.SetMeshTextOneColor(elementData.element.HurtNumber3D, HurtNumberColor.Reply.r, HurtNumberColor.Reply.g, HurtNumberColor.Reply.b) self:SetTextNumber(elementData, number, pcHurt, false, hurtType) elementData.curveCollection = self.curHurtNumberCollection.BeAtt else if hurtType == LuaConst.UIDamageType.Critical or hurtType == LuaConst.UIDamageType.CritAndParry then UIUtils.SetMeshTextOneColor(elementData.element.HurtNumber3D, HurtNumberColor.CritAttEnemy.r, HurtNumberColor.CritAttEnemy.g, HurtNumberColor.CritAttEnemy.b) self:SetTextNumber(elementData, number, pcHurt, true, hurtType) elementData.curveCollection = self.curHurtNumberCollection.CritAttEnemy else UIUtils.SetMeshTextOneColor(elementData.element.HurtNumber3D, HurtNumberColor.AttEnemy.r, HurtNumberColor.AttEnemy.g, HurtNumberColor.AttEnemy.b) self:SetTextNumber(elementData, number, pcHurt, true, hurtType) elementData.curveCollection = self.curHurtNumberCollection.AttEnemy end end end end end function UIEntityHurtNumber3DPanel:ElementActive(element, active) UIUtils.Set3DMeshActiveByLayer(element.ojb_mesh.gameObject, active) end function UIEntityHurtNumber3DPanel:ElementDispose(renderEntity) local elementDataDic = self.elementDic[renderEntity] if elementDataDic then for elementTf, element in pairs(elementDataDic) do self:ElementActive(element, false) table.insert(self.elementPool, element) elementDataDic[elementTf] = nil end if next(elementDataDic) == nil then self.elementDic[renderEntity] = nil end end end function UIEntityHurtNumber3DPanel:ElementDisposeByElementTf(renderEntity, elementTf) if not elementTf then return end local elementDataDic = self.elementDic[renderEntity] if elementDataDic then local element = elementDataDic[elementTf] self:ElementActive(element, false) table.insert(self.elementPool, element) elementDataDic[elementTf] = nil if next(elementDataDic) == nil then self.elementDic[renderEntity] = nil end end end function UIEntityHurtNumber3DPanel:SetTextNumber(elementData, number, isPlayerSelf, isDamage, hurtType) local content = "" -- 自己的伤害和治疗 if isPlayerSelf then content = self:SelfDamageOrReply(number, isDamage, hurtType) else -- 别人的伤害和治疗 content = self:EnemyDamageOrReply(number, isDamage, hurtType) end if hurtType == LuaConst.UIDamageType.Invincible then content = content .. "I" elseif hurtType == LuaConst.UIDamageType.SuperArmor then content = content .. "S" elseif hurtType == LuaConst.UIDamageType.Absord then content = content .. "A" elseif hurtType == LuaConst.UIDamageType.Blind then content = content .. "M" end UIUtils.SetMeshTextLabel(elementData.element.HurtNumber3D, content) end ------------ End 具体的子项Element操作 End ------------ ------------ Start 伤害治疗显示计算 Start ------------ -- 自身的伤害和治疗 function UIEntityHurtNumber3DPanel:SelfDamageOrReply(number, isDamage, hurtType) local content = "" if isDamage then if hurtType == LuaConst.UIDamageType.Critical then content = string.format(ThreeParamStr, TagCritical, MinusStr, number) elseif hurtType == LuaConst.UIDamageType.Parry or hurtType == LuaConst.UIDamageType.CritAndParry then content = string.format(ThreeParamStr, TagDefense, MinusStr, number) elseif hurtType == LuaConst.UIDamageType.DamageReturn then content = string.format(ThreeParamStr, TagDamageReturn, MinusStr, number) elseif hurtType == LuaConst.UIDamageType.Absord then if number ~= 0 then content = string.format(ThreeParamStr, TagDamageReturn, MinusStr, number) end elseif hurtType == LuaConst.UIDamageType.Invincible then -- do nothing else content = string.format(TwoParamStr, MinusStr, number) end else if number ~= 0 then if hurtType == LuaConst.UIDamageType.LifeSteal then content = string.format(ThreeParamStr, TagLifeSteal, PlusStr, number) else content = string.format(TwoParamStr, PlusStr, number) end end end return content end function UIEntityHurtNumber3DPanel:EnemyDamageOrReply(number, isDamage, hurtType) local content = "" if isDamage then if hurtType == LuaConst.UIDamageType.Critical or hurtType == LuaConst.UIDamageType.CritAndParry then content = string.format(TwoParamStr, TagCritical, number) elseif hurtType == LuaConst.UIDamageType.Parry then content = string.format(TwoParamStr, TagDefense, number) elseif hurtType == LuaConst.UIDamageType.DamageReturn then content = string.format(TwoParamStr, TagDamageReturn, number) elseif hurtType == LuaConst.UIDamageType.Absord then if number ~= 0 then content = number end elseif hurtType == LuaConst.UIDamageType.Invincible or hurtType == LuaConst.UIDamageType.SuperArmor then -- do nothing else content = number end else if number ~= 0 then if hurtType == LuaConst.UIDamageType.LifeSteal then content = string.format(ThreeParamStr, TagLifeSteal, PlusStr, number) elseif hurtType == LuaConst.UIDamageType.Absord then if number ~= 0 then content = string.format(TwoParamStr, PlusStr, number) end elseif hurtType == LuaConst.UIDamageType.Invincible or hurtType == LuaConst.UIDamageType.SuperArmor then -- do nothing else content = string.format(TwoParamStr, PlusStr, number) end end end return content end ------------ End 伤害治疗显示计算 End ------------ return UIEntityHurtNumber3DPanel