FloatNode = {} local floatingEffect = "FloatingText" local buffFloatingEffect = "BuffFloatingText" local floor = math.floor -- 普通文字 TextFloatingColor = { Blue = 1, Red = 2, Purple = 3, Green = 4, DarkGreen=5, } local _FloatingTypeToColor = { [TextFloatingColor.Blue] = Color.New(31, 237, 255, 255) / 255, [TextFloatingColor.Red] = Color.New(236, 4, 4, 255) / 255, [TextFloatingColor.Purple] = Color.New(235, 17, 255, 255) / 255, [TextFloatingColor.Green] = Color.New(17, 255, 17, 255) / 255, [TextFloatingColor.DarkGreen] = Color.New(56, 127, 46, 255) / 255, } -- 艺术字 ArtFloatingType = { CritDamage = 1, -- 暴击 Damage = 2, Treat = 3, FireDamage = 4, PoisonDamage = 5, yujiaAdd = 6, BleedDamage = 7, } local ArtFloatingAnim = { [1] = "Crit_Attack_Float", [2] = "Normal_Attack_Float", [3] = "floatingTextAnim", [4] = "floatingTextAnim", [5] = "floatingTextAnim", } --角色受到的暴击伤害(无论什么类型) - 红色字体 (字符顺序:40-49 ,0-9)(110, -)(111, +)(33, 暴击)(35, 灼烧) --角色造成的点击技伤害 - 白色字体 (字符顺序:50-59 ,0-9)(112, -)(113, +) --角色造成的滑动技伤害 - 黄色字体 (字符顺序:60-69 ,0-9)(114, -)(115, +) --角色恢复量 - 绿色字体 (字符顺序:70-79 ,0-9)(116, -)(117, +) --角色造成的异妖技伤害 - 紫色字体 (字符顺序:80-89 ,0-9)(118, -)(119, +)(34, 中毒) ArtFloatingColor = { Red = 0, White = 1, Yellow = 2, Green = 3, Purple = 4, Poison = 5, Fire = 6, } function FloatNode.New(unit, root, node) local o = {} setmetatable(o, {__index = FloatNode}) o:ctor(unit, root, node) return o end function FloatNode:ctor(unit, root, node) self.spLoader = SpriteLoader.New() self.owner = unit self.RootPanel = root self.GameObject = node self.targetPos=node.transform.position self.LastBuffTextTime = Time.realtimeSinceStartup self.BuffTextCount = 0 self.LastFloatingTime = Time.realtimeSinceStartup self.FloatingCount = 0 end function FloatNode:Dispose() self.spLoader:Destroy() end function FloatNode:TextBuffFloating(type, text) local color = _FloatingTypeToColor[type] local go = BattleManager.LoadAsset(buffFloatingEffect) local baseY = 0 go.transform:SetParent(self.RootPanel.transform) go.transform.localScale = Vector3.one go.transform.position = self.GameObject.transform.position go:SetActive(true) if Time.realtimeSinceStartup - self.LastBuffTextTime < BattleLogic.GameDeltaTime then self.BuffTextCount = self.BuffTextCount + 1 else self.BuffTextCount = 0 end self.LastBuffTextTime = Time.realtimeSinceStartup local v2 = go:GetComponent("RectTransform").anchoredPosition go:GetComponent("RectTransform").anchoredPosition = v2 + Vector2.New(0,baseY + self.BuffTextCount * 60) local battleSorting = BattleManager.GetBattleSorting() Util.GetGameObject(go, "anim"):GetComponent("Canvas").sortingOrder = battleSorting + 200 Util.GetGameObject(go, "anim/text"):SetActive(true) Util.GetGameObject(go, "anim/text"):GetComponent("Text").text = text Util.GetGameObject(go, "anim/text"):GetComponent("Text").color = color Util.GetGameObject(go, "anim/grid"):SetActive(false) BattleManager.AddDelayRecycleRes(buffFloatingEffect, go, 1.3) end -- function FloatNode:ImageBuffFloating(textImg, numImg, numTxt,type,isPurple) local go = BattleManager.LoadAsset(buffFloatingEffect) local baseY = 0 go.transform:SetParent(self.RootPanel.transform) go.transform.localScale = Vector3.one go.transform.position = self.GameObject.transform.position go:SetActive(true) if Time.realtimeSinceStartup - self.LastBuffTextTime < BattleLogic.GameDeltaTime then self.BuffTextCount = self.BuffTextCount + 1 else self.BuffTextCount = 0 end self.LastBuffTextTime = Time.realtimeSinceStartup local v2 = go:GetComponent("RectTransform").anchoredPosition go:GetComponent("RectTransform").anchoredPosition = v2 + Vector2.New(0,baseY + self.BuffTextCount * 60) local battleSorting = BattleManager.GetBattleSorting() Util.GetGameObject(go, "anim"):GetComponent("Canvas").sortingOrder = battleSorting + 200 Util.GetGameObject(go, "anim/text"):SetActive(false) Util.GetGameObject(go, "anim/grid"):SetActive(true) local img1 = Util.GetGameObject(go, "anim/grid/Image1"):GetComponent("Image") local img2 = Util.GetGameObject(go, "anim/grid/Image2"):GetComponent("Image") local txt3 = Util.GetGameObject(go, "anim/grid/Text"):GetComponent("Text") local txt4 = Util.GetGameObject(go, "anim/grid/Text1"):GetComponent("Text") if textImg then img1.gameObject:SetActive(true) if type~=nil and type~=0 then local list = string.split(textImg, "#") if list and LengthOfTable(list)>1 then textImg=list[type] end end img1.sprite = self.spLoader:LoadSprite(textImg) img1:SetNativeSize() else img1.gameObject:SetActive(false) end if numImg then img2.gameObject:SetActive(true) img2.sprite = self.spLoader:LoadSprite(numImg) img2:SetNativeSize() else img2.gameObject:SetActive(false) end if numTxt then txt3.gameObject:SetActive(true) if isPurple then txt4.gameObject:SetActive(true) txt3.gameObject:SetActive(false) else txt4.gameObject:SetActive(false) txt3.gameObject:SetActive(true) end txt3.text = numTxt txt4.text = numTxt else txt3.gameObject:SetActive(false) txt4.gameObject:SetActive(false) end BattleManager.AddDelayRecycleRes(buffFloatingEffect, go, 1.3) end function FloatNode:GetArtText(type, color, value) local sp = "" local text = "" value=floor(value) if type == ArtFloatingType.CritDamage then sp = "r_zhandou_baoji_zh" -- 暴击 text = text .. string.char((color*2)+110) -- 减号 elseif type == ArtFloatingType.Damage then text = text .. string.char((color*2)+110) -- 减号 elseif type == ArtFloatingType.Treat then text = text..string.char((color*2)+111) -- 加号 elseif type == ArtFloatingType.FireDamage then sp = "z_zhandou_zhuoshao_zh" -- 灼烧 -- text = text .. string.char(35) -- 灼烧文字 text = text .. string.char((color*2)+110) -- 减号 elseif type == ArtFloatingType.PoisonDamage then sp = "z_zhandou_zhongdu_zh" -- 灼烧 -- text = text .. string.char(34) -- 中毒文字 text = text .. string.char((color*2)+110) -- 减号 elseif type == ArtFloatingType.yujiaAdd then sp = "z_zhandou_yujia_zh" --御甲 text = text .. string.char((color*2)+111) -- 减号 elseif type == ArtFloatingType.BleedDamage then sp = "z_zhandou_liuxue_zh" -- 流血 text = text .. string.char((color*2)+110) -- 减号 end -- 数字 local str = tostring(value) for i=1,#str do text = text..string.char((string.byte(str,i) - 48) + color*10 + 40) end return sp, text end -- function FloatNode:ArtFloating(type, color, value,role) -- local trole= role and role or nil -- local go = BattleManager.LoadAsset(floatingEffect) -- go.transform:SetParent(self.RootPanel.transform) -- go.transform.localScale = Vector3.one * 0.70 -- go.transform.position = self.GameObject.transform.position -- local index=0 -- local t={} -- if trole~=nil then -- local index=0 -- if #trole.DamageTextTable== 0 then -- trole.DamageTextTable[#trole.DamageTextTable+1]=go -- index=#trole.DamageTextTable -- else -- for key, value in pairs(trole.DamageTextTable) do -- if trole.DamageTextTable[key] == nil then -- trole.DamageTextTable[key] =go -- index =key -- break -- end -- end -- if index==0 then -- trole.DamageTextTable[#trole.DamageTextTable+1]=go -- index=#trole.DamageTextTable -- end -- end -- LogError("index=="..index) -- go.transform.position =Vector3.New(self.GameObject.transform.position.x,self.GameObject.transform.position.y+0.15*index,self.GameObject.transform.position.z) -- LogError("goy"..go.transform.position.y) -- else -- go.transform.position = self.GameObject.transform.position -- end -- -- go.transform.position = self.GameObject.transform.position -- go:SetActive(true) -- if Time.realtimeSinceStartup - self.LastFloatingTime < BattleLogic.GameDeltaTime then -- self.FloatingCount = self.FloatingCount + 1 -- else -- self.FloatingCount = 0 -- end -- self.LastFloatingTime = Time.realtimeSinceStartup -- local v2 = go:GetComponent("RectTransform").anchoredPosition -- v2 = v2 + Vector2.New(0, self.owner.role.camp * 100 + 100) -- go:GetComponent("RectTransform").anchoredPosition = v2 + Vector2.New(0, 50) * (self.FloatingCount+1) -- local sp, text = self:GetArtText(type, color, value) -- local anim = Util.GetGameObject(go, "anim") -- -- 伤害文字 -- local img = Util.GetGameObject(anim, "Image"):GetComponent("Image") -- if sp and sp ~= "" then -- img.sprite = self.spLoader:LoadSprite(sp) -- img.gameObject:SetActive(true) -- else -- img.gameObject:SetActive(false) -- end -- -- 伤害数值 -- local animTxt = Util.GetGameObject(go, "anim/anim") -- local animTxtC = animTxt:GetComponent("Text") -- animTxtC.text = text -- --主要用于给白色字体染色成其他颜色,color 参数只能填白色 -- -- 层级和动画 -- anim:GetComponent("Canvas").sortingOrder = BattleManager.GetBattleSorting() + 100 -- anim:GetComponent("Animator"):Play(ArtFloatingAnim[type]) -- BattleManager.AddDelayRecycleRes(floatingEffect, go, 3,function () -- if trole then -- for key, value in pairs(trole.DamageTextTable) do -- if value == go then -- trole.DamageTextTable[key] = nil -- break -- end -- end -- -- LogError(#trole.DamageTextTable) -- end -- end) -- end function FloatNode:ArtFloating(type, color, value,role,tarGetPos) local trole= role and role or {} local ttarGetPos=tarGetPos and tarGetPos or self.GameObject.transform.position local go = BattleManager.LoadAsset(floatingEffect) go.transform:SetParent(self.RootPanel.transform) go.transform.localScale = Vector3.one * 0.70 self.targetPos=self.owner.SingleHitEffectRoot.gameObject.transform.position go.transform.position = self.targetPos local index=0 local t={} if trole~=nil then local index=0 if #trole== 0 then trole[#trole+1]=go index=#trole else for key, value in pairs(trole) do if trole[key] == nil then trole[key] =go index =key break end end if index==0 then trole[#trole+1]=go index=#trole end end go.transform.position =Vector3.New(GetPreciseDecimal(tonumber(self.targetPos.x),5),GetPreciseDecimal(self.targetPos.y+0.5+0.10*index,5),GetPreciseDecimal(self.targetPos.z,5)) LogError(index) -- LogError("Gax"..self.targetPos.x) -- -- LogError("goy"..go.transform.position.y) -- LogError("gox"..go.transform.position.x) else go.transform.position = self.targetPos end -- go.transform.position = self.GameObject.transform.position go:SetActive(true) if Time.realtimeSinceStartup - self.LastFloatingTime < BattleLogic.GameDeltaTime then self.FloatingCount = self.FloatingCount + 1 else self.FloatingCount = 0 end self.LastFloatingTime = Time.realtimeSinceStartup local v2 = go:GetComponent("RectTransform").anchoredPosition v2 = v2 + Vector2.New(0, self.owner.role.camp * 100 + 100) --go:GetComponent("RectTransform").anchoredPosition = v2 + Vector2.New(0, 50) * (self.FloatingCount+1) local sp, text = self:GetArtText(type, color, value) local anim = Util.GetGameObject(go, "anim") -- 伤害文字 local img = Util.GetGameObject(anim, "Image"):GetComponent("Image") if sp and sp ~= "" then img.sprite = self.spLoader:LoadSprite(sp) img.gameObject:SetActive(true) else img.gameObject:SetActive(false) end -- 伤害数值 local animTxt = Util.GetGameObject(go, "anim/anim") local animTxtC = animTxt:GetComponent("Text") animTxtC.text = text --主要用于给白色字体染色成其他颜色,color 参数只能填白色 -- 层级和动画 anim:GetComponent("Canvas").sortingOrder = BattleManager.GetBattleSorting() + 100 anim:GetComponent("Animator"):Play(ArtFloatingAnim[type]) BattleManager.AddDelayRecycleRes(floatingEffect, go, 1,function () if trole then for key, value in pairs(trole) do if value == go then trole[key] = nil break end end -- LogError(#trole.DamageTextTable) end end) end function FloatNode:SetPosition(pos) self.targetPos=pos end return FloatNode