1937 lines
72 KiB
Lua
1937 lines
72 KiB
Lua
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)
|
||
|
||
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: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 |