require("Base/BasePanel") require("Modules.Battle.Config.PokemonEffectConfig") local FEAConfig = require("Modules/Battle/Config/FightEffectAudioConfig") local RoleShowView = require("Modules/Battle/View/BattleRoleShowView") local BattleView = {} local this = BattleView --敌军站位分布 --敌军站位根节点Y坐标 local posY = 400 local posOffset = 0 local tbRole = {} local tbRoleDispose = {} local playerHP = 0 local playerMaxHP = 0 local enemyHP = 0 local enemyMaxHP = 0 local playerTmpHp local enemyTmpHp local delayRecycleList = {} local LastDebugTime -- 点击调试键的时间间隔需要大于0.1秒 local scene = { "r_zhandou_changjing016", "r_zhandou_changjing016", "r_zhandou_changjing016", } local loadAsset = function(path) local go = poolManager:LoadAsset(path, PoolManager.AssetType.GameObject) local layer = tonumber(go.name) or 0 local battleSorting = BattleManager.GetBattleSorting() Util.AddParticleSortLayer(go, battleSorting - layer) go.name = tostring(battleSorting) --- 播放音效 local audioData = FEAConfig.GetAudioData(path) if audioData then SoundManager.PlaySound(audioData.name) end return go end --所有需要延迟回收的资源走该接口,当回调执行前界面已被销毁时,不会报错 local addDelayRecycleRes = function(path, go, recycleTime, delayFunc, delayTime) if not delayRecycleList[path] then delayRecycleList[path] = {} end table.insert(delayRecycleList[path], go) if delayTime and delayTime < recycleTime then Timer.New(delayFunc, delayTime):Start() Timer.New(function () if not delayRecycleList[path] then return end go:SetActive(false) for i=1, #delayRecycleList[path] do if delayRecycleList[path][i] == go then poolManager:UnLoadAsset(path, go, PoolManager.AssetType.GameObject) table.remove(delayRecycleList[path], i) break end end end, recycleTime):Start() else Timer.New(function () if not delayRecycleList[path] then return end go:SetActive(false) for i=1, #delayRecycleList[path] do if delayRecycleList[path][i] == go then poolManager:UnLoadAsset(path, go, PoolManager.AssetType.GameObject) table.remove(delayRecycleList[path], i) break end end if delayFunc then delayFunc() end end, recycleTime):Start() end end function this:InitComponent(root) -- body this.root = root this.gameObject = root.gameObject this.transform = root.transform this.BG = Util.GetGameObject(self.gameObject, "BG") this.LastBG = Util.GetGameObject(self.gameObject, "LastBG") this.BuffItem = Util.GetGameObject(this.gameObject, "BuffIcon") this.RoleItem = Util.GetGameObject(this.gameObject, "Role") this.EnemyItem = Util.GetGameObject(this.gameObject, "Enemy") this.EnemyItem2 = Util.GetGameObject(this.gameObject, "Enemy2") this.UpRoot = Util.GetGameObject(this.gameObject, "UpRoot") this.DownRoot = Util.GetGameObject(this.gameObject, "DownRoot") this.DiffMonster = Util.GetGameObject(this.DownRoot, "teamSkill") this.DiffMonsterFlag = false this.DiffMonsterSlider = Util.GetGameObject(this.DiffMonster, "slider"):GetComponent("Image") this.DiffMonsterIcon = Util.GetGameObject(this.DiffMonster, "icon"):GetComponent("Image") this.EnemyDiffMonster = Util.GetGameObject(this.UpRoot, "teamSkill") this.EnemyDiffMonsterFlag = false this.EnemyDiffMonsterSlider = Util.GetGameObject(this.EnemyDiffMonster, "slider"):GetComponent("Image") this.EnemyDiffMonsterIcon = Util.GetGameObject(this.EnemyDiffMonster, "icon"):GetComponent("Image") Util.GetGameObject(this.UpRoot, "EnemyHP"):SetActive(false) Util.GetGameObject(this.DownRoot, "PlayerHP"):SetActive(false) this.EnemyHP = Util.GetGameObject(this.UpRoot, "EnemyHP/hp"):GetComponent("Image") this.EnemyHPTxt = Util.GetGameObject(this.UpRoot, "EnemyHP/Text"):GetComponent("Text") this.PlayerHP = Util.GetGameObject(this.DownRoot, "PlayerHP/hp"):GetComponent("Image") this.PlayerHPTxt = Util.GetGameObject(this.DownRoot, "PlayerHP/Text"):GetComponent("Text") this.PlayerPanel = Util.GetGameObject(self.gameObject, "RolePanel") this.EnemyPanel = Util.GetGameObject(self.gameObject, "EnemyPanel") this.FirstEffect = Util.GetGameObject(this.gameObject, "Start") this.ThirdEffect = Util.GetGameObject(this.gameObject, "Third") this.skillEffectRoot = Util.GetGameObject(this.gameObject, "skillEffectRoot") this.Cache = Util.GetGameObject(this.gameObject, "cache") this.enemySkillCast = Util.GetGameObject(this.transform, "EnemySkillCast") this.enemySkillCastRoot = Util.GetGameObject(this.transform, "EnemySkillCast/root") this.mySkillCast = Util.GetGameObject(this.transform, "mySkillCast") this.mySkillCastRoot = Util.GetGameObject(this.transform, "mySkillCast/Canvas/casting_kst/player/player_pos/ui_h_20054_lsy") this.ElementalResonanceView = SubUIManager.Open(SubUIConfig.ElementalResonanceView, self.gameObject.transform) this.ElementalResonanceView2 = SubUIManager.Open(SubUIConfig.ElementalResonanceView, self.gameObject.transform) this.ElementalResonanceView.elementalResonanceBtn:SetActive(false) this.ElementalResonanceView2.elementalResonanceBtn:SetActive(false) -- 初始化角色展示界面 RoleShowView.Init(Util.GetGameObject(this.gameObject, "RoleShow")) end function this:BindEvent() end -- 正常接口 function this:OnOpen(_fightData, _seed, _battleType, _maxRound) this.ElementalResonanceView:OnOpen({sortOrder=BattleManager.GetBattleSorting()}) this.ElementalResonanceView2:OnOpen({sortOrder=BattleManager.GetBattleSorting()}) this:Init() this:SetData(_fightData, _seed, _battleType, _maxRound) end -- 初始化界面 function this:Init() -- 初始化战斗对象池 BattlePool.Init(this.Cache) BattlePool.Register(BATTLE_POOL_TYPE.MY_ROLE, this.RoleItem) BattlePool.Register(BATTLE_POOL_TYPE.ENEMY_ROLE, this.EnemyItem) BattlePool.Register(BATTLE_POOL_TYPE.ENEMY_ROLE_2, this.EnemyItem2) BattlePool.Register(BATTLE_POOL_TYPE.BUFF_VIEW, this.BuffItem) -- 层级 local battleSorting = BattleManager.GetBattleSorting() this.FirstEffect:GetComponent("Canvas").sortingOrder = battleSorting + 30 this.skillEffectRoot:GetComponent("Canvas").sortingOrder = battleSorting + 40 this.mySkillCast:GetComponent("Canvas").sortingOrder = battleSorting + 300 this.enemySkillCast:GetComponent("Canvas").sortingOrder = battleSorting + 300 -- 异妖显示 this.DiffMonster:SetActive(false) this.DiffMonsterFlag = false this.EnemyDiffMonster:SetActive(false) this.EnemyDiffMonsterFlag = false UIManager.camera.clearFlags = CameraClearFlags.Skybox this.InitBattleEvent() end -- 设置数据数据 function this:SetData(_fightData, _seed, _battleType, _maxRound) -- body this.fightData = _fightData this.seed = _seed this.battleType = _battleType or 0 this.maxRound = _maxRound -- if not this.seed then this.seed = math.random(0, 2147483647) LogBlue("随机生成了 随机种子 == ".. this.seed) end if IsOpenBattleDebug then LogWarn(BattleManager.PrintBattleTable(_fightData)) LogWarn(this.seed) LastDebugTime = Time.realtimeSinceStartup end -- 设置角色展示界面数据 RoleShowView.SetData(_fightData) end -- 设置攻击双方的名称 function this:SetNameStr(_nameStr) this.nameStr = _nameStr end -- 开始战斗 function this:StartBattle() -- this.InitBattleData() -- 初始化战斗数据 FixedUpdateBeat:Add(this.OnUpdate, self) -- 预加载资源 poolManager:PreLoadAsset("FloatingText",10, PoolManager.AssetType.GameObject, function() poolManager:PreLoadAsset("BuffFloatingText",10, PoolManager.AssetType.GameObject, function() this.BattleOrderChange(1) end) end) end -- 暂停战斗 function this:PauseBattle() BattleManager.PauseBattle() end -- 继续战斗 function this:ResumeBattle() BattleManager.ResumeBattle() end -- function this:StopBattle() BattleManager.StopBattle() end -- 结束战斗 function this.EndBattle(result) -- 清空数据 this.Clear() -- 加入战斗记录 local battleId = BattleRecordManager.SetBattleRecord(this.maxRound, this.seed, this.battleType, this.fightData) BattleRecordManager.SetBattleBothNameStr(this.nameStr, battleId) -- 战斗结束 this.root.BattleEnd(result) end -- function this.Clear() tbRoleDispose = {} --战斗统计前将roleView收集到该容器中,tbRole清理掉 for _, v in pairs(tbRole) do table.insert(tbRoleDispose, v) end tbRole = {} end -- 初始化战斗数据 function this.InitBattleData() Random.SetSeed(this.seed) --BattleLogic.IsOpenBattleRecord = true BattleLogic.Init(this.fightData, nil, this.maxRound) BattleLogic.Type = this.battleType this.InitBattleEvent() this.EnemyPanel:GetComponent("RectTransform").anchoredPosition = Vector2.New(0, posY) end -- 注册战斗事件 function this.InitBattleEvent() BattleLogic.Event:AddEvent(BattleEventName.AddRole, this.OnAddRole) BattleLogic.Event:AddEvent(BattleEventName.RemoveRole, this.OnRemoveRole) BattleLogic.Event:AddEvent(BattleEventName.BattleEnd, this.EndBattle) BattleLogic.Event:AddEvent(BattleEventName.BattleOrderChange, this.BattleOrderChange) BattleLogic.Event:AddEvent(BattleEventName.BattleRoundChange, this.BattleRoundChange) end -- 清除战斗数据 function this.ClearBattleEvent() BattleLogic.Event:RemoveEvent(BattleEventName.AddRole, this.OnAddRole) BattleLogic.Event:RemoveEvent(BattleEventName.RemoveRole, this.OnRemoveRole) BattleLogic.Event:RemoveEvent(BattleEventName.BattleEnd, this.EndBattle) BattleLogic.Event:RemoveEvent(BattleEventName.BattleOrderChange, this.BattleOrderChange) BattleLogic.Event:RemoveEvent(BattleEventName.BattleRoundChange, this.BattleRoundChange) end --敌军出现的表现 function this.EnemyAppear() SoundManager.PlaySound(SoundConfig.Sound_BattleStart_03) --TODO:动态计算敌军站位 for i=1, 6 do local index = i local enemyLivePos = Util.GetTransform(this.EnemyPanel, "live_"..i) local enemyPos = Util.GetTransform(this.EnemyPanel, tostring(i)) local scale = i > 3 and 0.5 or 0.6--(1 - math.abs(i-pos[1]+posOffset) * 0.15) --敌人依次缩放出现 enemyLivePos:DOScale(Vector3.one * scale * 1.1, 0.7):SetEase(Ease.OutExpo) enemyPos:DOScale(Vector3.one * 1.1, 0.7):SetEase(Ease.OutExpo):OnComplete(function () enemyLivePos:DOScale(Vector3.one * scale, 0.3):SetEase(Ease.InExpo) enemyPos:DOScale(Vector3.one, 0.3):SetEase(Ease.InExpo):OnComplete(function () if index == 4 then -- 提前播放音效 if BattleLogic.CurOrder == 1 then SoundManager.PlaySound(SoundConfig.Sound_BattleStart_04) end elseif index == 6 then local go if BattleLogic.CurOrder == 1 then go = this.FirstEffect elseif BattleLogic.CurOrder == 2 then go = this.FirstEffect elseif BattleLogic.CurOrder == 3 then go = this.ThirdEffect end go:SetActive(true) --显示血条 for r, v in pairs(tbRole) do if r.camp == 0 then playerTmpHp = playerTmpHp + r:GetRoleData(RoleDataName.Hp) else enemyTmpHp = enemyTmpHp + r:GetRoleData(RoleDataName.Hp) end v:OrderStart() end Timer.New(function () go:SetActive(false) playerHP = 0 this.PlayerHPTxt.text = "我方总血量"..math.floor(playerHP / playerMaxHP * 100).."%" enemyHP = 0 this.EnemyHPTxt.text = "敌方总血量"..math.floor(enemyHP / enemyMaxHP * 100).."%" Timer.New(function () if BattleLogic.CurOrder == 1 then BattleManager.StartBattle() else BattleManager.ResumeBattle() end end, 0.5):Start() if BattleLogic.CurOrder == 1 then Game.GlobalEvent:DispatchEvent(GameEvent.Guide.GuideBattleStart) end end, 1.5):Start() end end) end):SetDelay(i*0.1):OnStart(function () if enemyLivePos.childCount > 0 then local go2 = loadAsset("fx_Effect_enemy_birth") go2.transform:SetParent(this.EnemyPanel.transform) go2.transform.localScale = Vector3.one go2.transform.position = enemyPos.position go2:SetActive(true) addDelayRecycleRes("fx_Effect_enemy_birth", go2, 2) end end) end end -- 回合变化 function this.BattleRoundChange(Round) -- 回调UI层 this.root.OnRoundChanged(Round) -- 异妖CD if this.DiffMonsterFlag then local slider = BattleLogic.GetTeamSkillCastSlider(0) this.DiffMonsterSlider.fillAmount = slider end if this.EnemyDiffMonsterFlag then local slider = BattleLogic.GetTeamSkillCastSlider(1) this.EnemyDiffMonsterSlider.fillAmount = slider end end -- 战斗波次变化 function this.BattleOrderChange(order) -- 回调UI层 this.root.OnOrderChanged(order) if GuideManager.IsFirstBattle() then this.ElementalResonanceView.elementalResonanceBtn:SetActive(false) this.ElementalResonanceView2.elementalResonanceBtn:SetActive(false) else this.ElementalResonanceView.elementalResonanceBtn:SetActive(true) this.ElementalResonanceView2.elementalResonanceBtn:SetActive(true) local curFormation = FormationManager.GetFormationByID(FormationManager.currentFormationIndex) this.ElementalResonanceView:GetElementalType(curFormation.teamHeroInfos,1) this.ElementalResonanceView:SetPosition(2) if this.fightData.enemyData[order] then this.ElementalResonanceView2:GetElementalType(this.fightData.enemyData[order], 2, order) this.ElementalResonanceView2:SetPosition(3) end end if this.tween1 then this.tween1:Kill() end if this.tween2 then this.tween2:Kill() end enemyMaxHP = 0 enemyHP = 0 playerTmpHp = 0 enemyTmpHp = 0 this.PlayerHPTxt.text = "" this.EnemyHPTxt.text = "" this.EnemyHP.fillAmount = 0 this.PlayerHP.fillAmount = 0 BattleManager.PauseBattle() this.BG:GetComponent("RectTransform").anchoredPosition = Vector2.zero this.BG:GetComponent("Image").sprite = Util.LoadSprite(scene[order]) if order > 1 then this.LastBG:GetComponent("Image").sprite = Util.LoadSprite(scene[order-1]) this.LastBG:SetActive(true) this.LastBG:GetComponent("Image"):DOFade(1,0):OnComplete(function () this.LastBG:GetComponent("Image"):DOFade(0,1):OnComplete(function () this.LastBG:SetActive(false) end) end) this.BG:GetComponent("Image"):DOFade(0,0):OnComplete(function () this.BG:GetComponent("Image"):DOFade(1,1) end) -- PlayUIAnimBack(this.gameObject,function () for _,v in pairs(tbRole) do v.hpSlider.fillAmount = 0 v.hpPassSlider.fillAmount = 0 v.hpCache = 0 if v.spSlider then v.spSlider.fillAmount = 0 end end PlayUIAnim(this.gameObject, this.EnemyAppear) end) else this.UpRoot:SetActive(false) this.DownRoot:SetActive(false) this.PlayerPanel:SetActive(false) RoleShowView.Show(function() RoleShowView.Recycle() this.UpRoot:SetActive(true) this.DownRoot:SetActive(true) PlayUIAnim(this.gameObject) Timer.New(function() SoundManager.PlaySound(SoundConfig.Sound_BattleStart_02) end, 1):Start() playerMaxHP = 0 BattleLogic.StartOrder() -- for _,v in pairs(tbRole) do -- v.hpSlider.fillAmount = 0 -- v.hpPassSlider.fillAmount = 0 -- v.hpCache = 0 -- if v.spSlider then -- v.spSlider.fillAmount = 0 -- end -- end this.PlayerPanel:SetActive(true) PlayUIAnim(this.PlayerPanel, this.EnemyAppear) end) end --刷新敌军站位 local v3 = this.EnemyPanel:GetComponent("RectTransform").anchoredPosition this.EnemyPanel.transform.localScale = Vector3.one this.EnemyPanel:GetComponent("RectTransform").anchoredPosition = Vector2.New(v3.x, posY) for i=1, 6 do local enemyPos = Util.GetTransform(this.EnemyPanel, tostring(i)) local enemyLivePos = Util.GetTransform(this.EnemyPanel, "live_"..i) enemyPos.localScale = Vector3.zero enemyLivePos.localScale = Vector3.zero local myPos = Util.GetTransform(this.PlayerPanel, "View/"..i.."/root") myPos.localScale = Vector3.one end end function this.OnAddRole(data) local go if data.camp == 0 then local parent = Util.GetTransform(this.PlayerPanel, "View/"..data.position.."/root") -- if data.position == 1 then -- parent.localPosition = Vector3.New(-145, -221, 0) -- else -- parent.localPosition = Vector3.New(0, -221, 0) -- end go = BattlePool.GetItem(parent, BATTLE_POOL_TYPE.MY_ROLE) playerHP = playerHP + data:GetRoleData(RoleDataName.Hp) playerMaxHP = playerMaxHP + data:GetRoleData(RoleDataName.MaxHp) else local enemyPos = Util.GetTransform(this.EnemyPanel, tostring(data.position)) go = BattlePool.GetItem(enemyPos, data.position <= 3 and BATTLE_POOL_TYPE.ENEMY_ROLE or BATTLE_POOL_TYPE.ENEMY_ROLE_2) enemyHP = enemyHP + data:GetRoleData(RoleDataName.Hp) enemyMaxHP = enemyMaxHP + data:GetRoleData(RoleDataName.MaxHp) end go.transform.localScale = Vector3.one go.transform.localPosition = Vector3.zero go.transform.anchoredPosition = Vector2.zero go:SetActive(true) tbRole[data] = RoleView.New(go, data, data.position, this) end function this.OnRemoveRole(data) local view = tbRole[data] if view then view:Dispose() tbRole[data] = nil end end function this.GetRoleView(role) return tbRole[role] end -- 设置角色高亮 function this.SetRoleHighLight(caster, targets, func) -- 没有目标全部高亮 if not caster and not targets then for _, role in pairs(tbRole) do role:SetHighLight(true, 1, 0.2) end -- 避免战斗结束时状态显示错误的问题 if tbRoleDispose then for _, role in pairs(tbRoleDispose) do role:SetHighLight(true, 1, 0.2) end end if func then func() end return end -- local i = 0 local max = 0 local function _Count() i = i + 1 if i >= max then if func then func() end end end for _, role in pairs(tbRole) do max = max + 1 role:SetHighLight(false, 0.95, 0.2, _Count) end if caster then max = max - 1 caster:SetHighLight(true, 1.5, 0.2) end if targets then for _, data in ipairs(targets) do if caster ~= tbRole[data] then max = max - 1 tbRole[data]:SetHighLight(true, 1.2, 0.2) end end end if max == 0 then if func then func() end end end --(新手引导专用)查找同一站位的人,敌方死亡,我方存活的 function this.GuideCheckEnemyDead(role) if not role:IsDead() and role.camp == 0 then for r, v in pairs(tbRole) do if r:IsDead() and r.camp == 1 and r.position == role.position then return true end end end return false end function this.OnUpdate() if BattleManager.IsBattlePlaying() and not BattleLogic.IsEnd then BattleLogic.Update() -- 再检测一次战斗结束 if BattleLogic.IsEnd then return end playerTmpHp = 0 enemyTmpHp = 0 -- 所有角色血条 for r, v in pairs(tbRole) do v:Update() if r.camp == 0 then playerTmpHp = playerTmpHp + r:GetRoleData(RoleDataName.Hp) else enemyTmpHp = enemyTmpHp + r:GetRoleData(RoleDataName.Hp) end end -- 我方总血条 if playerTmpHp ~= playerHP then local f1 = playerHP local f2 = playerTmpHp if this.tween1 then this.tween1:Kill() end this.tween1 = DoTween.To(DG.Tweening.Core.DOGetter_float( function () return f1 end), DG.Tweening.Core.DOSetter_float(function (t) this.PlayerHP.fillAmount = t / playerMaxHP end), f2, 0.5):SetEase(Ease.Linear) playerHP = playerTmpHp this.PlayerHPTxt.text = "我方总血量"..math.floor(playerHP / playerMaxHP * 100).."%" end -- 敌方总血条 if enemyTmpHp ~= enemyHP then local f1 = enemyHP local f2 = enemyTmpHp if this.tween2 then this.tween2:Kill() end this.tween2 = DoTween.To(DG.Tweening.Core.DOGetter_float( function () return f1 end), DG.Tweening.Core.DOSetter_float(function (t) this.EnemyHP.fillAmount = t / enemyMaxHP end), f2, 0.5):SetEase(Ease.Linear) enemyHP = enemyTmpHp this.EnemyHPTxt.text = "敌方总血量"..math.floor(enemyHP / enemyMaxHP * 100).."%" end -- 驱动上层界面 this.root.OnUpdate() end end function this.OnSkillCast(skill) local type = skill.teamSkillType local camp = skill.owner.camp local pokemonConfig = PokemonEffectConfig[type] if camp == 0 then Util.SetGray(this.DiffMonster, true) else Util.SetGray(this.EnemyDiffMonster, true) end if camp == 1 then local yiPath2 = pokemonConfig.aoe local go3 = loadAsset(yiPath2) go3.transform:SetParent(this.transform) go3.transform.localScale = Vector3.one go3.transform.localPosition = camp == 0 and Vector3.New(0,100,0) or Vector3.New(0,-674,0) go3:SetActive(true) this.BG:GetComponent("RectTransform"):DOShakeAnchorPos(1, Vector2.New(500, 100), 100, 50, false, true) addDelayRecycleRes(yiPath2, go3, 3) return end local go = loadAsset("casting_skill") go:GetComponent("Canvas").sortingOrder = this.root.sortingOrder + 100 go.transform:SetParent(this.gameObject.transform) go.transform.localScale = Vector3.one go.transform.localPosition = Vector3.zero go:SetActive(true) local path = pokemonConfig.live local scale = pokemonConfig.scale local tran = Util.GetTransform(go, "player") local liveGO = poolManager:LoadAsset(path, PoolManager.AssetType.GameObject) liveGO.transform:SetParent(tran) liveGO.transform.localScale = Vector3.one * scale liveGO.transform.localPosition = Vector3.New(0, 0, 0) liveGO:SetActive(true) liveGO:GetComponent("SkeletonGraphic"):DOFade(1, 0) liveGO:GetComponent("SkeletonGraphic"):DOColor(Color.New(1,1,1,1), 0) SoundManager.PlaySound(SoundConfig.Sound_MonsterCasting) BattleManager.PauseBattle() addDelayRecycleRes("casting_skill", go, 1.6, function () local yiPath1 = pokemonConfig.screen local go2 = loadAsset(yiPath1) go2.transform:SetParent(this.transform) go2.transform.localScale = Vector3.one go2.transform.localPosition = Vector3.zero go2:SetActive(true) addDelayRecycleRes(yiPath1, go2, pokemonConfig.screenCD + 3, function () local yiPath2 = pokemonConfig.aoe local go3 = loadAsset(yiPath2) go3.transform:SetParent(this.transform) go3.transform.localScale = Vector3.one go3.transform.localPosition = camp == 0 and Vector3.New(0,100,0) or Vector3.New(0,-674,0) go3:SetActive(true) this.BG:GetComponent("RectTransform"):DOShakeAnchorPos(1, Vector2.New(500, 100), 100, 50, false, true) BattleManager.ResumeBattle() addDelayRecycleRes(yiPath2, go3, 3) end, pokemonConfig.screenCD) end) addDelayRecycleRes(path, liveGO, 1.6) end -- 清除角色 function this:ClearRole() for _, view in pairs(tbRole) do view:Dispose() end tbRole = {} end -- 参数:object 抖动物体 timeScale 震动时长 dx, dy震动偏移量 local isShaking = false function this:SetShake(object, timeScale, dx, dy, callBack) if isShaking then return end isShaking = true if not object then object = this.gameObject end if not timeScale or timeScale == 0 then timeScale = 0.2 end if not dx or not dy or dy == 0 and dx == 0 then dx = 100 dy = 100 end object:GetComponent("RectTransform"):DOShakeAnchorPos(timeScale, Vector2.New(dx, dy), 500, 90, true, true):OnComplete(function () if callBack then callBack() end isShaking = false end) end --界面关闭时调用(用于子类重写) function this:OnClose() FixedUpdateBeat:Remove(this.OnUpdate, self) for _, v in pairs(tbRoleDispose) do v:Dispose() end tbRoleDispose = {} for k, v in pairs(delayRecycleList) do for i=1, #v do poolManager:UnLoadAsset(k, v[i], PoolManager.AssetType.GameObject) end delayRecycleList[k] = nil end BattlePool.Clear() poolManager:ClearPool() -- BattleManager.StopBattle() this.ClearBattleEvent() end --界面销毁时调用(用于子类重写) function this:OnDestroy() SubUIManager.Close(this.ElementalResonanceView) SubUIManager.Close(this.ElementalResonanceView2) BattlePool.Destroy() end return BattleView