require("Modules.Battle.Logic.Misc.BattleDefine") local FEAConfig = require("Modules/Battle/Config/FightEffectAudioConfig") RoleView = {} RoleView.__index = RoleView local MonsterViewConfig = ConfigManager.GetConfig(ConfigName.MonsterViewConfig) local MonsterConfig = ConfigManager.GetConfig(ConfigName.MonsterConfig) local RoleConfig = ConfigManager.GetConfig(ConfigName.RoleConfig) local HeroConfig = ConfigManager.GetConfig(ConfigName.HeroConfig) local SkillLogicConfig = ConfigManager.GetConfig(ConfigName.SkillLogicConfig) local BuffEffectConfig = ConfigManager.GetConfig(ConfigName.BuffEffectConfig) local Bezier = require("Base.Bezier") local healEffect = "c_xy_0012_skeff_tapsk_healeff" local rageEffect = "s_jieling_hs_3006_skeff_casting_buff_nuqi" local cdChangedEffect = "c_jz_0002_skeff_slidesk_buff" local floatingEffect = "FloatingText" local buffFloatingEffect = "BuffFloatingText" local loadAsset = function(path, battleSorting) --- 播放音效 local audioData = FEAConfig.GetAudioData(path) if audioData then SoundManager.PlaySound(audioData.name) end -- local go = poolManager:LoadAsset(path, PoolManager.AssetType.GameObject) local layer = tonumber(go.name) or 0 battleSorting = battleSorting or BattleManager.GetBattleSorting() Util.AddParticleSortLayer(go, battleSorting - layer) go.name = tostring(battleSorting) return go end function RoleView.New(go, role, position, root) local instance = {} setmetatable(instance, RoleView) instance.RootPanel = root instance.GameObject = go instance.role = role instance.camp = role.camp instance.buffRoot = Util.GetGameObject(go, "buff") instance.BuffIconList = {} instance.BuffEffectList = {} instance.delayRecycleList = {} role.Event:AddEvent(BattleEventName.SkillCast, instance.OnSkillCast, instance) BattleLogic.Event:AddEvent(BattleEventName.BattleEnd, instance.OnEnd, instance) BattleLogic.Event:AddEvent(BattleEventName.BattleOrderChange, instance.OnEnd, instance) role.Event:AddEvent(BattleEventName.BeHitMiss, instance.OnBeHitMiss, instance) role.Event:AddEvent(BattleEventName.RoleBeDamaged, instance.OnDamaged, instance) role.Event:AddEvent(BattleEventName.RoleBeTreated, instance.OnTreated, instance) role.Event:AddEvent(BattleEventName.RoleBeHealed, instance.OnHealed, instance) role.Event:AddEvent(BattleEventName.RoleDead, instance.OnDead, instance) role.Event:AddEvent(BattleEventName.RoleRealDead, instance.OnRealDead, instance) role.Event:AddEvent(BattleEventName.RoleCDChanged, instance.OnRoleCDChanged, instance) -- role.Event:AddEvent(BattleEventName.RoleViewBullet, instance.RoleViewBullet, instance) role.Event:AddEvent(BattleEventName.RoleRageChange, instance.RoleRageChange, instance) role.Event:AddEvent(BattleEventName.RoleRelive, instance.onRoleRelive, instance) role.Event:AddEvent(BattleEventName.AOE, instance.OnAOE, instance) role.Event:AddEvent(BattleEventName.BeSeckill, instance.onBeSecKill, instance) role.Event:AddEvent(BattleEventName.BuffStart, instance.OnBuffStart, instance) role.Event:AddEvent(BattleEventName.BuffCover, instance.OnBuffCover, instance) role.Event:AddEvent(BattleEventName.BuffTrigger, instance.OnBuffTrigger, instance) role.Event:AddEvent(BattleEventName.BuffEnd, instance.OnBuffEnd, instance) role.Event:AddEvent(BattleEventName.BuffDodge, instance.OnBuffDodge, instance) role.Event:AddEvent(BattleEventName.BuffRoundChange, instance.OnBuffRoundChange, instance) role.Event:AddEvent(BattleEventName.BuffDurationChange, instance.OnBuffRoundChange, instance) role.Event:AddEvent(BattleEventName.ShildTrigger, instance.OnShieldTrigger, instance) role.Event:AddEvent(BattleEventName.ShowHintText,instance.OnShowHintText,instance) instance.hpCache = instance.role:GetRoleData(RoleDataName.Hp) / instance.role:GetRoleData(RoleDataName.MaxHp) instance.hpSlider = Util.GetGameObject(go, "hpProgress/hp"):GetComponent("Image") instance.hpPassSlider = Util.GetGameObject(go, "hpProgress/hpPass"):GetComponent("Image") instance.hpSlider.fillAmount = instance.hpCache instance.hpPassSlider.fillAmount = instance.hpCache instance.readingName = "" if role.roleData.roleId > 10000 then instance.livePath = GetResourcePath(HeroConfig[role.roleData.roleId].Live) instance.play_liveScale = RoleConfig[role.roleData.roleId].play_liveScale instance.enemy_liveScale = RoleConfig[role.roleData.roleId].enemy_liveScale instance.offset = RoleConfig[role.roleData.roleId].offset instance.outOffset = RoleConfig[role.roleData.roleId].enemy_offset instance.spAtkTime = RoleConfig[role.roleData.roleId].CastingSkills/1000 instance.atkSoundTime = RoleConfig[role.roleData.roleId].CastingAudio/1000 instance.attackSound = RoleConfig[role.roleData.roleId].sond if role.roleData.monsterId then --非战斗数据,仅用于显示怪物名称 instance.readingName = MonsterConfig[role.roleData.monsterId].ReadingName else instance.readingName = HeroConfig[role.roleData.roleId].ReadingName end else instance.livePath = GetResourcePath(MonsterViewConfig[role.roleData.roleId].Live) instance.enemy_liveScale = MonsterViewConfig[role.roleData.roleId].enemy_liveScale instance.offset = MonsterViewConfig[role.roleData.roleId].offset instance.spAtkTime = MonsterViewConfig[role.roleData.roleId].CastingSkills/1000 instance.atkSoundTime = MonsterViewConfig[role.roleData.roleId].CastingAudio/1000 instance.attackSound = MonsterViewConfig[role.roleData.roleId].sond if role.roleData.monsterId then --非战斗数据,仅用于显示怪物名称 instance.readingName = MonsterConfig[role.roleData.monsterId].ReadingName else instance.readingName = HeroConfig[role.roleData.roleId].ReadingName end end Util.GetGameObject(go, "Name/Text"):GetComponent("Text").text = instance.readingName Util.GetGameObject(go, "lv/Text"):GetComponent("Text").text = role:GetRoleData(RoleDataName.Level) Util.GetGameObject(go, "Pro/Image"):GetComponent("Image").sprite = Util.LoadSprite(GetProStrImageByProNum(role.roleData.element)) -- 卡牌立绘 if role.camp == 0 then Util.GetGameObject(go, "Bg1"):GetComponent("Image").sprite = Util.LoadSprite(GetBattleHeroCardStarBg[role.roleData.star]) Util.GetGameObject(go, "Bg2"):GetComponent("Image").sprite = Util.LoadSprite(GetHeroCardStarFg[role.roleData.star]) local starGrid = Util.GetGameObject(go, "StarGrid") SetCardStars(starGrid, role.roleData.star or 5) local zs = Util.GetGameObject(go, "zs") local zsName = GetHeroCardStarZs[role.roleData.star] if zsName == "" then zs:SetActive(false) else zs:SetActive(true) zs:GetComponent("Image").sprite = Util.LoadSprite(zsName) end instance.liveRender = Util.GetGameObject(go, "Mask/icon"):GetComponent("RawImage") instance.liveRender.texture, instance.RoleLiveGO = CardRendererManager.GetSpineTexture(role.position, instance.livePath, Vector3.one * instance.play_liveScale, Vector3.New(instance.offset[1], instance.offset[2], 0), false) --Util.LoadSprite(heroData.painting) instance.liveRender.material = resMgr:LoadAsset("UI_AlphaMask "..position) else instance.RoleLiveGO = poolManager:LoadLive(instance.livePath, go.transform.parent, Vector3.one, Vector3.zero) end instance.RoleLiveGOGraphic = instance.RoleLiveGO:GetComponent("SkeletonGraphic") instance.RoleLiveGOTran = instance.RoleLiveGO:GetComponent("RectTransform") instance.RoleLiveGOGraphic.AnimationState:SetAnimation(0, "idle", true) instance.RoleLiveGOTran.sizeDelta = Vector2.New(1000, 1000) -- casting技能立绘 instance.RoleLiveGO2 = poolManager:LoadLive(instance.livePath, go.transform.parent, Vector3.one, Vector3.zero) instance.RoleLiveGOGraphic2 = instance.RoleLiveGO2:GetComponent("SkeletonGraphic") instance.RoleLiveGOTran2 = instance.RoleLiveGO2:GetComponent("RectTransform") instance.RoleLiveGOGraphic2.AnimationState:SetAnimation(0, "idle", true) instance.RoleLiveGOTran2.sizeDelta = Vector2.New(1000, 1000) instance.rageCache = nil if role.camp == 0 then instance.liveRender.transform:SetParent(Util.GetGameObject(go, "Mask").transform) instance.liveRender.transform.localScale = Vector3.one --* instance.play_liveScale * 2 instance.liveRender.transform.anchoredPosition = Vector3.zero--Vector2.New(instance.offset[1], instance.offset[2]) instance.liveRender.gameObject:SetActive(true) instance.RoleLiveGO2.transform:SetParent(instance.RootPanel.mySkillCastRoot.transform) instance.RoleLiveGO2.transform.localScale = Vector3.one * instance.enemy_liveScale -- * 0.75--* 1.5 instance.RoleLiveGO2.transform.anchoredPosition = Vector2.New(instance.outOffset[1], instance.outOffset[2] - 300) instance.RoleLiveGO2:SetActive(false) instance.RoleIconGO = Util.GetGameObject(go, "func") -- instance.icon = Util.LoadSprite(GetResourcePath(HeroConfig[role.roleData.roleId].Icon)) -- instance.RoleIconImage = instance.RoleIconGO:GetComponent("Image") -- instance.RoleIconImage.sprite = instance.icon -- instance.RoleIconImage.color = Color.New(1,1,1,1) instance.RoleIconTran = instance.RoleIconGO:GetComponent("RectTransform") instance.RoleIconTran.anchoredPosition = Vector2.zero Util.SetGray(instance.RoleIconGO, false) instance.RoleIconGO:SetActive(true) instance.deadIconGO = Util.GetGameObject(instance.RoleIconGO, "dead") instance.effect = Util.GetGameObject(instance.RoleIconGO, "effect") instance.effect:SetActive(false) instance.deadIconGO:SetActive(false) instance.effect_dead = Util.GetGameObject(instance.deadIconGO, "effect") else instance.RoleLiveGO.transform:SetParent(Util.GetTransform(instance.RootPanel.EnemyPanel, "live_"..position)) instance.RoleLiveGO:GetComponent("RectTransform").anchoredPosition = Vector2.New(instance.outOffset[1], instance.outOffset[2])-- * 0.5 instance.RoleLiveGO.transform.localScale = Vector3.one * instance.enemy_liveScale --* 0.75 instance.RoleLiveGO:SetActive(true) instance.RoleLiveGO2.transform:SetParent(instance.RootPanel.enemySkillCastRoot.transform) instance.RoleLiveGO2:GetComponent("RectTransform").anchoredPosition = Vector2.New(instance.outOffset[1], instance.outOffset[2] + 400) instance.RoleLiveGO2.transform.localScale = Vector3.one * instance.enemy_liveScale --* 2 instance.RoleLiveGO2:SetActive(false) instance.shadow = Util.GetGameObject(instance.RootPanel.EnemyPanel, "live_"..position.."/shadow") instance.shadow:SetActive(true) instance.effect_dead = Util.GetGameObject(go, "effect_Dead") instance.deadIconGO = Util.GetGameObject(go, "buttom/dead") Util.GetGameObject(go, "buttom/pos"):GetComponent("Image").sprite = Util.LoadSprite("r_zhandou_difangweizhi_0"..role.position) instance.effect_dead:SetActive(false) instance.deadIconGO:SetActive(false) end -- instance.RoleLiveGO.transform:SetAsFirstSibling() -- instance.RoleLiveGO2.transform:SetAsFirstSibling() instance.rageSlider = Util.GetGameObject(go, "rageProgress/rage"):GetComponent("Image") instance.rageText = Util.GetGameObject(go, "rageProgress/Text"):GetComponent("Text") instance.effect_rage = Util.GetGameObject(go, "rageProgress/effect") instance.effect_rage:SetActive(instance.role.Rage >= 4) instance.rageSlider.fillAmount = instance.role.Rage / 4 instance.rageText.gameObject:SetActive(false) instance.rageText.text = "" if IsOpenBattleDebug then local URoleProperty = go:GetComponent(typeof(RoleProperty)) if not URoleProperty then URoleProperty = go:AddComponent(typeof(RoleProperty)) end instance.URoleProperty = URoleProperty instance.URoleProperty.uid = role.uid role.data:Foreach(function (name, value) instance.URoleProperty:AddProperty(name, value) end) end instance.LastBuffFloatingTime = Time.realtimeSinceStartup instance.BuffFloatingCount = 0 instance.LastBuffTextTime = Time.realtimeSinceStartup instance.BuffTextCount = 0 instance.LastFloatingTime = Time.realtimeSinceStartup instance.FloatingCount = 0 if role.camp == 0 then local battleSorting = BattleManager.GetBattleSorting() instance:ChangeCardSorting(battleSorting + position) -- local c = go:GetComponent("Canvas") -- c.sortingOrder = battleSorting + position end return instance end --所有需要延迟回收的资源走该接口,当回调执行前界面已被销毁时,不会报错 function RoleView:AddDelayRecycleRes(path, go, delayTime, delayFunc) if not self.delayRecycleList[path] then self.delayRecycleList[path] = {} end table.insert(self.delayRecycleList[path], go) Timer.New(function () if not self.delayRecycleList[path] then return end for i=1, #self.delayRecycleList[path] do if self.delayRecycleList[path][i] == go then Util.SetGray(go, false) poolManager:UnLoadAsset(path, go, PoolManager.AssetType.GameObject) table.remove(self.delayRecycleList[path], i) break end end if delayFunc then delayFunc() end end, delayTime):Start() end function RoleView:DelayFunc(time, func) if not self._DelayFuncList then self._DelayFuncList = {} end local timer timer = Timer.New(function () if func then func() func = nil end self:ClearDelayFunc(timer) end, time) timer:Start() table.insert(self._DelayFuncList, timer) end function RoleView:ClearDelayFunc(t) if not self._DelayFuncList then return end if t then local rIndex for index, timer in ipairs(self._DelayFuncList) do if timer == t then rIndex = index break end end if rIndex then self._DelayFuncList[rIndex]:Stop() table.remove(self._DelayFuncList, rIndex) end else for _, timer in ipairs(self._DelayFuncList) do timer:Stop() end self._DelayFuncList = {} end end -- function RoleView:LoopFunc(time, count, func) if count <= 0 then LogError(Language[12217]) return end if not self._LoopFuncList then self._LoopFuncList = {} end local timer = nil local ctr = 0 timer = Timer.New(function () if func then func() end ctr = ctr + 1 if ctr >= count then self:ClearDelayFunc(timer) end end, time, count) timer:Start() table.insert(self._LoopFuncList, timer) end function RoleView:ClearLoopFunc(t) if not self._LoopFuncList then return end if t then local rIndex for index, timer in ipairs(self._LoopFuncList) do if timer == t then rIndex = index break end end if rIndex then self._LoopFuncList[rIndex]:Stop() table.remove(self._LoopFuncList, rIndex) end else for _, timer in ipairs(self._LoopFuncList) do timer:Stop() end self._LoopFuncList = {} end end local TextFloatingColor = { Blue = 1, Red = 2, Purple = 3, Green = 4, } --单纯显示提示文字 function RoleView:OnShowHintText(type,LanguageIndex) self:TextBuffFloating(type,Language[LanguageIndex]) end function RoleView:TextBuffFloating(type, text) local color if type == 1 then --蓝色 增益 效果抵抗 color = Color.New(31, 237, 255, 255) / 255 elseif type == 2 then --红色 减益 color = Color.New(236, 4, 4, 255) / 255 elseif type == 3 then --紫色 dot color = Color.New(235, 17, 255, 255) / 255 elseif type == 4 then --绿色 hot color = Color.New(17, 255, 17, 255) / 255 end local go = loadAsset(buffFloatingEffect) local baseY = 0 -- if self.camp == 0 then go.transform:SetParent(self.RootPanel.transform) -- baseY = 60 -- else -- go.transform:SetParent(self.GameObject.transform) -- baseY = 200 -- end 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) self:AddDelayRecycleRes(buffFloatingEffect, go, 1.3) end -- function RoleView:ImageBuffFloating(textImg, numImg, numTxt) local go = loadAsset(buffFloatingEffect) local baseY = 0 -- if self.camp == 0 then go.transform:SetParent(self.RootPanel.transform) -- baseY = 60 -- else -- go.transform:SetParent(self.GameObject.transform) -- -- baseY = 200 -- end 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") if textImg then img1.gameObject:SetActive(true) img1.sprite = Util.LoadSprite(textImg) img1:SetNativeSize() else img1.gameObject:SetActive(false) end if numImg then img2.gameObject:SetActive(true) img2.sprite = Util.LoadSprite(numImg) img2:SetNativeSize() else img2.gameObject:SetActive(false) end if numTxt then txt3.gameObject:SetActive(true) txt3.text = numTxt else txt3.gameObject:SetActive(false) end self:AddDelayRecycleRes(buffFloatingEffect, go, 1.3) end -- local ArtFloatingType = { CritDamage = 1, -- 暴击 Damage = 2, Treat = 3, FireDamage = 4, PoisonDamage = 5, } 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, 中毒) local ArtFloatingColor = { Red = 0, White = 1, Yellow = 2, Green = 3, Purple = 4, Poison = 5, Fire = 6, } function RoleView:GetArtText(type, color, value) local text = "" if type == ArtFloatingType.CritDamage then text = text .. string.char(33) -- 暴击文字 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 text = text .. string.char(35) -- 灼烧文字 text = text .. string.char((color*2)+110) -- 减号 elseif type == ArtFloatingType.PoisonDamage then text = text .. string.char(34) -- 中毒文字 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 text end function RoleView:ArtFloating(type, color, value) local go = loadAsset(floatingEffect) -- if self.camp == 0 then go.transform:SetParent(self.RootPanel.transform) -- else -- go.transform:SetParent(self.GameObject.transform) -- end go.transform.localScale = Vector3.one * 0.7 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.role.camp * 100 + 100) go:GetComponent("RectTransform").anchoredPosition = v2 + Vector2.New(0, 50) * (self.FloatingCount+1) local text = self:GetArtText(type, color, value) local anim = Util.GetGameObject(go, "anim") anim:GetComponent("Text").text = text anim:GetComponent("Canvas").sortingOrder = BattleManager.GetBattleSorting() + 100 anim:GetComponent("Animator"):Play(ArtFloatingAnim[type]) self:AddDelayRecycleRes(floatingEffect, go, 2) end function RoleView:OnPointerClick(data) if self.role.IsDebug and self.role.skill then self.role.skill:Cast() end data:Use() end function RoleView:OnEndDrag(data) if self.role.IsDebug and self.role.superSkill then self.role.superSkill:Cast() end data:Use() end -- function RoleView:OnSortingOrderChange(battleSorting) if self.camp == 0 then self:ChangeCardSorting(battleSorting + self.role.position) -- self.GameObject:GetComponent("Canvas").sortingOrder = battleSorting + self.role.position end end -- 改变卡牌层级 function RoleView:ChangeCardSorting(sortingOrder) if not self.oSortingOrder then self.oSortingOrder = BattleManager.GetBattleSorting() end self.GameObject:GetComponent("Canvas").sortingOrder = sortingOrder self.effect_rage:GetComponent("Canvas").sortingOrder = sortingOrder self.effect_dead:GetComponent("Canvas").sortingOrder = sortingOrder Util.AddParticleSortLayer(self.effect_rage, sortingOrder - self.oSortingOrder) Util.AddParticleSortLayer(self.effect_dead, sortingOrder - self.oSortingOrder) self.oSortingOrder = sortingOrder end function RoleView:Update() -- if not self.isPlay then -- return -- end if self.role:IsRealDead() then return end local hp = self.role:GetRoleData(RoleDataName.Hp) / self.role:GetRoleData(RoleDataName.MaxHp) if self.hpCache ~= hp then local f1 = self.hpCache local f2 = hp if f1 > f2 then if self.hpTween then self.hpTween:Kill() end self.hpSlider.fillAmount = hp self.hpTween = DoTween.To(DG.Tweening.Core.DOGetter_float( function () return f1 end), DG.Tweening.Core.DOSetter_float(function (progress) self.hpPassSlider.fillAmount = progress end), f2, 0.5):SetEase(Ease.Linear) else if self.hpPassTween then self.hpPassTween:Kill() end self.hpPassSlider.fillAmount = hp self.hpPassTween = DoTween.To(DG.Tweening.Core.DOGetter_float( function () return f1 end), DG.Tweening.Core.DOSetter_float(function (progress) self.hpSlider.fillAmount = progress end), f2, 0.5):SetEase(Ease.Linear) end self.hpCache = hp end local rage = self.role.Rage / 4 if self.rageCache ~= rage then -- 判断是否播放满怒动画 if (not self.rageCache or self.rageCache < 1) and rage >= 1 then local go = loadAsset(rageEffect) go.transform:SetParent(self.GameObject.transform) go.transform.localScale = Vector3.one go.transform.localPosition = Vector3.zero go:SetActive(true) self:AddDelayRecycleRes(rageEffect, go, 3) end self.effect_rage:SetActive(rage >= 1) self.rageCache = rage self.rageSlider.fillAmount = self.rageCache self.rageText.gameObject:SetActive(self.rageCache >= 1) self.rageText.text = self.role.Rage -- TODO: 战斗引导相关调整 if rage == 1 and self.camp == 0 then Game.GlobalEvent:DispatchEvent(GameEvent.Guide.GuideBattleCDDone, self) end end for k, v in pairs(self.BuffIconList) do v:Update() end if IsOpenBattleDebug then self.role.data:Foreach(function (name, value) self.URoleProperty:SetValue(name, value) end) end end -- 缩放 function RoleView:DoScale(scale, dur, func) if self.dsTween then self.dsTween:Kill() end self.dsTween = self.GameObject.transform.parent:DOScale(Vector3.one * scale, dur) :OnComplete(function () -- Log("DoScale = "..scale) if func then func() end end) if self.camp == 1 then if self.dsTween2 then self.dsTween2:Kill() end local liveScale = self.role.position <= 3 and 0.6 or 0.5 self.dsTween2 = self.RoleLiveGO.transform.parent:DOScale(Vector3.one * liveScale * scale, dur) end end -- 设置高亮 function RoleView:SetHighLight(isLight, eScale, dur, func) -- 设置变灰 -- LogGreen(self.role.camp .."|||"..self.role.position.."|||"..tostring(isLight)) if self.isDead then Util.SetGray(self.GameObject, true) Util.SetSpineGray(self.RoleLiveGOGraphic, true) Util.SetGray(self.deadIconGO, false) local color = Color.New(75, 75, 75, 255)/255 Util.SetColor(self.GameObject, color) Util.SetColor(self.RoleLiveGOGraphic, color) Util.SetColor(self.deadIconGO, Color.New(1, 1, 1, 1)) self:DoScale(0.8, dur, func) return end -- -- Util.SetGray(self.GameObject, not isLight) -- Util.SetSpineGray(self.RoleLiveGOGraphic, not isLight) self:DoScale(eScale, dur, func) -- 颜色变灰 local sc = isLight and 0.3 or 1 local ec = isLight and 1 or 0.3 if self.hlTween3 then self.hlTween3:Kill() end self.hlTween3 = DoTween.To(DG.Tweening.Core.DOGetter_float( function () return sc end), DG.Tweening.Core.DOSetter_float(function (progress) local color = Color.New(progress, progress, progress, 1) Util.SetColor(self.GameObject, color) -- if self.camp == 1 then Util.SetColor(self.RoleLiveGOGraphic, color) -- end end), ec, dur):SetEase(Ease.Linear) -- :OnComplete(function() -- if func then -- func() -- end -- end) -- local sScale = isLight and 1 or 1.2 -- local bScaleV3 = self.GameObject.transform.localScale -- local eScale = isLight and 1.2 or 1 -- 颜色变灰 -- local sc = isLight and 0.5 or 1 -- local ec = isLight and 1 or 0.5 -- if self.hlTween3 then -- self.hlTween3:Kill() -- end -- self.hlTween3 = DoTween.To(DG.Tweening.Core.DOGetter_float( function () return sc end), -- DG.Tweening.Core.DOSetter_float(function (progress) -- local color = Color.New(progress, progress, progress, 1) -- Util.SetColor(self.GameObject, color) -- -- if self.camp == 1 then -- Util.SetColor(self.RoleLiveGOGraphic, color) -- -- end -- end), ec, dur):SetEase(Ease.Linear):OnComplete(function() -- if func then -- func() -- end -- end) -- 直接变灰 -- local color = isLight and UIColor.WRITE or UIColor.GRAY -- Util.SetColor(self.GameObject, color) -- if self.camp == 1 then -- Util.SetColor(self.RoleLiveGOGraphic, color) -- end end -- 播放动画 function RoleView:PlaySpineAnim(gog, time, name, isLoop) if isLoop then gog.AnimationState:SetAnimation(time, name, isLoop) else local _complete = nil _complete = function(state) gog.AnimationState.Complete = gog.AnimationState.Complete - _complete gog.AnimationState:SetAnimation(0, "idle", true) end gog.AnimationState:ClearTracks() -- 清除上一个动画的影响(修复概率攻击动画播放错误的问题) gog.AnimationState:SetAnimation(time, name, isLoop) gog.AnimationState.Complete = gog.AnimationState.Complete + _complete -- gog.AnimationState.Start -- 开始 -- gog.AnimationState.Interrupt -- 打断 -- gog.AnimationState.End -- 结束 end end function RoleView:OnSkillCast(skill) if not skill then return end local combat = BattleManager.GetSkillCombat(SkillLogicConfig[skill.id].SkillDisplay) if not combat then return end if skill.isAdd then self:ImageBuffFloating("z_zhandou_zhuiji") end local battleSorting = BattleManager.GetBattleSorting() if self.camp == 0 then self:ChangeCardSorting(battleSorting + 20) end -- LogRed("Cast skill"..self.role.camp..self.role.position) -- 高亮 BattleManager.PauseBattle() self.RootPanel.SetRoleHighLight(self, skill:GetDirectTargets(), function() BattleManager.ResumeBattle() local duration = combat.KeyFrame/1000 if duration == 0 then self.RootPanel.SetRoleHighLight() if self.camp == 0 then self:ChangeCardSorting(battleSorting + self.role.position) end return end if self.camp == 0 then BattleManager.PauseBattle() local function _PlaySkill() -- 立绘上移动画 -- if self.rlgTween then self.rlgTween:Kill() end -- self.rlgTween = self.liveRender.transform:DOLocalMove(Vector3.New(0, 200, 0), 0.3, false):SetEase(Ease.OutSine) -- 立绘缩小 if self.rlgTween2 then self.rlgTween2:Kill() end self.rlgTween2 = self.RoleLiveGO.transform:DOScale(Vector3.one * self.play_liveScale * 0.7, 0.3):SetEase(Ease.OutSine) -- 立绘位置剧中 if self.rlgTween3 then self.rlgTween3:Kill() end self.rlgTween3 = self.RoleLiveGO.transform:DOLocalMove(Vector3.New(self.outOffset[1], self.outOffset[2] - 220, 0), 0.3, false):SetEase(Ease.OutSine) if self.liveRender then local mask2 = Util.GetGameObject(self.GameObject, "Mask2") if mask2 then self.liveRender.transform:SetParent(mask2.transform) end end local cardRenderMat = self.liveRender.material cardRenderMat:SetInt("_IsMask", 0) self:PlaySpineAnim(self.RoleLiveGOGraphic, 0, "attack", false) -- 这里相当于技能前摇,等待立绘播放到需要释放关键帧的时间时继续释放技能 self:CheckSkillForoleEffect(combat, skill) self:DelayFunc(self.spAtkTime, function() BattleManager.ResumeBattle() self:CheckFullSceenSkill(combat, skill) -- 取消高亮 self:DelayFunc((combat.KeyFrame + combat.SkillDuration)/1000, function() -- LogRed("Cast done"..self.role.camp..self.role.position) self.RootPanel.SetRoleHighLight() self:ChangeCardSorting(battleSorting + self.role.position) self.liveRender.transform:SetParent(Util.GetGameObject(self.GameObject, "Mask").transform) local cardRenderMat = self.liveRender.material cardRenderMat:SetInt("_IsMask", 1) self.RoleLiveGO.transform.localScale = Vector3.one * self.play_liveScale --Vector2.New(self.offset[1], self.offset[2]) self.RoleLiveGO.transform.localPosition = Vector3.New(self.offset[1], self.offset[2], 0) + Vector3(0, -120, 0) self.liveRender.transform.anchoredPosition = Vector2.zero--Vector2.New(self.offset[1], self.offset[2]) end) end) -- 攻击音效 if self.attackSound then self:DelayFunc(self.atkSoundTime - 0.3, function() SoundManager.PlaySound(self.attackSound) end) end end -- if combat.VerticalDrawing == 1 then _PlaySkill() elseif combat.VerticalDrawing == 2 then self:PlaySkillCastingEffect(combat, function() _PlaySkill() end) end else -- BattleManager.PauseBattle() local function _PlaySkill() self:PlaySpineAnim(self.RoleLiveGOGraphic, 0, "attack", false) -- 这里相当于技能前摇,等待立绘播放需要释放关键帧的时间时继续释放技能 self:CheckSkillForoleEffect(combat, skill) self:DelayFunc(self.spAtkTime, function() BattleManager.ResumeBattle() self:CheckFullSceenSkill(combat, skill) -- 取消高亮 self:DelayFunc((combat.KeyFrame + combat.SkillDuration)/1000, function() self.RootPanel.SetRoleHighLight() -- LogRed("Cast done"..self.role.camp..self.role.position) end) end) -- 攻击音效 if self.attackSound then self:DelayFunc(self.atkSoundTime - 0.3, function() SoundManager.PlaySound(self.attackSound) end) end end -- if combat.VerticalDrawing == 1 then _PlaySkill() elseif combat.VerticalDrawing == 2 then self:PlaySkillCastingEffect(combat, function() _PlaySkill() end) end end end) end function RoleView:PlaySkillCastingEffect(combat, func) if self.camp == 0 then -- 播放casting self.RootPanel.mySkillCast:SetActive(false) self.RootPanel.mySkillCast:SetActive(true) -- 播放casting声音 SoundManager.PlaySound(SoundConfig.Sound_RoleCasting) -- 技能名 -- local nameBg = Util.GetGameObject(self.RootPanel.mySkillCast, "Canvas/skill") local name = Util.GetGameObject(self.RootPanel.mySkillCast, "TongYong_Casting_Xia/DongHua/MingZi") if combat.skillname and combat.skillname ~= "" then -- nameBg:SetActive(true) name:SetActive(true) name:GetComponent("Image").sprite = Util.LoadSprite(combat.skillname) name:GetComponent("Image"):SetNativeSize() else -- nameBg:SetActive(false) name:SetActive(false) end else -- 播放casting self.RootPanel.enemySkillCast:SetActive(false) self.RootPanel.enemySkillCast:SetActive(true) -- 播放casting声音 SoundManager.PlaySound(SoundConfig.Sound_MonsterCasting) -- 技能名 local name = Util.GetGameObject(self.RootPanel.enemySkillCast, "TongYong_Casting_Shang/DongHua/MingZi") if combat.skillname and combat.skillname ~= "" then name:SetActive(true) name:GetComponent("Image").sprite = Util.LoadSprite(combat.skillname) name:GetComponent("Image"):SetNativeSize() else name:SetActive(false) end end -- 技能名音效 if combat.SkillNameVoice then SoundManager.PlaySound(combat.SkillNameVoice) end -- 提前进入下一阶段 self.RoleLiveGO2:SetActive(true) self:PlaySpineAnim(self.RoleLiveGOGraphic2, 0, "touch", false) self:DelayFunc(1, function() self.RoleLiveGO2:SetActive(false) if self.camp == 0 then self.RootPanel.mySkillCast:SetActive(false) else self.RootPanel.enemySkillCast:SetActive(false) end if func then func() func = nil end end) end local FullEffectPosition = { My_All = Vector3.New(0, -566, 0), My_Front = Vector3.New(-120, -410, 0), My_Behind = Vector3.New(20, -760, 0), My_COL_1 = Vector3.New(-300, -566, 0), My_COL_2 = Vector3.New(0, -566, 0), My_COL_3 = Vector3.New(300, -566, 0), Enemy_All = Vector3.New(0, 430, 0), Enemy_Front = Vector3.New(-100, 340, 0), Enemy_Behind = Vector3.New(50, 540, 0), Enemy_COL_1 = Vector3.New(-300, 430, 0), Enemy_COL_2 = Vector3.New(0, 430, 0), Enemy_COL_3 = Vector3.New(300, 430, 0), } function RoleView:GetEffectSPostion(skill) local chooseId = skill.effectList.buffer[1].chooseId local chooseLimit = math.floor(chooseId / 10000) % 10 local targets = skill:GetDirectTargets() local targetPos = targets[1].position if chooseLimit == 3 then local col = (targetPos-1) % 3 + 1 return self.camp == 0 and FullEffectPosition["My_COL_"..col] or FullEffectPosition["Enemy_COL_"..col] else return self.camp == 0 and FullEffectPosition.My_All or FullEffectPosition.Enemy_All end end function RoleView:GetEffectPosition(skill) local chooseId = skill.effectList.buffer[1].chooseId local chooseLimit = math.floor(chooseId / 10000) % 10 local targets = skill:GetDirectTargets() local targetCamp = targets[1].camp local targetPos = targets[1].position if chooseLimit == 0 then return targetCamp == 0 and FullEffectPosition.My_All or FullEffectPosition.Enemy_All elseif chooseLimit == 1 or chooseLimit == 2 then if targetCamp == 0 then return targetPos <= 3 and FullEffectPosition.My_Front or FullEffectPosition.My_Behind else return targetPos <= 3 and FullEffectPosition.Enemy_Front or FullEffectPosition.Enemy_Behind end elseif chooseLimit == 3 then local col = (targetPos-1) % 3 + 1 return targetCamp == 0 and FullEffectPosition["My_COL_"..col] or FullEffectPosition["Enemy_COL_"..col] end end -- 检测特效旋转 function RoleView:CheckRotate(go, orientation) -- 判断是否旋转 if orientation==nil then -- body return false end local isR = orientation[1] and orientation[1][1] or 0 local rt = orientation[2] rt = rt and Vector3.New(rt[1], rt[2], rt[3]) or Vector3.zero if (self.camp == 0 and isR == 1) or (self.camp == 1 and isR == 2) then go.transform.localRotation = rt return true end go.transform.localRotation = Vector3.zero end -- 检测是否需要释放全屏技能 function RoleView:CheckFullSceenSkill(combat, skill) if not skill then return end -- 指定目标弹道特效 if combat.EffectType == 1 then local targets = skill:GetDirectTargets() for _, target in ipairs(targets) do self:RoleViewBullet(combat, target) end -- 全屏特效 elseif combat.EffectType == 2 then local path = combat.Bullet if path then local pos = self:GetEffectPosition(skill) if not pos then return end -- 特效的偏移量 local offset = combat.Offset and Vector3.New(combat.Offset[1], combat.Offset[2], 0) or Vector3.zero -- local go = loadAsset(path, self.RootPanel.skillEffectRoot:GetComponent("Canvas").sortingOrder) -- 检测特效旋转 if self:CheckRotate(go, combat.Orientation) then offset = -offset end go.transform:SetParent(self.RootPanel.skillEffectRoot.transform) go.transform.localScale = Vector3.one go.transform.localPosition = pos + offset go:SetActive(true) self:AddDelayRecycleRes(path, go, 4) end -- 全屏弹道特效 elseif combat.EffectType == 3 then local path = combat.Bullet if path then local spos = self:GetEffectSPostion(skill) local tpos = self:GetEffectPosition(skill) if not spos or not tpos then return end -- 时间 local duration = combat.BulletTime/1000 -- 特效的偏移量 local offset = combat.Offset and Vector3.New(combat.Offset[1], combat.Offset[2], 0) or Vector3.zero local go = loadAsset(path, self.RootPanel.skillEffectRoot:GetComponent("Canvas").sortingOrder) go.transform:SetParent(self.RootPanel.skillEffectRoot.transform) -- 检测特效旋转 if self:CheckRotate(go, combat.Orientation) then offset = -offset end go.transform.localPosition = spos + offset go.transform.localScale = Vector3.one go:SetActive(true) self:AddDelayRecycleRes(path, go, duration) if self.fullBulletTween then self.fullBulletTween:Kill() end self.fullBulletTween = go.transform:DOLocalMove(tpos + offset, duration):SetEase(Ease.OutSine) -- :OnComplete(function() -- go:SetActive(false) -- end) end -- 指定目标特效 elseif combat.EffectType == 4 then local targets = skill:GetDirectTargets() for _, target in ipairs(targets) do local tv = self.RootPanel.GetRoleView(target) if tv then local offset = combat.Offset and Vector3.New(combat.Offset[1], combat.Offset[2], 0) or Vector3.zero local sortingOrder = tv.role.camp == 0 and tv.GameObject:GetComponent("Canvas").sortingOrder + 21 or nil local go2 = loadAsset(combat.Bullet, sortingOrder) go2.transform:SetParent(tv.GameObject.transform.parent) -- 检测特效旋转 if self:CheckRotate(go2, combat.Orientation) then offset = -offset end go2.transform.localScale = Vector3.one go2.transform.localPosition = Vector3.zero go2.transform.anchoredPosition = offset go2.transform:SetParent(self.RootPanel.skillEffectRoot.transform) go2:SetActive(true) self:AddDelayRecycleRes(combat.Bullet, go2, 4) end end -- 全屏特效屏幕中心 elseif combat.EffectType == 5 then local offset = combat.Offset and Vector3.New(combat.Offset[1], combat.Offset[2], 0) or Vector3.zero local sortingOrder = self.RootPanel.skillEffectRoot:GetComponent("Canvas").sortingOrder local go2 = loadAsset(combat.Bullet, sortingOrder) go2.transform:SetParent(self.RootPanel.skillEffectRoot.transform) -- 检测特效旋转 if self:CheckRotate(go2, combat.Orientation) then offset = -offset end go2.transform.localScale = Vector3.one go2.transform.localPosition = Vector3.zero go2.transform.anchoredPosition = offset go2:SetActive(true) self:AddDelayRecycleRes(combat.Bullet, go2, 4) end -- 取消高亮 self:DelayFunc(combat.KeyFrame/1000, function() self:CheckSkillHitEffect("skill", combat, skill) self:checkShake(combat) end) end -- 检测前摇技能释放 function RoleView:CheckSkillForoleEffect(combat, skill) if not skill then return end if not combat.BeforeBullet or combat.BeforeBullet == "" then return end local go local path = combat.BeforeBullet local offset = combat.BeforeOffset and Vector3.New(combat.BeforeOffset[1], combat.BeforeOffset[2], 0) or Vector3.zero -- 挂在人身上,以人物中心为原点 if combat.BeforeEffectType == 1 then local sortingOrder if self.camp == 0 then sortingOrder = self.GameObject:GetComponent("Canvas").sortingOrder end go = loadAsset(path, sortingOrder) go.transform:SetParent(self.GameObject.transform) -- 屏幕中心 elseif combat.BeforeEffectType == 2 then local sortingOrder = self.RootPanel.skillEffectRoot:GetComponent("Canvas").sortingOrder go = loadAsset(path, sortingOrder) go.transform:SetParent(self.RootPanel.skillEffectRoot.transform) end -- 检测特效旋转 if self:CheckRotate(go, combat.BeforeOrientation) then offset = -offset end go.transform.localScale = Vector3.one go.transform.localPosition = Vector3.zero go.transform.anchoredPosition = offset go:SetActive(true) self:AddDelayRecycleRes(path, go, 4) end -- 检测技能命中特效显示 function RoleView:CheckSkillHitEffect(checkType, combat, skill) if not combat then return end if checkType == "skill" then -- 释放技能时检测,如果是范围命中效果 if combat.HitEffectType == 2 and combat.Hit then local targets = skill:GetDirectTargets() if not targets or not targets[1] or targets[1]:IsDead() then return end local tv = self.RootPanel.GetRoleView(targets[1]) if not tv then return end local tpos = self:GetEffectPosition(skill) if not tpos then return end -- 特效的偏移量 local offset = combat.HitOffset and Vector3.New(combat.HitOffset[1], combat.HitOffset[2], 0) or Vector3.zero local sortingOrder = tv.role.camp == 0 and tv.GameObject:GetComponent("Canvas").sortingOrder + 21 or nil local go = loadAsset(combat.Hit, sortingOrder) go.transform:SetParent(self.RootPanel.skillEffectRoot.transform) -- 检测特效旋转 if self:CheckRotate(go, combat.HitOrientation) then offset = -offset end go.transform.localScale = Vector3.one go.transform.localPosition = tpos + offset go:SetActive(true) self:AddDelayRecycleRes(combat.Hit, go, 5) end elseif checkType == "hit" then -- 被击中时检测,如果是目标命中 if combat.HitEffectType == 1 and combat.Hit then local offset = combat.HitOffset and Vector3.New(combat.HitOffset[1], combat.HitOffset[2], 0) or Vector3.zero local sortingOrder = self.role.camp == 0 and self.GameObject:GetComponent("Canvas").sortingOrder + 21 or nil local go2 = loadAsset(combat.Hit, sortingOrder) go2.transform:SetParent(self.GameObject.transform.parent) -- 检测特效旋转 if self:CheckRotate(go2, combat.HitOrientation) then offset = -offset end go2.transform.localScale = Vector3.one go2.transform.localPosition = Vector3.zero--self.GameObject.transform.localPosition + Vector3.New(0, self.BuffFloatingCount * 180, 0) go2.transform.anchoredPosition = offset--Vector2.zero go2.transform:SetParent(self.RootPanel.skillEffectRoot.transform) go2:SetActive(true) self:AddDelayRecycleRes(combat.Hit, go2, 5) end end end -- 检测是否需要震动屏幕 function RoleView:checkShake(combat) if combat.ShockScreen == 1 then self.RootPanel:SetShake() end end --弹道轨迹 local plist = { [1] = { Vector2.New(0.2, 0.9), }, [2] = { Vector2.New(1.12, 0.33), Vector2.New(-0.15, 0.67), }, [3] = { Vector2.New(0.9, 0.2), }, } -- 播放弹道特效 function RoleView:RoleViewBullet(combat, target) if not self.RootPanel.GetRoleView(target) then return end if not combat then return end local duration = combat.BulletTime/1000 local bulletEffect = combat.Bullet if not bulletEffect or bulletEffect == "" or duration == 0 then return end local go = loadAsset(bulletEffect, self.RootPanel.skillEffectRoot:GetComponent("Canvas").sortingOrder) go.transform:SetParent(self.RootPanel.skillEffectRoot.transform) go.transform.localScale = Vector3.one go.transform.position = self.GameObject.transform.position Util.ClearTrailRender(go) go:SetActive(true) local startV3 = go.transform.position local endV3 = self.RootPanel.GetRoleView(target).GameObject.transform.position local startV2 = Vector2.New(0, 0) local endV2 = Vector2.New(1, 1) local pL = plist[math.random(1, #plist)] --飞行子弹轨迹 DoTween.To( DG.Tweening.Core.DOGetter_float( function () return 0 end), DG.Tweening.Core.DOSetter_float(function (progress) local v2 = Bezier.CalPos(progress, startV2, endV2, pL) go.transform.position = Vector3.New(startV3.x * (1-v2.x) + endV3.x * v2.x, startV3.y * (1-v2.y) + endV3.y * v2.y, startV3.z) end), 1, duration) :SetEase(Ease.InQuad) :OnComplete(function () poolManager:UnLoadAsset(bulletEffect, go, PoolManager.AssetType.GameObject) end) end -- aoe function RoleView:OnAOE(camp) local path if self.role.roleData.roleId > 10000 then if camp == self.camp then path = RoleConfig[self.role.roleData.roleId].aoe1 else path = RoleConfig[self.role.roleData.roleId].aoe2 end else if camp == self.camp then path = MonsterViewConfig[self.role.roleData.roleId].aoe1 else path = MonsterViewConfig[self.role.roleData.roleId].aoe2 end end local go = loadAsset(path) go.transform:SetParent(self.RootPanel.transform) go.transform.localScale = Vector3.one if camp == 0 then go.transform.localPosition = Vector3.New(0,-674,0) else go.transform.localPosition = Vector3.New(0,100,0) end go:SetActive(true) self:AddDelayRecycleRes(path, go, 3) end -- 治疗 function RoleView:OnTreated(castRole, realTreat, treat) self:ArtFloating(ArtFloatingType.Treat, ArtFloatingColor.Green, treat) local sortingOrder = self.role.camp == 0 and self.GameObject:GetComponent("Canvas").sortingOrder + 21 or nil local go = loadAsset(healEffect, sortingOrder) go.transform:SetParent(self.GameObject.transform) go.transform.localScale = Vector3.one go.transform.localPosition = Vector3.zero--self.GameObject.transform.localPosition go:SetActive(true) self:AddDelayRecycleRes(healEffect, go, 3) end -- 盾效果触发 function RoleView:OnShieldTrigger(shield) if shield.shieldType == ShieldTypeName.AllReduce then self:ImageBuffFloating("z_zhandou_wudizi") else self:TextBuffFloating(TextFloatingColor.Blue, Language[10275]) end end -- 哈哈,没打着 function RoleView:OnBeHitMiss(atkRole, skill) self:TextBuffFloating(TextFloatingColor.Blue, Language[12218]) end local DotTypeTip = { [0] = Language[10276], [1] = Language[10277], [2] = Language[10278], [3] = Language[10279], } -- function RoleView:OnDamaged(atkRole, dmg, bCrit, finalDmg, damageType, dotType, skill) if skill and skill.continueTime > 0 and skill.attackCount > 1 then local space = skill.continueTime / skill.attackCount local count = skill.attackCount local d = math.floor(dmg/count) -- 如果平均伤害小于0 则 if d == 0 then d = dmg count = 1 end if count ~= 1 then -- 后续伤害延迟打出 self:LoopFunc(space, count - 1, function() self:OnceDamaged(atkRole, d, bCrit, finalDmg, damageType, dotType, skill) end) -- 立刻打出第一次伤害 local fd = dmg - d *(count - 1) self:OnceDamaged(atkRole, fd, bCrit, finalDmg, damageType, dotType, skill) else self:OnceDamaged(atkRole, dmg, bCrit, finalDmg, damageType, dotType, skill) end else self:OnceDamaged(atkRole, dmg, bCrit, finalDmg, damageType, dotType, skill) end end -- function RoleView:OnceDamaged(atkRole, dmg, bCrit, finalDmg, damageType, dotType, skill) --王振兴注释,为了解决英雄死亡多段伤害显示不完整 2020/8/17 --if self.isDead then return end if dotType then if dotType == DotType.Poison then self:ArtFloating(ArtFloatingType.PoisonDamage, ArtFloatingColor.Poison, dmg) elseif dotType == DotType.Burn then self:ArtFloating(ArtFloatingType.FireDamage, ArtFloatingColor.Fire, dmg) else self:TextBuffFloating(2, DotTypeTip[dotType]..dmg) end else if bCrit then -- 暴击红色并显示暴击 self:ArtFloating(ArtFloatingType.CritDamage, ArtFloatingColor.Red, dmg) else if atkRole.isTeam then -- 异妖紫色 self:ArtFloating(ArtFloatingType.Damage, ArtFloatingColor.Purple, dmg) else if skill and skill.type == BattleSkillType.Special then -- 技能黄色 self:ArtFloating(ArtFloatingType.Damage, ArtFloatingColor.Yellow, dmg) else -- 普攻白色 self:ArtFloating(ArtFloatingType.Damage, ArtFloatingColor.White, dmg) end end end end if self.camp == 0 then -- 卡面变红 DoTween.To(DG.Tweening.Core.DOGetter_float( function () return 1 end), DG.Tweening.Core.DOSetter_float(function (progress) local color = Color.New(1, progress, progress, 1) Util.SetColor(self.GameObject, color) Util.SetColor(self.RoleLiveGOGraphic, color) end), 0, 0.3):SetEase(Ease.Linear):OnComplete(function() DoTween.To(DG.Tweening.Core.DOGetter_float( function () return 0 end), DG.Tweening.Core.DOSetter_float(function (progress) local color = Color.New(1, progress, progress, 1) Util.SetColor(self.GameObject, color) Util.SetColor(self.RoleLiveGOGraphic, color) end), 1, 0.1):SetEase(Ease.Linear) end) self.GameObject.transform.parent:DOShakeAnchorPos(0.3, Vector2.New(200, 100), 100, 50, false, true):OnComplete(function () self.GameObject.transform.parent.anchoredPosition = Vector2.New(self.role.position == 1 and -145 or 0, -221) end) else self.RoleLiveGOTran:DOShakeAnchorPos(0.3, Vector2.New(200, 100), 100, 50, false, true):OnComplete(function () self.RoleLiveGO.transform.anchoredPosition = Vector2.New(self.outOffset[1], self.outOffset[2] ) end) self.RoleLiveGOGraphic:DOColor(Color.New(1,0,0,1), 0.3):OnComplete(function () self.RoleLiveGOGraphic:DOColor(Color.New(1,1,1,1), 0.1) end) end -- 受击放大1.2倍 self:DoScale(1.2, 0.3, function() self:DoScale(1, 0.1) end) -- 播放受击动画 self:PlaySpineAnim(self.RoleLiveGOGraphic, 0, "hit", false) -- 播放受击特效 if atkRole.isTeam then local teamSkillHitEffect = PokemonEffectConfig[atkRole.curSkill.teamSkillType].hit1 if teamSkillHitEffect then if Time.realtimeSinceStartup - self.LastBuffFloatingTime < 0.5 then self.BuffFloatingCount = self.BuffFloatingCount + 1 else self.BuffFloatingCount = 0 end self.LastBuffFloatingTime = Time.realtimeSinceStartup local go2 = loadAsset(teamSkillHitEffect) go2.transform:SetParent(self.GameObject.transform) go2.transform.localScale = Vector3.one go2.transform.localPosition = self.GameObject.transform.localPosition + Vector3.New(0, self.BuffFloatingCount * 180, 0) go2.transform:SetParent(self.RootPanel.skillEffectRoot.transform) go2:SetActive(true) self:AddDelayRecycleRes(teamSkillHitEffect, go2, 3) end elseif skill then local combat = BattleManager.GetSkillCombat(SkillLogicConfig[skill.id].SkillDisplay) self:CheckSkillHitEffect("hit", combat, skill) end end function RoleView:OnHealed(castRole) local sortingOrder = self.role.camp == 0 and self.GameObject:GetComponent("Canvas").sortingOrder + 21 or nil local go = loadAsset(healEffect, sortingOrder) go.transform:SetParent(self.GameObject.transform) go.transform.localScale = Vector3.one go.transform.localPosition = Vector3.zero--self.GameObject.transform.localPosition go:SetActive(true) self:AddDelayRecycleRes(healEffect, go, 3) end function RoleView:OnRoleCDChanged() local go = loadAsset(cdChangedEffect) go.transform:SetParent(self.GameObject.transform) go.transform.localScale = Vector3.one go.transform.localPosition = self.GameObject.transform.localPosition go:SetActive(true) self:AddDelayRecycleRes(cdChangedEffect, go, 3) end local BuffTypeToConfigType = { [BuffName.PropertyChange] = 1, [BuffName.Control] = 2, [BuffName.DOT] = 3, [BuffName.HOT] = 4, [BuffName.Shield] = 5, [BuffName.Immune] = 6, [BuffName.Curse] = 7, } function RoleView:GetPropChangeBuffCType(pName) for cType, pn in ipairs(BattlePropList) do if pn == pName then return cType end end end function RoleView:GetBuffEffectConfig(buff) local bType = buff.type local cType = 1 if bType == BuffName.PropertyChange then cType = self:GetPropChangeBuffCType(buff.propertyName) elseif bType == BuffName.HOT then cType = 1 elseif bType == BuffName.DOT then cType = buff.damageType elseif bType == BuffName.Brand then cType = buff.flag elseif bType == BuffName.Control then cType = buff.ctrlType elseif bType == BuffName.Shield then cType = buff.shieldType -- 无敌吸血盾特殊判断 if cType == ShieldTypeName.AllReduce and buff.shieldValue ~= 0 then cType = 4 end elseif bType == BuffName.Immune then cType = buff.immuneType elseif bType == BuffName.Curse then cType = buff.curseType end local type = BuffTypeToConfigType[bType] local config = ConfigManager.TryGetConfigDataByDoubleKey(ConfigName.BuffEffectConfig, "Type", type, "CType", cType) return config end -- 加载并播放动画 function RoleView:AddBuffEffect(buffName, isTrigger, offset) if not buffName or buffName == "" then return end if not self.BuffEffectList then self.BuffEffectList = {} end if not self.BuffEffectList[buffName] then self.BuffEffectList[buffName] = {} self.BuffEffectList[buffName].node = nil self.BuffEffectList[buffName].count = 0 end -- if not self.BuffEffectList[buffName].node then local sortingOrder if self.camp == 0 then sortingOrder = self.GameObject:GetComponent("Canvas").sortingOrder end local node = loadAsset(buffName, sortingOrder) -- node.transform:SetParent(self.RootPanel.transform) -- node.transform.localScale = Vector3.one node.transform:SetParent(self.GameObject.transform) node.transform.localScale = Vector3.one node.transform.localPosition = offset and Vector3.New(offset[1], offset[2], 0) or Vector3.zero--self.GameObject.transform.localPosition self.BuffEffectList[buffName].node = node end self.BuffEffectList[buffName].node:SetActive(false) self.BuffEffectList[buffName].node:SetActive(true) -- 触发特效不计数 if not isTrigger then self.BuffEffectList[buffName].count = self.BuffEffectList[buffName].count + 1 end end -- 卸载动画 function RoleView:RemoveBuffEffect(buffName) if not buffName or buffName == "" then return end if not self.BuffEffectList then return end if not self.BuffEffectList[buffName] then return end if not self.BuffEffectList[buffName].node then return end -- 节点存在,数量不存在直接回收 if not self.BuffEffectList[buffName].count then poolManager:UnLoadAsset(buffName, self.BuffEffectList[buffName].node, PoolManager.AssetType.GameObject) self.BuffEffectList[buffName] = nil return end -- 引用数量减1 self.BuffEffectList[buffName].count = self.BuffEffectList[buffName].count - 1 if self.BuffEffectList[buffName].count <= 0 then poolManager:UnLoadAsset(buffName, self.BuffEffectList[buffName].node, PoolManager.AssetType.GameObject) self.BuffEffectList[buffName] = nil return end end -- 卸载所有动画 function RoleView:RemoveAllBuffEffect() if not self.BuffEffectList then return end for name, v in pairs(self.BuffEffectList) do poolManager:UnLoadAsset(name, v.node, PoolManager.AssetType.GameObject) end self.BuffEffectList = {} end -- function RoleView:AddBuffIcon(buff, icon) if not buff or not icon or icon == "" then return end if not self.BuffIconList then self.BuffIconList = {} end if not self.BuffIconList[buff.id] then local buffGO = BattlePool.GetItem(self.buffRoot.transform, BATTLE_POOL_TYPE.BUFF_VIEW) buffGO.transform.localScale = Vector3.one buffGO.transform.localPosition = Vector3.zero buffGO:SetActive(true) self.BuffIconList[buff.id] = BuffView.New(buffGO, buff, icon) else self.BuffIconList[buff.id].count = self.BuffIconList[buff.id].count + 1 self.BuffIconList[buff.id]:SetCount() end end function RoleView:RemoveBuffIcon(buff) if not buff then return end if not self.BuffIconList then return end if self.BuffIconList[buff.id] then self.BuffIconList[buff.id]:Dispose() self.BuffIconList[buff.id] = nil end end -- 卸载所有动画 function RoleView:RemoveAllBuffIcon() if not self.BuffIconList then return end for id, v in pairs(self.BuffIconList) do v:Dispose() end self.BuffIconList = {} end function RoleView:OnBuffStart(buff) -- 临时显示 if buff.type == BuffName.NoDead then self:TextBuffFloating(2, Language[10280]) return end local eConfig = self:GetBuffEffectConfig(buff) if not eConfig then return end if buff.type == BuffName.PropertyChange then if buff.changeType == 1 or buff.changeType == 2 then self:AddBuffEffect(eConfig.Hit) self:AddBuffEffect(eConfig.Continue, false, eConfig.ContinueOffset) self:TextBuffFloating(eConfig.DescColorType, eConfig.Describe..Language[10281]) self:AddBuffIcon(buff, eConfig.Icon) SoundManager.PlaySound(SoundConfig.Sound_Buff) else self:AddBuffEffect(eConfig.DHit) self:AddBuffEffect(eConfig.DContinue) self:TextBuffFloating(eConfig.DDescColorType, eConfig.Describe..Language[10282]) self:AddBuffIcon(buff, eConfig.DIcon) SoundManager.PlaySound(SoundConfig.Sound_DeBuff) end else self:AddBuffEffect(eConfig.Hit) self:AddBuffEffect(eConfig.Continue, false, eConfig.ContinueOffset) if eConfig.DescribeIcon and eConfig.DescribeIcon ~= "" then self:ImageBuffFloating(eConfig.DescribeIcon) else self:TextBuffFloating(eConfig.DescColorType, eConfig.Describe) end self:AddBuffIcon(buff, eConfig.Icon) end end -- function RoleView:OnBuffDodge(buff) if buff.type == BuffName.Control and buff.caster.camp ~= self.camp then self:ImageBuffFloating("z_zhandou_dikangzi") end end -- 怒气值改变 function RoleView:RoleRageChange(deltaRage) if deltaRage ~= 0 then if deltaRage > 0 then -- self:ImageBuffFloating("z_zhandou_nuqijia", "z_zhandou_nuqijia_"..deltaRage) self:ImageBuffFloating("z_zhandou_nuqijia", nil, deltaRage) -- local go = loadAsset(rageEffect) -- go.transform:SetParent(self.GameObject.transform) -- go.transform.localScale = Vector3.one -- go.transform.localPosition = Vector3.zero -- go:SetActive(true) -- self:AddDelayRecycleRes(healEffect, go, 3) else self:TextBuffFloating(1, Language[10283]..tostring(deltaRage)) end end end -- function RoleView:OnBuffRoundChange(buff) if self.BuffIconList[buff.id] then self.BuffIconList[buff.id]:SetRound(buff) end end function RoleView:OnBuffCover(buff) if self.BuffIconList[buff.id] then self.BuffIconList[buff.id]:SetLayer(buff) end end function RoleView:OnBuffTrigger(buff) local eConfig = self:GetBuffEffectConfig(buff) if not eConfig then return end if buff.type == BuffName.PropertyChange then if buff.changeType == 1 or buff.changeType == 2 then self:AddBuffEffect(eConfig.Trigger, true) else self:AddBuffEffect(eConfig.DTrigger, true) end else self:AddBuffEffect(eConfig.Trigger, true) end end function RoleView:OnBuffEnd(buff) -- 临时显示 if buff.type == BuffName.NoDead then return end local eConfig = self:GetBuffEffectConfig(buff) if not eConfig then return end if buff.type == BuffName.PropertyChange then if buff.changeType == 1 or buff.changeType == 2 then self:RemoveBuffEffect(eConfig.Hit) self:RemoveBuffEffect(eConfig.Continue) self:RemoveBuffEffect(eConfig.Trigger) self:RemoveBuffIcon(buff, eConfig.Icon) else self:RemoveBuffEffect(eConfig.DHit) self:RemoveBuffEffect(eConfig.DContinue) self:RemoveBuffEffect(eConfig.DTrigger) self:RemoveBuffIcon(buff, eConfig.DIcon) end else self:RemoveBuffEffect(eConfig.Hit) self:RemoveBuffEffect(eConfig.Continue) self:RemoveBuffEffect(eConfig.Trigger) self:RemoveBuffIcon(buff, eConfig.Icon) end end function RoleView:OnDead() if self.hpTween then self.hpTween:Kill() end if self.hpPassTween then self.hpPassTween:Kill() end self.hpSlider.fillAmount = 0 self.hpPassSlider.fillAmount = 0 self.rageSlider.fillAmount = 0 self.rageText.text = "" end -- 暴毙 function RoleView:onBeSecKill() self:TextBuffFloating(TextFloatingColor.Red, Language[10284]) end function RoleView:OnRealDead() if self.camp == 0 then Util.SetGray(self.RoleIconGO, true) self.effect_dead:SetActive(true) self.effect_rage:SetActive(false) else self.effect_rage:SetActive(false) self.effect_dead:SetActive(true) self.RoleLiveGO:SetActive(true) local order = BattleLogic.CurOrder BattleManager.PauseBattle() self.RoleLiveGOGraphic:DOFade(1, 0):OnComplete(function () self.RoleLiveGOGraphic:DOFade(0, 1):OnComplete(function () BattleManager.ResumeBattle() self.RoleLiveGOGraphic.color = Color.New(1,1,1,1) if order ~= BattleLogic.CurOrder then return end self.GameObject:SetActive(false) self.RoleLiveGO:SetActive(false) self.effect_dead:SetActive(false) if self.shadow then self.shadow:SetActive(false) end end) end) end self.deadIconGO:SetActive(true) -- Util.SetGray(self.GameObject, true) -- Util.SetSpineGray(self.RoleLiveGOGraphic, true) local color = Color.New(75, 75, 75, 255)/255 Util.SetColor(self.GameObject, color) Util.SetColor(self.RoleLiveGOGraphic, color) Util.SetGray(self.deadIconGO, false) -- if self.hlTween then -- self.hlTween:Kill() -- end -- self.hlTween = self.GameObject.transform.parent:DOScale(Vector3.one * 0.8, 0.2) -- 回收所有buff相关效果 self:RemoveAllBuffEffect() self:RemoveAllBuffIcon() self.RoleLiveGOGraphic.freeze = true self.RoleLiveGOGraphic2.freeze = true self.isDead = true end function RoleView:onRoleRelive() if self.camp == 0 then Util.SetGray(self.RoleIconGO, false) else self.effect_dead:SetActive(false) self.GameObject:SetActive(true) self.RoleLiveGO:SetActive(true) if self.shadow then self.shadow:SetActive(true) end end self.deadIconGO:SetActive(false) local color = Color.New(1, 1, 1, 1) Util.SetColor(self.GameObject, color) Util.SetColor(self.RoleLiveGOGraphic, color) Util.SetGray(self.GameObject, false) Util.SetSpineGray(self.RoleLiveGOGraphic, false) self:DoScale(1, 0) self.RoleLiveGOGraphic.freeze = false self.RoleLiveGOGraphic2.freeze = false self.isDead = false -- self:TextBuffFloating(4, Language[10285]) end function RoleView:OnEnd() self.isPlay = false end function RoleView:OrderStart() self.isPlay = true end function RoleView:Dispose() -- if self.trigger then -- self.trigger.onPointerClick = self.trigger.onPointerClick - self._onPointerClick -- self.trigger.onEndDrag = self.trigger.onEndDrag - self._onEndDrag -- end -- 清空所有延迟方法 self:ClearDelayFunc() self:ClearLoopFunc() self.GameObject.transform.parent.localScale = Vector3.one --立即回收延迟列表上的资源 for k, v in pairs(self.delayRecycleList) do for i=1, #v do poolManager:UnLoadAsset(k, v[i], PoolManager.AssetType.GameObject) end self.delayRecycleList[k] = nil end -- 回收所有buff相关效果 self:RemoveAllBuffEffect() self:RemoveAllBuffIcon() -- Util.SetSpineGray(self.RoleLiveGOGraphic, false) Util.SetSpineGray(self.RoleLiveGOGraphic2, false) Util.SetColor(self.RoleLiveGOGraphic, Color.New(1, 1, 1, 1)) Util.SetColor(self.RoleLiveGOGraphic2, Color.New(1, 1, 1, 1)) self.RoleLiveGOGraphic.freeze = false self.RoleLiveGOGraphic2.freeze = false if self.camp == 1 then poolManager:UnLoadLive(self.livePath, self.RoleLiveGO) end poolManager:UnLoadLive(self.livePath, self.RoleLiveGO2) -- 父节点归位 if self.camp == 0 then -- self.GameObject.transform.parent:SetParent(Util.GetTransform(self.RootPanel.PlayerPanel.transform, "View/"..self.role.position)) -- local battleSorting = BattleManager.GetBattleSorting() -- self.GameObject:GetComponent("Canvas").sortingOrder = battleSorting + 10 -- self.GameObject.transform.parent.localScale = Vector3.one -- if self.role.position == 1 then -- self.GameObject.transform.parent.localPosition = Vector3.New(-145, -221, 0) -- else -- self.GameObject.transform.parent.localPosition = Vector3.New(0, -221, 0) -- end end -- 回收本节点 BattlePool.RecycleItem(self.GameObject, self.camp == 0 and BATTLE_POOL_TYPE.MY_ROLE or BATTLE_POOL_TYPE.ENEMY_ROLE) end