miduo_client/Assets/ManagedResources/~Lua/Modules/Battle/View/RoleView.lua

1937 lines
72 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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