sk-client/Assets/ManagedResources/~Lua/Modules/Battle/View/RoleView.lua

3205 lines
115 KiB
Lua
Raw Permalink 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 TurretEffectRotationConfig = ConfigManager.GetConfig(ConfigName.TurretEffectRotationConfig)
local Bezier = require("Base.Bezier")
local healEffect = "n1_eff_heal"
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 skillFloatingEffect = "SkillFloatingText"
--英雄动画脚本名字
local SpineComponentName = "SkeletonAnimation"
local leaderIcon = {3091,3092}
local loadAsset = function(path, battleSorting, notPlaySound)
local go = poolManager:LoadAsset(path, PoolManager.AssetType.GameObject)
if go == nil then
LogError("### res not found:" .. path)
-- go = poolManager:LoadAsset("TestImg", PoolManager.AssetType.GameObject)
end
local layer = tonumber(go.name) or 0
battleSorting = battleSorting or BattleManager.GetBattleSorting()
Util.AddParticleSortLayer(go, battleSorting - layer)
go.name = tostring(battleSorting)
--- 播放音效
-- if not notPlaySound then
-- local audioData = FEAConfig.GetAudioData(path)
-- if audioData then
-- SoundManager.PlaySound(audioData.name)
-- end
-- end
return go
end
---加载战斗场景里使用的资源
function RoleView:loadAssetForScene(path, parent)
if path == nil then
LogError("path = nil!!!"..path)
end
local go = poolManager:LoadAsset(path, PoolManager.AssetType.GameObject)
if go then
go:SetLayer(self.RootPanel.battleSceneLayer)
go.transform:SetParent(parent, false)
-- go.name = go.name .. tostring(battleSorting)
--- 播放音效
-- local audioData = FEAConfig.GetAudioData(path)
-- if audioData then
--SoundManager.PlaySound(audioData.name)
-- end
end
return go
end
function RoleView:initHPOffset(position, size)
local posRow = (position - 1) % 3
if posRow == 2 then -- 摄像机最近的
self.hpScale = 1
self.hpOffset = Vector3.New(0, 80, 0)
elseif posRow == 1 then
self.hpScale = 0.9
self.hpOffset = Vector3.New(-10, 80, 0)
elseif posRow == 0 then
self.hpScale = 0.8
self.hpOffset = Vector3.New(-5, 80, 0)
end
--中间列高一点
if position == 4 then
self.hpOffset.y = self.hpOffset.y + 4
elseif position == 5 then
self.hpOffset.y = self.hpOffset.y + 8
elseif position == 6 then
self.hpOffset.y = self.hpOffset.y + 10
end
local coefficient = size > 2.3 and 0.9 or 1 --为了修正放大太多就偏移太高
self.hpOffset.y = self.hpOffset.y * size * size * coefficient --血条跟着角色大小偏移,乘方没理由的,这样看起来合适
end
---创建一个英雄
---@param go table 血条
---@param role table 英雄数据
---@param position string 英雄所在位置
---@param root table 战场
---@return table
function RoleView.New(go, role, position, root, spineLivePos)
local instance = {}
setmetatable(instance, RoleView)
if role.roleData.size == nil then role.roleData.size = 1 end
instance:initHPOffset(role.position, role.roleData.size)
instance.battleSceneLogic = root.battleSceneLogic
instance.battleScene = root.battleScene
instance.RootPanel = root
instance.GameObject = go
instance.role = role
instance.camp = role.camp
instance.turretCurFrame = BattleTankFrame.IdleFrame
instance.BuffList = {}
instance.buffRoot = Util.GetGameObject(go, "buff")
instance.BuffIconList = {}
instance.BuffEffectList = {}
instance.delayRecycleList = {}
role.Event:AddEvent(BattleEventName.SkillCast, instance.OnSkillCast, instance)
role.Event:AddEvent(BattleEventName.SkillFireOnce, instance.SkillFireOnce, instance) --< once炮击
role.Event:AddEvent(BattleEventName.SkillFireAll, instance.SkillFireAll, instance) --< 技能单次所有目标
role.Event:AddEvent(BattleEventName.SkillCastEnd, instance.SkillCastEnd, instance) --< once炮击
BattleLogic.Event:AddEvent(BattleEventName.BattleEnd, instance.OnEnd, instance)
BattleLogic.Event:AddEvent(BattleEventName.BattleOrderChange, instance.OnEnd, instance)
role.Event:AddEvent(BattleEventName.BeHitMiss, instance.OnBeHitMiss, instance)
role.Event:AddEvent(BattleEventName.RoleBeDamaged, instance.OnDamaged, instance)
role.Event:AddEvent(BattleEventName.RoleBeTreated, instance.OnTreated, instance)
role.Event:AddEvent(BattleEventName.RoleBeHealed, instance.OnHealed, instance)
role.Event:AddEvent(BattleEventName.RoleDead, instance.OnDead, instance)
role.Event:AddEvent(BattleEventName.RoleRealDead, instance.OnRealDead, instance)
role.Event:AddEvent(BattleEventName.RoleCDChanged, instance.OnRoleCDChanged, instance)
-- role.Event:AddEvent(BattleEventName.RoleViewBullet, instance.RoleViewBullet, instance)
-- role.Event:AddEvent(BattleEventName.RoleRageChange, instance.RoleRageChange, instance)
role.Event:AddEvent(BattleEventName.RoleRelive, instance.onRoleRelive, instance)
role.Event:AddEvent(BattleEventName.AOE, instance.OnAOE, instance)
role.Event:AddEvent(BattleEventName.BeSeckill, instance.onBeSecKill, instance)
role.Event:AddEvent(BattleEventName.BuffStart, instance.OnBuffStart, instance)
role.Event:AddEvent(BattleEventName.BuffCover, instance.OnBuffCover, instance)
role.Event:AddEvent(BattleEventName.BuffTrigger, instance.OnBuffTrigger, instance)
role.Event:AddEvent(BattleEventName.BuffEnd, instance.OnBuffEnd, instance)
role.Event:AddEvent(BattleEventName.BuffDodge, instance.OnBuffDodge, instance)
role.Event:AddEvent(BattleEventName.BuffRoundChange, instance.OnBuffRoundChange, instance)
role.Event:AddEvent(BattleEventName.BuffDurationChange, instance.OnBuffRoundChange, instance)
role.Event:AddEvent(BattleEventName.ShildTrigger, instance.OnShieldTrigger, instance)
role.Event:AddEvent(BattleEventName.SkillTextFloating, instance.TextSkillFloating, instance)
role.Event:AddEvent(BattleEventName.ImmuneTrigger, instance.OnImmuneTrigger, instance)
role.Event:AddEvent(BattleEventName.ShildReduce, instance.OnShildReduce, instance)
instance.hpGo = Util.GetGameObject(go, "hp"):GetComponent("MeshRenderer")
instance.materialPropertyBlock = MaterialPropertyBlock.New()
--等级
local lv = role:GetRoleData(RoleDataName.Level)
if lv < 10 then
instance.materialPropertyBlock:SetFloat("_LV_length",1)
instance.materialPropertyBlock:SetFloat("_LV",lv*100)
elseif lv < 100 then
instance.materialPropertyBlock:SetFloat("_LV_length",2)
instance.materialPropertyBlock:SetFloat("_LV",lv*10)
else
instance.materialPropertyBlock:SetFloat("_LV_length",3)
instance.materialPropertyBlock:SetFloat("_LV",lv)
end
--类型
if not role.leader then
instance.materialPropertyBlock:SetFloat("_Icon_set",role.roleData.element)
end
--血条
instance.hpCache = instance.role:GetRoleData(RoleDataName.Hp) / instance.role:GetRoleData(RoleDataName.MaxHp)
instance.materialPropertyBlock:SetFloat("_HP",instance.hpCache)
--颜色
instance.materialPropertyBlock:SetColor("_Color",Color.New(1, 1, 1, 1))
instance.hpGo:SetPropertyBlock(instance.materialPropertyBlock)
--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.lvText = Util.GetGameObject(go, "lv/Text"):GetComponent("Text")
instance.readingName = ""
--我方主角 1 为女主 2 为男主 --目前为默认参数
if role.roleData.roleId == 1 or role.roleData.roleId == 2 then
if NameManager.roleSex == ROLE_SEX.BOY then
instance.livePath = "role_nanzhu"
else
instance.livePath = "role_nvzhu"
end
instance.play_liveScale = RoleConfig[10001].play_liveScale --test
instance.enemy_liveScale = RoleConfig[10001].enemy_liveScale --test
instance.outOffset = RoleConfig[10001].enemy_offset --test
instance.spAtkTime = 0 --RoleConfig[role.roleData.roleId].CastingSkills / 1000
instance.atkSoundTime = 0.9--RoleConfig[role.roleData.roleId].CastingAudio / 1000
instance.attackSound = "Audio_c_fx_00028_attack_01" --RoleConfig[role.roleData.roleId].sond
instance.readingName = "tester"
else
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.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 = GetLanguageStrById(MonsterConfig[role.roleData.monsterId].ReadingName)
else
instance.readingName = GetLanguageStrById(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.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 = GetLanguageStrById(MonsterConfig[role.roleData.monsterId].ReadingName)
else
instance.readingName = GetLanguageStrById(HeroConfig[role.roleData.roleId].ReadingName)
end
end
end
--Util.GetGameObject(go, "lv/Text"):GetComponent("Text").text = role:GetRoleData(RoleDataName.Level)
--Util.GetGameObject(go, "Pro/Image"):GetComponent("Image").sprite = Util.LoadSprite(GetProStrImageByProNum2(role.roleData.element))
--↓↓↓↓↓↓改为加载动画
instance.RoleLiveGO = poolManager:LoadSpine(instance.livePath, spineLivePos.transform, Vector3.one, Vector3.zero)
instance.RoleLiveGO:SetLayer(instance.RootPanel.battleSceneLayer)
instance.RoleLiveGOGraphic = instance.RoleLiveGO:GetComponent(SpineComponentName)
RoleView:ResetSpineComponent(instance.RoleLiveGOGraphic)
instance.RoleLiveGO:SetActive(true)
local size = role.roleData.size and role.roleData.size or 1
instance.RoleLiveGO.transform.localScale = Vector3.New(size * (role.camp == 0 and 1 or -1) * instance.RoleLiveGO.transform.localScale.x, size * instance.RoleLiveGO.transform.localScale.y, instance.RoleLiveGO.transform.localScale.z)
--↑↑↑↑↑
instance.beHit = Util.GetGameObject(instance.RoleLiveGOTran, "size/beHit")
-- Util.ClearChild(instance.Eff_ani.transform)
instance.rageCache = nil
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
instance.LastSkillTextTime = Time.realtimeSinceStartup
instance.SkillTextCount = 0
-- if role.camp == 0 then
-- local battleSorting = BattleManager.GetBattleSorting()
-- instance:ChangeCardSorting(battleSorting + position)
-- -- local c = go:GetComponent("Canvas")
-- -- c.sortingOrder = battleSorting + position
-- end
--instance:HpComponentHide(true)
instance.DoColor_Spine_Tweener = nil
--更新血条缩放
instance.GameObject.transform.localScale = Vector3.one * instance.hpScale
--初始化角色的icon
if instance.role.leader then
local unlockSlot = instance.role.leaderUnlockSkillSize
instance.RootPanel.root:InitIcons_Skill(instance.role.skillArray,nil,instance.role.camp,unlockSlot)
-- LogError("InitIcons_Skill")
end
return instance
end
--所有需要延迟回收的资源走该接口,当回调执行前界面已被销毁时,不会报错
function RoleView:AddDelayRecycleRes(path, go, delayTime, delayFunc, delType, beforeFunc)
if not self.delayRecycleList[path] then
self.delayRecycleList[path] = {}
end
local delType = delType
table.insert(self.delayRecycleList[path], {node = go, type = delType})
if not self.kkkk then
self.kkkk = {}
end
table.insert(self.kkkk, go)
Timer.New(
function()
if not self.delayRecycleList[path] then
return
end
if beforeFunc then
beforeFunc()
end
for i = 1, #self.delayRecycleList[path] do
if self.delayRecycleList[path][i].node == go then
if self.delayRecycleList[path][i].type == PoolManager.AssetTypeGo.GameObjectFrame then
poolManager:UnLoadSpine(path, go)
else
Util.SetGray(go, false)
poolManager:UnLoadAsset(path, go, PoolManager.AssetType.GameObject)
end
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()
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
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)
-- if true then
-- return
-- end
if type == 0 then type = 1 end
-- LogError(string.format("type: %s text: %s",tostring(type),text))
local color
if type == 1 then --蓝色 增益 效果抵抗
color = Color.New(105, 227, 255, 255) / 255
elseif type == 2 then --红色 减益
color = Color.New(243, 82, 77, 255) / 255
elseif type == 3 then --紫色 dot
color = Color.New(222, 120, 255, 255) / 255
elseif type == 4 then --绿色 hot
color = Color.New(93, 231, 135, 255) / 255
end
local go = loadAsset(buffFloatingEffect)
local baseOffset = Vector2.New(0, 0)
-- if self.camp == 0 then
go.transform:SetParent(self.RootPanel.skillEffectRoot.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 * 2 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 + baseOffset.x, baseOffset.y + self.BuffTextCount * 60)
local battleSorting = BattleManager.GetBattleSorting()
Util.GetGameObject(go, "anim"):GetComponent("Canvas").sortingOrder = battleSorting + 80
Util.GetGameObject(go, "anim/text"):SetActive(true)
Util.GetGameObject(go, "anim/text"):GetComponent("Text").text = text
if color then
Util.GetGameObject(go, "anim/text"):GetComponent("Text").color = color
end
Util.GetGameObject(go, "anim/text"):GetComponent("Text").font = poolManager:LoadAsset(GetFont(), PoolManager.AssetType.Other)
Util.GetGameObject(go, "anim/grid"):SetActive(false)
self:AddDelayRecycleRes(buffFloatingEffect, go, 1.3)
end
--
function RoleView:ImageBuffFloating(textImg, numImg)
local go = loadAsset(buffFloatingEffect)
go.transform:SetParent(self.RootPanel.skillEffectRoot.transform)
go.transform.localScale = Vector3.one
go.transform.position = self.GameObject.transform.position
go:SetActive(true)
if Time.realtimeSinceStartup - self.LastBuffTextTime < BattleLogic.GameDeltaTime then
self.BuffTextCount = self.BuffTextCount + 1
else
self.BuffTextCount = 0
end
self.LastBuffTextTime = Time.realtimeSinceStartup
local v2 = go:GetComponent("RectTransform").anchoredPosition
local baseOffset = Vector2.New(0, 0)
go:GetComponent("RectTransform").anchoredPosition = v2 + Vector2.New(0 + baseOffset.x, baseOffset.y + 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")
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
self:AddDelayRecycleRes(buffFloatingEffect, go, 1.3)
end
--> 效果反推技能名显示用
function RoleView:TextSkillFloating(skill)
if not skill then
return
end
local color = Color.New(17, 255, 17, 255) / 255
local skillConfig = G_SkillConfig[skill.id]
local text = skillConfig.Name
local go = loadAsset(skillFloatingEffect)
--> go.transform:SetParent(self.RootPanel.transform)
go.transform:SetParent(self.RootPanel.skillEffectRoot.transform)
go.transform.localScale = Vector3.one
go.transform.position = self.GameObject.transform.position
go:SetActive(true)
if Time.realtimeSinceStartup - self.LastSkillTextTime < BattleLogic.GameDeltaTime then
self.SkillTextCount = self.SkillTextCount + 1
else
self.SkillTextCount = 0
end
self.LastSkillTextTime = Time.realtimeSinceStartup
local v2 = go:GetComponent("RectTransform").anchoredPosition
go:GetComponent("RectTransform").anchoredPosition = v2 + Vector2.New(0, self.SkillTextCount * 60)
local battleSorting = BattleManager.GetBattleSorting()
Util.GetGameObject(go, "anim"):GetComponent("Canvas").sortingOrder = battleSorting + 80
Util.GetGameObject(go, "anim/text"):SetActive(true)
Util.GetGameObject(go, "anim/text"):GetComponent("Text").text = GetLanguageStrById(text)
Util.GetGameObject(go, "anim/text"):GetComponent("Text").color = color
self:AddDelayRecycleRes(skillFloatingEffect, go, 1.3)
end
--
local ArtFloatingType = {
CritDamage = 1, -- 暴击
Damage = 2,
Treat = 3,
FireDamage = 4,
PoisonDamage = 5,
ShieldDef = 6
}
local ArtFloatingAnim = {
[1] = "Crit_Attack_Float",
[2] = "Normal_Attack_Float",
[3] = "floatingTextAnim",
[4] = "floatingTextAnim",
[5] = "floatingTextAnim",
[6] = "Crit_Attack_Float",
}
--角色受到的暴击伤害(无论什么类型) - 红色字体 (字符顺序: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,
Shiled = 5
}
function RoleView:GetArtText(type, color, value, isForbear)
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
if type == ArtFloatingType.CritDamage then
text = text .. string.char(98) -- 暴击文字
elseif type == ArtFloatingType.ShieldDef then
text = text .. string.char(120) -- 护盾
elseif type == ArtFloatingType.Damage and isForbear then
text = text .. string.char(107)
end
-- 数字
local str = tostring(value)
for i = 1, #str do
text = text .. string.char(string.byte(str, i))
end
return text
end
function RoleView:ArtFloating(type, color, value, isForbear)
local go = loadAsset(floatingEffect)
-- if self.camp == 0 then
go.transform:SetParent(self.RootPanel.skillEffectRoot.transform)
-- else
-- go.transform:SetParent(self.GameObject.transform)
-- end
if type == ArtFloatingType.ShieldDef then
go.transform.localScale = Vector3.one * 0.65
else
go.transform.localScale = Vector3.one
end
go.transform.position = self.GameObject.transform.position
go:SetActive(true)
-- if Time.realtimeSinceStartup - self.LastFloatingTime < BattleLogic.GameDeltaTime then
-- self.FloatingCount = self.FloatingCount + 1
-- else
-- self.FloatingCount = 0
-- end
-- self.LastFloatingTime = Time.realtimeSinceStartup
local v2 = go:GetComponent("RectTransform").anchoredPosition
local posRow = (self.role.position - 1) % 3
if posRow == 2 then -- 摄像机最近的
v2 = v2 + Vector2.New(0, 230)
elseif posRow == 1 then
v2 = v2 + Vector2.New(0, 200)
elseif posRow == 0 then
v2 = v2 + Vector2.New(0, 190)
end
local offset = Vector2.New(10, 40)
-- local offsetW = Vector2.New(10, 0)
go:GetComponent("RectTransform").anchoredPosition = v2
if self.delayRecycleList[floatingEffect] then
for k, v in ipairs(self.delayRecycleList[floatingEffect]) do
local pt = v.node:GetComponent("RectTransform").anchoredPosition
pt = pt + offset
v.node:GetComponent("RectTransform").anchoredPosition = pt
end
end
local text = self:GetArtText(type, color, value, isForbear)
local colorArray = {[1] = "anim_Red", [2] = "anim_White", [3] = "anim_Yellow", [4] = "anim_Green",[5] = "anim_Blue",[6] = "anim_Blue"}
for i = 1, #colorArray do
local hideanim = Util.GetGameObject(go, colorArray[i])
hideanim:SetActive(false)
end
if color + 1 > #colorArray then
--return
color = 1
end
local anim = Util.GetGameObject(go, colorArray[color + 1])
anim:SetActive(true)
if color + 1 == 1 then
-- LogError(GetPictureFont("x1_fnt_battle_rad").."_cfont")
anim:GetComponent("Text").font = poolManager:LoadAsset(GetPictureFont("x1_fnt_battle_rad").."_cfont", PoolManager.AssetType.Other)
elseif color + 1 == 2 then
anim:GetComponent("Text").font = poolManager:LoadAsset(GetPictureFont("X1_battle_font_bai").."_cfont", PoolManager.AssetType.Other)
elseif color + 1 == 3 then
-- LogError(GetPictureFont("X1_battle_font_yellow").."_cfont")
anim:GetComponent("Text").font = poolManager:LoadAsset(GetPictureFont("X1_battle_font_yellow").."_cfont", PoolManager.AssetType.Other)
end
-- LogError(anim:GetComponent("Text").font.name)
anim:GetComponent("Text").text = text
anim:GetComponent("Canvas").sortingOrder = BattleManager.GetBattleSorting() + 50
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
-- if self.delayRecycleList[floatingEffect] then
-- for k, v in ipairs(self.delayRecycleList[floatingEffect]) do
-- local colorArray = {[1] = "anim_Red", [2] = "anim_White", [3] = "anim_Yellow", [4] = "anim_Green"}
-- for i = 1, #colorArray do
-- local anim = Util.GetGameObject(v, colorArray[i])
-- anim:GetComponent("Canvas").sortingOrder = battleSorting + 100
-- end
-- end
-- end
-- if self.delayRecycleList[buffFloatingEffect] then
-- for k, v in ipairs(self.delayRecycleList[buffFloatingEffect]) do
-- Util.GetGameObject(v, "anim"):GetComponent("Canvas").sortingOrder = battleSorting + 200
-- end
-- end
-- if self.delayRecycleList[skillFloatingEffect] then
-- for k, v in ipairs(self.delayRecycleList[skillFloatingEffect]) do
-- Util.GetGameObject(v, "anim"):GetComponent("Canvas").sortingOrder = battleSorting + 200
-- end
-- end
end
function RoleView:ChangeEffectOrder()
end
function RoleView:GetSortingOrder()
return self.GameObject.transform.parent:GetComponent("Canvas").sortingOrder
end
-- 改变卡牌层级
function RoleView:ChangeCardSorting(sortingOrder)
if not self.oSortingOrder then
self.oSortingOrder = BattleManager.GetBattleSorting()
end
self.GameObject:GetComponent("Canvas").sortingOrder = sortingOrder
self.oSortingOrder = sortingOrder
end
function RoleView:Update_HPPos()
--更新血条位置
self.GameObject.transform.localPosition = Util.WorldToLocalInRect(self.RootPanel.camera3D, self.RoleLiveGO.transform.parent.position, self.RootPanel.cameraUI, self.GameObject.transform.parent:GetComponent("RectTransform")) + self.hpOffset
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.materialPropertyBlock:SetFloat("_HP",hp)
self.hpGo:SetPropertyBlock(self.materialPropertyBlock)
self.hpTween =
DoTween.To(
DG.Tweening.Core.DOGetter_float(
function()
return f1
end
),
DG.Tweening.Core.DOSetter_float(
function(progress)
--self.hpPassSlider.fillAmount = progress
self.materialPropertyBlock:SetFloat("_HP",progress)
self.hpGo:SetPropertyBlock(self.materialPropertyBlock)
end
),
f2,
0.5
):SetEase(Ease.Linear)
else
if self.hpPassTween then
self.hpPassTween:Kill()
end
--self.hpPassSlider.fillAmount = hp
self.materialPropertyBlock:SetFloat("_HP",hp)
self.hpGo:SetPropertyBlock(self.materialPropertyBlock)
self.hpPassTween =
DoTween.To(
DG.Tweening.Core.DOGetter_float(
function()
return f1
end
),
DG.Tweening.Core.DOSetter_float(
function(progress)
--self.hpSlider.fillAmount = progress
self.materialPropertyBlock:SetFloat("_HP",progress)
self.hpGo:SetPropertyBlock(self.materialPropertyBlock)
end
),
f2,
0.5
):SetEase(Ease.Linear)
end
self.hpCache = hp
end
--更新血条位置
self:Update_HPPos()
--[[ 临时屏蔽
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.rageCache = 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:UpdateAnimation()
-- if self.role:IsRealDead() then
-- return
-- end
-- local battlepanel = self.RoleLiveGO
-- for i = 1, 10 do
-- battlepanel = battlepanel.transform.parent
-- if battlepanel.name == "BattlePanel" then
-- break
-- end
-- end
-- if not battlepanel.gameObject.activeSelf then
-- self.RoleImageAnimation:Update()
-- end
end
function RoleView:HpComponentHide(isHide)
-- Util.GetGameObject(self.GameObject, "hpProgress"):SetActive(not isHide)
-- Util.GetGameObject(self.GameObject, "Pro"):SetActive(not isHide)
-- Util.GetGameObject(self.GameObject, "lv"):SetActive(not isHide)
Util.GetGameObject(self.GameObject, "buff"):SetActive(not isHide)
if isHide then
self.materialPropertyBlock:SetColor("_Color",Color.New(1,1,1,0))
else
self.materialPropertyBlock:SetColor("_Color",Color.New(1,1,1,1))
end
self.hpGo:SetPropertyBlock(self.materialPropertyBlock)
if not isHide then
self:Update_HPPos()
end
end
-- 战斗位移
function RoleView:DoFightMove(curpos, tarpos, dur, func, beforeIsHideObj, afterIsHideObj)
if self.dsTweenFightMove then
self.dsTweenFightMove:Kill()
end
BattleManager.PauseBattle()
local oldpt = curpos == nil and self.RoleLiveGO.transform.parent.localPosition or curpos
self.dsTweenFightMove =
DoTween.To(
DG.Tweening.Core.DOGetter_float(
function()
return 0
end
),
DG.Tweening.Core.DOSetter_float(
function(progress)
self.RoleLiveGO.transform.parent.transform.localPosition = Vector3.Slerp(oldpt+ Vector3.New(0,4,0), tarpos+Vector3.New(0,4,0), progress)-Vector3.New(0,4,0)
end
),
1,
dur)
:SetEase(Ease.Linear)
:OnComplete(
function()
self:HpComponentHide(afterIsHideObj)
if curpos == 10 or curpos==99 then self:HpComponentHide(true) end -- 主角血条不显示
BattleManager.ResumeBattle()
if func then
func()
end
end)
:OnStart(
function()
self:HpComponentHide(beforeIsHideObj)
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()
if func then
func()
end
end
)
-- if self.camp == 1 then
if self.dsTween2 then
self.dsTween2:Kill()
end
local liveScale = 1 -- 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)
-- 设置变灰
if self.isDead then
--Util.SetGray(self.GameObject, true)
--local color = Color.New(75, 75, 75, 255) / 255
--Util.SetColor(self.GameObject, color)
--Util.SetColor(self.RoleLiveGO, color)
--self:DoScale(0.8, dur, func)
return
end
self:DoScale(eScale, dur, func)
-- 颜色变灰
local sc = Util.GetColor_Spine(self.RoleLiveGOGraphic).r
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)
self.lvText.color = color
Util.SetColor_Spine(self.RoleLiveGOGraphic, color)
end
),
ec,
dur
):SetEase(Ease.Linear)
end
function RoleView:SetBgColor(isLight, dur, bg)
local sc = isLight and 0.3 or 1
local ec = isLight and 1 or 0.3
if self.bgColorTween then
self.bgColorTween:Kill()
end
self.bgColorTween =
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(bg, color)
end
),
ec,
dur
):SetEase(Ease.Linear)
end
-- 播放动画
function RoleView:PlaySpineAnim(gog, time, name, isLoop)
if isLoop then
gog.AnimationState:ClearEvent_Complete()
gog.AnimationState:SetAnimation(time, name, isLoop)
else
local _complete = nil
_complete = function(state)
gog.AnimationState.Complete = gog.AnimationState.Complete - _complete
gog.AnimationState:SetAnimation(0, RoleAnimationName.Stand, true)
end
RoleView:ResetSpineComponent(gog)
gog.AnimationState:SetAnimation(time, name, isLoop)
gog.AnimationState.Complete = gog.AnimationState.Complete + _complete
end
end
--显示主角id
function RoleView:OnSkillCast(skill, func)
--local testinfo =string.format("cd:%s release:%s ",skill.cd,skill.release)
-- self:TextBuffFloating(TextFloatingColor.Blue,
-- testinfo.." :"..GetLanguageStrById(G_SkillConfig[skill.id].Name).." 技能槽位:"..skill.ext_slot)
if self.role.leader then
-- 需要技能槽位显示参数
-- LogError("CastSkill")
self.RootPanel.root:ShowRect_Skill(leaderIcon[1], G_SkillConfig[skill.id].Name, self.role.camp + 1, true)
--切换技能图标 需要读取下个技能图标
local nextSkil = self.role:GetNextLeaderSkillSlot(skill)
--LogError("nextSkil:"..nextSkil)
self.RootPanel.root:FreshIcon_Skill(skill, skill.lv, self.role.camp, 2, nextSkil)
end
--self:TextBuffFloating(TextFloatingColor.Blue, skill.id)
if skill.skillSubType == SkillSubType.BeatBack then
self.RootPanel.root:ShowHurtEffect(1, skill.owner.camp)
end
if skill.type == 3 then
self.RootPanel.root:ShowHurtEffect(2, skill.owner.camp)
end
end
function RoleView:SkillCastEnd(skill)
self.role.skilling = false
self:HideBuff(false)
if self.role.leader then
self.RootPanel.root:UnGreyAndFrie_Skill(skill,self.role.camp,skill.sort,self.role)
end
end
function RoleView:SkillFireOnce(skill, targetIdx)
if not skill or not targetIdx then
return
end
local combat = BattleManager.GetSkillCombat(SkillLogicConfig[skill.id].SkillDisplay)
if not combat then
return
end
local funFire = function()
self.RootPanel.SetRoleHighLight(
self,
skill:GetDirectTargets(),
function()
self:PlaySpineAnim(self.RoleLiveGOGraphic, 0, combat.Animation, false)
if combat.isRecoil == 1 then
self.RoleLiveGO.transform:DOAnchorPosY(-40, 0.1):SetEase(Ease.Linear):OnComplete(function()
self.RoleLiveGO.transform:DOAnchorPosY(0, 0.15):SetEase(Ease.Linear):OnComplete(function()
end)
end)
end
if combat.SkillSound then
local soundidx = math.random(1, #combat.SkillSound)
SoundManager.PlaySound(combat.SkillSound[soundidx])
end
if combat.SkillNameVoice then
SoundManager.PlaySound(combat.SkillNameVoice)
end
self:CheckFullSceenSkill(combat, skill, targetIdx)
if combat.Move > 0 then
self:DelayFunc(
combat.ReturnTime / 1000 - 3 * BattleLogic.GameDeltaTime,
function()
local _backFinish = function()
self.RootPanel.SetRoleHighLight()
self:HideBuff(false)
end
local pos = self.role.position
if pos == 99 then pos = 10 end
self:DoFightMove(nil, FightCampLocalPosition[self.role.camp][pos], 3 * BattleLogic.GameDeltaTime, _backFinish, true, false)
end
)
else
end
end,
skill,
combat
)
end
if combat.Closeup and not self.role.skilling and skill.isAdd then
self.role.skilling = true
self:PlaySkillCloseUpBefore(combat, skill, funFire)
else
if combat.SkillType ~= 1 then
-- self.RootPanel.root:ShowRect_Skill(HeroConfig[self.role.roleData.roleId].Icon,G_SkillConfig[skill.id].Name)
if self.camp == 0 then
self.RootPanel.root:ShowRect_Skill(HeroConfig[self.role.roleData.roleId].Icon, G_SkillConfig[skill.id].Name, 1)
else
self.RootPanel.root:ShowRect_Skill(HeroConfig[self.role.roleData.roleId].Icon, G_SkillConfig[skill.id].Name, 2)
end
end
funFire()
end
end
local SkillSumDamagedValue = 0 -- 技能伤害总值
function RoleView:SkillFireAll(skill)
if not skill then
return
end
local combat = BattleManager.GetSkillCombat(SkillLogicConfig[skill.id].SkillDisplay)
if not combat then
return
end
SkillSumDamagedValue = 0
local funFire = function()
self.RootPanel.SetRoleHighLight(
self,
skill:GetDirectTargets(),
function()
local funFire2 = function ()
--施法目标
local targets = skill:GetDirectTargets()
self.RootPanel.SetRoleActive(self.role, combat.HideActor, false, targets)
if not BattleManager.isFightBack then
self:PlaySpineAnim(self.RoleLiveGOGraphic, 0, combat.Animation, false)
self:CheckSkillForoleEffect(combat, skill)
end
if combat.Move > 0 then
self:DelayFunc(
-- (combat.KeyFrame + t) / 1000 + 0.2 - 3 * BattleLogic.GameDeltaTime,
combat.ReturnTime / 1000 - 3 * BattleLogic.GameDeltaTime,
function()
local _backFinish = function()
self.RootPanel.SetRoleActive(self.role, combat.BeforeHideActor, true, targets)
self.RootPanel.SetRoleActive(self.role, combat.HideActor, true, targets)
self.RootPanel.SetRoleHighLight()
self:HideBuff(false)
BattleLogic.Event:DispatchEvent(BattleEventName.FloatTotal, SkillSumDamagedValue)
end
local pos = self.role.position
if pos == 99 then pos =10 end
self:DoFightMove(nil, FightCampLocalPosition[self.role.camp][pos], 3 * BattleLogic.GameDeltaTime, _backFinish, true, false)
end
)
else
self:DelayFunc(
combat.ReturnTime / 1000- 3 * BattleLogic.GameDeltaTime,
function()
self.RootPanel.SetRoleActive(self.role, combat.BeforeHideActor, true, targets)
self.RootPanel.SetRoleActive(self.role, combat.HideActor, true, targets)
BattleLogic.Event:DispatchEvent(BattleEventName.FloatTotal, SkillSumDamagedValue)
end
)
end
self:DelayFunc(
combat.CastBullet / 1000,
function()
self:CheckFullSceenSkill(combat, skill, nil)
end
)
if combat.EffectType == 4 then
local a = 0
end
if combat.SkillSound then
local soundidx = math.random(1, #combat.SkillSound)
SoundManager.PlaySound(combat.SkillSound[soundidx])
end
if combat.SkillNameVoice then
SoundManager.PlaySound(combat.SkillNameVoice)
end
end
if combat.PV then
self:PlayPV(combat, skill, function ()
BattleLogic.Event:DispatchEvent(BattleEventName.FloatTotal, SkillSumDamagedValue)
end)
self:DelayFunc(
combat.CastBullet / 1000,
function()
self:CheckFullSceenSkill(combat, skill, nil)
end
)
else
funFire2()
end
end,
skill,
combat
)
end
--按规则隐藏英雄
self:DelayFunc(0.1,
function()
self.RootPanel.SetRoleActive(self.role, combat.BeforeHideActor, false, skill:GetDirectTargets())
end)
if combat.Closeup and not self.role.skilling then
self.role.skilling = true
self:PlaySkillCloseUpBefore(combat, skill, funFire)
else
if combat.SkillType ~= 1 then
-- self.RootPanel.root:ShowRect_Skill(HeroConfig[self.role.roleData.roleId].Icon,G_SkillConfig[skill.id].Name)
local id = self.role.roleData.roleId
local icon = 0
-- 主角单独处理 HeroConfig[id].Icon 为 id @exm 10001的 头像id = 3001
if self.role.leader then
icon = leaderIcon[id] -- 3092 为男需要读取对应表单
else
icon = HeroConfig[id].Icon
end
if self.camp == 0 then
self.RootPanel.root:ShowRect_Skill(icon, G_SkillConfig[skill.id].Name, 1)
else
self.RootPanel.root:ShowRect_Skill(icon, G_SkillConfig[skill.id].Name, 2)
end
end
funFire()
end
end
function RoleView:PlaySkillCloseUpBefore(combat, skill, funFire)
BattleManager.PauseBattle()
self:DelayFunc(0.5, function()
-- self:SetBgColor(false, 0.2, self.RootPanel.BG)
local roles = self.RootPanel.GetRoles()
local roleUps = skill:GetDirectTargets()
for r, role in pairs(roles) do
local isFight = false
for _, roleup in pairs(roleUps) do
if r == roleup then
isFight = true
end
end
if isFight then
if not role.role:IsRealDead() then
role:SetHighLight(true, 1, 0.2)
end
else
if not role.role:IsRealDead() then
role:SetHighLight(false, 1, 0.01)
end
end
end
self:SetHighLight(true, 1, 0.2)
self:PlaySkillCloseUpNew(combat, funFire, skill)
-- SoundManager.PlayBattleSound("n1_snd_closeup_bg") 改到表里了
end)
end
--播放PV
function RoleView:PlayPV(combat, skill, func)
BattleManager.PauseBattle()
if self.playPV_LocalMove then
self.playPV_LocalMove:Kill()
end
--隐藏血条
self.RootPanel.EnemyPanel:SetActive(false)
self.RootPanel.MinePanel:SetActive(false)
--施法方移动到目标位置
local tarPos = FightCampTargetLocalPosition[self.role.camp][5] --己方5号位
local moveTime = 0.1
self.playPV_LocalMove = self.RoleLiveGO.transform.parent:DOLocalMove(tarPos, moveTime, false)
:SetEase(Ease.Linear)
:OnComplete(function()
BattleManager.ResumeBattle()
--播放PV
self:PlayPVPrefab(combat.PV, combat.PVDuration, self.role.camp == 0)
--播放声音
if combat.SkillSound then
local soundidx = math.random(1, #combat.SkillSound)
SoundManager.PlaySound(combat.SkillSound[soundidx])
end
if combat.SkillNameVoice then
SoundManager.PlaySound(combat.SkillNameVoice)
end
--施法目标
local targets = skill:GetDirectTargets()
self.RootPanel.SetRoleActive(self.role, combat.HideActor, false, targets)
self:DelayFunc(
combat.PVDuration / 1000,
function()
BattleManager.PauseBattle()
self.RootPanel.ResetHighLightWithTargets(true, targets, self)
self.RootPanel.SetRoleActive(self.role, combat.HideActor, true, targets)
--施法方归位
if self.playPV_LocalMove then
self.playPV_LocalMove:Kill()
end
local pos =self.role.position
if self.role.position == 99 or self.role.position==100 then
pos = 10
--LogError("pos 10 "..FightCampTargetLocalPosition[self.role.camp][pos].x)
end
tarPos = FightCampTargetLocalPosition[self.role.camp][pos] --自己原本位置
self.playPV_LocalMove = self.RoleLiveGO.transform.parent:DOLocalMove(tarPos, moveTime, false)
:SetEase(Ease.Linear)
:OnComplete(function ()
--显示血条
self.RootPanel.EnemyPanel:SetActive(true)
self.RootPanel.MinePanel:SetActive(true)
self.RootPanel.UpdateAllRoleHPPos()
--所有人显示
self.RootPanel.SetRoleActive(self.role, 999, true, targets)
BattleManager.ResumeBattle()
if func then
func()
end
-- pv放完后 位置拉回
self.RoleLiveGO.transform.parent.transform.localPosition = FightCampLocalPosition[self.role.camp][self.role.position]
end)
end)
end)
end
function RoleView:PlaySkillCloseUpNew(combat, func, skill)
self:PlayCloseup(combat)
if combat.CloseupSound then
SoundManager.PlayBattleSound(combat.CloseupSound)
end
--隐藏血条
self.RootPanel.EnemyPanel:SetActive(false)
self.RootPanel.MinePanel:SetActive(false)
self:DelayFunc(
combat.CloseupDuration / 1000,
function()
--如果有PV,继续隐藏血条
if not combat.PV then
--显示血条
self.RootPanel.EnemyPanel:SetActive(true)
self.RootPanel.MinePanel:SetActive(true)
end
local targets = skill:GetDirectTargets()
self.RootPanel.ResetHighLightWithTargets(true, targets, self)
BattleManager.ResumeBattle()
if func then
func()
end
end
)
end
local FightMovePosOffset = {
--mine enemy x = -x
Offset_All = Vector3.New(-3, 0, 0),
Offset_Front = Vector3.New(-3, 0, 0),
Offset_Behind = Vector3.New(-3, 0, 0),
Offset_COL_1 = Vector3.New(-3, 0, 0),
Offset_COL_2 = Vector3.New(-3, 0, 0),
Offset_COL_3 = Vector3.New(-3, 0, 0),
Offset_Single_1 = Vector3.New(-3, 0, 0),
Offset_Single_2 = Vector3.New(-3, 0, 0),
Offset_Single_3 = Vector3.New(-3, 0, 0),
Offset_Single_4 = Vector3.New(-3, 0, 0),
Offset_Single_5 = Vector3.New(-3, 0, 0),
Offset_Single_6 = Vector3.New(-3, 0, 0),
Offset_Single_7 = Vector3.New(-3, 0, 0),
Offset_Single_8 = Vector3.New(-3, 0, 0),
Offset_Single_9 = Vector3.New(-3, 0, 0),
Offset_Single_10 = Vector3.New(-3, 0, 0),
}
function RoleView:GetFightMovePos(skill)
local ret = nil
local chooseId = skill.effectList.buffer[1].chooseId
local chooseType = math.floor(chooseId / 100000)
local chooseLimit = math.floor(chooseId / 10000) % 10
local chooseNum = chooseId % 10
local targets = skill:GetDirectTargets()
local targetCamp
local targetPos
-- local targetCamp = targets[1].camp
-- local targetPos = targets[1].position
if targets and #targets > 0 then
targetCamp = targets[1].camp
targetPos = targets[1].position
end
local invert = targetCamp == 0 and 1 or -1
if targetPos==99 then targetPos = 10 end
-- LogError("targetPos "..targetPos)
---chooseType
---1:我方
---2:敌方
---3:自身
---4:仇恨目标
---5:我方阵亡
---6:我方含阵亡
---chooseLimit
---0:全体
---1:前排
---2:后排
---3:对列
---4:前2排
---5:后2排
---6:全体,优先4职业
---7:人数最多列
---8:除自己外
---9:全体,优先2职业
if chooseType == 4 then --目标身前 单体
local offset = Vector3.New(FightMovePosOffset["Offset_Single_" .. targetPos].x,
FightMovePosOffset["Offset_Single_" .. targetPos].y,
FightMovePosOffset["Offset_Single_" .. targetPos].z)
offset.x = invert * offset.x
ret = FightCampLocalPosition[targetCamp][targetPos] + offset
elseif chooseType == 2 then
if chooseLimit == 0 or chooseLimit == 6 or chooseLimit == 9 then
if chooseNum == 0 or chooseNum == 5 then --对方阵前 全体
local offset = Vector3.New(FightMovePosOffset.Offset_All.x, FightMovePosOffset.Offset_All.y, FightMovePosOffset.Offset_All.z)
offset.x = invert * offset.x
ret = FightCampLocalPosition[targetCamp][2] + offset
elseif chooseNum == 1 then --目标身前 单体
local offset = Vector3.New(FightMovePosOffset["Offset_Single_" .. targetPos].x, FightMovePosOffset["Offset_Single_" .. targetPos].y, FightMovePosOffset["Offset_Single_" .. targetPos].z)
offset.x = invert * offset.x
ret = FightCampLocalPosition[targetCamp][targetPos] + offset
else
--不移动
end
elseif chooseLimit == 1 or chooseLimit == 2 then --中间位置身前 1行
local offsetF = Vector3.New(FightMovePosOffset.Offset_Front.x, FightMovePosOffset.Offset_Front.y, FightMovePosOffset.Offset_Front.z)
offsetF.x = offsetF.x * invert
local offsetB = Vector3.New(FightMovePosOffset.Offset_Behind.x, FightMovePosOffset.Offset_Behind.y, FightMovePosOffset.Offset_Behind.z)
offsetB.x = offsetB.x * invert
if targetPos <= 3 then
ret = FightCampLocalPosition[targetCamp][2] + offsetF
else
ret = FightCampLocalPosition[targetCamp][5] + offsetB
end
elseif chooseLimit == 4 or chooseLimit == 5 then --前排中间位置身前 2行
targetPos = 100 --拿到最小的位置
for key, value in pairs(targets) do
if targetPos > value.position then
targetPos = value.position
end
end
local col = (targetPos - 1) % 3 + 1
local offset = Vector3.New(FightMovePosOffset["Offset_COL_" .. col].x, FightMovePosOffset["Offset_COL_" .. col].y, FightMovePosOffset["Offset_COL_" .. col].z)
offset.x = invert * offset.x
ret = FightCampLocalPosition[targetCamp][col] + offset
elseif chooseLimit == 3 or chooseLimit == 7 then --数字最小位置身前 1列
local col = (targetPos - 1) % 3 + 1
local offset = Vector3.New(FightMovePosOffset["Offset_COL_" .. col].x, FightMovePosOffset["Offset_COL_" .. col].y, FightMovePosOffset["Offset_COL_" .. col].z)
offset.x = invert * offset.x
ret = FightCampLocalPosition[targetCamp][col] + offset
else
--不移动
end
end
if ret then
ret = Vector3.New(ret.x, ret.y, ret.z - 0.01) --进攻方压住防守方
end
return ret
end
local FullEffectPosition = {
--mine enemy x = -x
Offset_All = Vector3.New(0, 0, 0),
Offset_Front = Vector3.New(0, 0, 0),
Offset_Behind = Vector3.New(0, 0, 0),
Offset_COL_1 = Vector3.New(0, 0, 0),
Offset_COL_2 = Vector3.New(0, 0, 0),
Offset_COL_3 = Vector3.New(0, 0, 0),
Offset_Single_1 = Vector3.New(0, 0, 0),
Offset_Single_2 = Vector3.New(0, 0, 0),
Offset_Single_3 = Vector3.New(0, 0, 0),
Offset_Single_4 = Vector3.New(0, 0, 0),
Offset_Single_5 = Vector3.New(0, 0, 0),
Offset_Single_6 = Vector3.New(0, 0, 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
--LogError("tarpos"..targetPos)
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 ret = nil
local chooseId = skill.effectList.buffer[1].chooseId
local chooseType = math.floor(chooseId / 100000)
local chooseLimit = math.floor(chooseId / 10000) % 10
local chooseNum = chooseId % 10
local targets = skill:GetDirectTargets()
if #targets == 0 then--技能没找到目标
return ret
end
local targetCamp = targets[1].camp
local targetPos = targets[1].position
local invert = targetCamp == 0 and 1 or -1
if targetPos==99 then targetPos=10 end
-- 0全体
-- 1前排
-- 2后排
-- 3对列
-- 4前2排
-- 5后2排
-- 6全体,优先4职业
-- 7人数最多一列
-- 8除自己外
-- 9全体,优先2职业
if chooseType == 4 then --目标身前 单体
ret = FightCampLPToSkillRoot[targetCamp][targetPos]
elseif chooseType == 2 then
if chooseLimit == 0 or chooseLimit == 6 or chooseLimit == 9 then
if chooseNum == 0 or chooseNum == 5 then --对方阵前 全体
ret = FightCampLPToSkillRoot[targetCamp][5]
elseif chooseNum == 1 then --目标身前 单体
ret = FightCampLPToSkillRoot[targetCamp][targetPos]
else
ret = FightCampLPToSkillRoot[targetCamp][5]
end
elseif chooseLimit == 1 or chooseLimit == 2 then --中间位置身前 1行
if targetPos <= 3 then
ret = FightCampLPToSkillRoot[targetCamp][2]
else
ret = FightCampLPToSkillRoot[targetCamp][8]
end
elseif chooseLimit == 4 then
ret = FightCampLPToSkillRoot[targetCamp][2]
elseif chooseLimit == 5 then
ret = FightCampLPToSkillRoot[targetCamp][5]
elseif chooseLimit == 3 or chooseLimit == 7 then --数字最小位置身前 1列
local col = (targetPos - 1) % 3 + 1
ret = FightCampLPToSkillRoot[targetCamp][col]
else
--不移动
end
else
ret = FightCampLPToSkillRoot[targetCamp][5]
end
return ret
end
-- 检测特效旋转
function RoleView:CheckRotate(go, orientation)
-- 判断是否旋转
if go == nil or 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, targetIdx)
if not skill then
return
end
-- 指定目标弹道特效
if combat.EffectType == 1 then
if combat.IsCannon == 0 then
local targets = skill:GetDirectTargets()
if targets==nil then return end
for _, target in ipairs(targets) do
self:RoleViewBullet(combat, target, skill)
end
else
self:RoleViewBullet(combat, skill:GetDirectTargets()[targetIdx], skill)
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 = Vector3.zero
if combat.Offset then
local offset_x = self.camp == 0 and combat.Offset[1] or -combat.Offset[1]
offset = Vector3.New(offset_x, combat.Offset[2], 0)
end
local go = self:loadAssetForScene(path, self.RootPanel.battleSceneSkillTransform)
if go then
-- 检测特效旋转
if self:CheckRotate(go, combat.Orientation) then
offset = -offset
end
go.transform.localScale = self.camp == 0 and Vector3.one or Vector3.New(-1, 1, 1)
go.transform.localPosition = pos + offset
self:PlayParticleSystem(path, go, nil, 4)
end
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 = Vector3.zero
if combat.Offset then
local offset_x = self.camp == 0 and combat.Offset[1] or -combat.Offset[1]
offset = Vector3.New(offset_x, combat.Offset[2], 0)
end
local go = self:loadAssetForScene(path, self.RootPanel.battleSceneSkillTransform)
go.transform.localScale = Vector3.one
if self.camp == 0 and combat.Orientation == 1 then
go.transform.localRotation = Vector3.New(0, 0, 180)
offset = -offset
else
go.transform.localRotation = Vector3.zero
end
-- 检测特效旋转
if self:CheckRotate(go, combat.Orientation) then
offset = -offset
end
go.transform.localPosition = spos + offset
go.transform.localScale = self.camp == 0 and Vector3.one or Vector3.New(-1, 1, 1)
self:PlayParticleSystem(path, go, nil, 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 path = combat.Bullet
local targets = skill:GetDirectTargets()
if targets == nil then return end
for _, target in ipairs(targets) do
local tv = self.RootPanel.GetRoleView(target)
if tv then
local offset = Vector3.zero
if combat.Offset then
local offset_x = self.camp == 0 and combat.Offset[1] or -combat.Offset[1]
offset = Vector3.New(offset_x, combat.Offset[2], 0)
end
--local go2 = self:loadAssetForScene(path, tv.RoleLiveGO.transform)
local go2 = self:loadAssetForScene(path, self.RootPanel.battleSceneSkillTransform)
-- 检测特效旋转
if self:CheckRotate(go2, combat.Orientation) then
offset = -offset
end
go2.transform.localScale = self.camp == 0 and Vector3.one or Vector3.New(-1, 1, 1)
go2.transform.position = tv.RoleLiveGO.transform.position
go2.transform.localPosition = go2.transform.localPosition + offset
self:PlayParticleSystem(path, go2, nil, 4)
end
end
-- 全屏特效屏幕中心
elseif combat.EffectType == 5 then
local path = combat.Bullet
local offset = Vector3.zero
if combat.Offset then
local offset_x = self.camp == 0 and combat.Offset[1] or -combat.Offset[1]
offset = Vector3.New(offset_x, combat.Offset[2], 0)
end
local go2 = self:loadAssetForScene(path, self.RootPanel.battleSceneSkillTransform)
-- 检测特效旋转
if self:CheckRotate(go2, combat.Orientation) then
offset = -offset
end
go2.transform.localScale = self.camp == 0 and Vector3.one or Vector3.New(-1, 1, 1)
go2.transform.localPosition = offset
self:PlayParticleSystem(path, go2, nil, 4)
--> 连线类型效果
elseif combat.EffectType == 6 then
local path = combat.Bullet
local offset = combat.Offset and Vector3.New(combat.Offset[1], combat.Offset[2], 0) or Vector3.zero
local speed = 100
local targets = skill:GetDirectTargets()
for _, target in ipairs(targets) do
local tv = self.RootPanel.GetRoleView(target)
if tv and tv ~= self then
local endV3 = tv.RoleLiveGO.transform.parent.position
local time = 0.1--dis / 100
local go = self:loadAssetForScene(path, self.RootPanel.battleSceneSkillTransform)
go.transform.localScale = self.camp == 0 and Vector3.one or Vector3.New(-1, 1, 1)
go.transform.position = self.RoleLiveGO.transform.position
Util.ClearTrailRender(go)
self:PlayParticleSystem(path, go, nil, time + combat.ReturnTime/1000)
--飞行子弹轨迹
DoTween.To(
DG.Tweening.Core.DOGetter_UnityEngine_Vector3(
function()
return go.transform.position
end
),
DG.Tweening.Core.DOSetter_UnityEngine_Vector3(
function(progress)
go.transform.position = progress
end
),
endV3,
time
):SetEase(Ease.InQuad)
end
end
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 = Vector3.zero
if combat.BeforeOffset then
local offset_x = self.camp == 0 and combat.BeforeOffset[1] or -combat.BeforeOffset[1]
offset = Vector3.New(offset_x, combat.BeforeOffset[2], 0)
end
-- 挂在人身上,以人物中心为原点
if combat.BeforeEffectType == 1 then
local sortingOrder = self:GetSortingOrder()
go = self:loadAssetForScene(path, self.RoleLiveGO.transform.parent)
-- 屏幕中心
elseif combat.BeforeEffectType == 2 then
go = self:loadAssetForScene(path, self.RootPanel.battleSceneSkillTransform)
end
-- 检测特效旋转
if self:CheckRotate(go, combat.BeforeOrientation) then
offset = -offset
end
go.transform.localScale = self.camp == 0 and Vector3.one or Vector3.New(-1, 1, 1)
go.transform.localPosition = Vector3.zero + offset
self:PlayParticleSystem(path, go, nil, 4)
end
-- 检测技能命中特效显示
function RoleView:CheckSkillHitEffect(checkType, combat, skill)
if not combat then return end
if checkType == "skill" then
-- 释放技能时检测,如果是范围命中效果
if combat.HitEffectType == 2 and combat.FriendHitEffect 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 = Vector3.zero
if combat.HitOffset then
local offset_x = self.camp == 0 and combat.HitOffset[1] or -combat.HitOffset[1]
offset = Vector3.New(offset_x, combat.HitOffset[2], 0)
end
local go = self:loadAssetForScene(combat.FriendHitEffect, self.RootPanel.battleSceneSkillTransform)
-- 检测特效旋转
if self:CheckRotate(go, combat.HitOrientation) then
offset = -offset
end
go.transform.localScale = self.camp == 0 and Vector3.one or Vector3.New(-1, 1, 1)
go.transform.localPosition = tpos + offset
self:PlayParticleSystem(combat.FriendHitEffect, go, nil, 5)
if combat.HitSound then
local soundidx = math.random(1, #combat.HitSound)
SoundManager.PlayBattleSound(combat.HitSound[soundidx])
end
elseif combat.HitEffectType == 1 then
-- 被击中时检测,如果是目标命中
if combat.FriendHitEffect then
local targets = skill:GetDirectTargets()
if targets then
for _, target in ipairs(targets) do
local tv = self.RootPanel.GetRoleView(target)
if tv ~= nil then
local go2 = self:loadAssetForScene(combat.FriendHitEffect, tv.RoleLiveGO.transform.parent)
--> offset 全部走 发射时转换的offset 因为有随机
local offset = Vector3.zero
if combat.HitOffset then
local offset_x = self.camp == 0 and combat.HitOffset[1] or -combat.HitOffset[1]
offset = Vector3.New(offset_x, combat.HitOffset[2], 0)
end
go2.transform.localScale = self.camp == 0 and Vector3.one or Vector3.New(-1, 1, 1)
go2.transform.localPosition = offset
go2.transform:SetParent(self.RootPanel.battleSceneSkillTransform, true)
go2.transform.localEulerAngles = Vector3.New(0, 0, 0)
self:PlayParticleSystem(combat.FriendHitEffect, go2, nil, 5)
--> image 即挂 imageAnimation的 节点播放完后会hide 缓存池中取出需重置
local image = Util.GetGameObject(go2, "root/Image")
if image then
image:SetActive(true)
end
if combat.HitSound then
local soundidx = math.random(1, #combat.HitSound)
SoundManager.PlaySound(combat.HitSound[soundidx])
end
end
end
end
end
end
elseif checkType == "hit" then
-- 被击中时检测,如果是目标命中
if combat.HitEffectType == 1 and combat.Hit then
local go2 = self:loadAssetForScene(combat.Hit, self.RoleLiveGO.transform.parent)
--> offset 全部走 发射时转换的offset 因为有随机
local offset = Vector3.zero
if combat.HitOffset then
local offset_x = self.camp == 0 and combat.HitOffset[1] or -combat.HitOffset[1]
offset = Vector3.New(offset_x, combat.HitOffset[2], 0)
end
go2.transform.localScale = self.camp == 0 and Vector3.one or Vector3.New(-1, 1, 1)
go2.transform.localPosition = offset
go2.transform:SetParent(self.RootPanel.battleSceneSkillTransform)
go2.transform.localEulerAngles = Vector3.New(0, 0, 0)
self:PlayParticleSystem(combat.Hit, go2, nil, 5)
--> image 即挂 imageAnimation的 节点播放完后会hide 缓存池中取出需重置
local image = Util.GetGameObject(go2, "root/Image")
if image then
image:SetActive(true)
end
-- local ani = go2.transform:GetComponent("ImageAnimation")
-- if ani then
-- ani:Play()
-- end
if combat.HitSound then
local soundidx = math.random(1, #combat.HitSound)
SoundManager.PlayBattleSound(combat.HitSound[soundidx])
end
end
if combat.HitSound then
local soundidx = math.random(1, #combat.HitSound)
SoundManager.PlaySound(combat.HitSound[soundidx])
end
end
end
-- 检测是否需要震动屏幕
function RoleView:checkShake(combat)
if combat.ShockScreen == 1 then
self.RootPanel:ShakeCamera(0.2, 0.2, 0.2, 0.2)
elseif combat.ShockScreen == 2 then
self.RootPanel:ShakeCamera(0.2, 0.4, 0.4, 0.4)
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, skill)
if not self.RootPanel.GetRoleView(target) then
return
end
if not combat then
return
end
if not skill then
return
end
local duration = combat.BulletTime / 1000
local bulletEffect = combat.Bullet
if not bulletEffect or bulletEffect == "" or duration == 0 then
return
end
-- 目标点位置加偏移
local targetRoleView = self.RootPanel.GetRoleView(target) --目标
local tempHitOffset = combat.HitOffset and combat.HitOffset or Vector3.zero
local target_x_offset = self.camp == 0 and -tempHitOffset[1] or tempHitOffset[1]
local endV3 = targetRoleView.RoleLiveGO.transform.parent.position + Vector3.New(target_x_offset, tempHitOffset[2], 0)
target.randHitPos = {}
local count = skill.attackCount
local function BulletFly()
--> 弹道特效
local go = self:loadAssetForScene(bulletEffect, self.RootPanel.battleSceneSkillTransform)
go.transform.localScale = Vector3.one
go.transform.localRotation = Vector3.zero
--起始位置
local temp = self.RoleLiveGO.transform.localPosition
local tempOffset = combat.Offset or Vector3.zero
local x_offset = self.camp == 0 and tempOffset[1] or -tempOffset[1]
self.RoleLiveGO.transform.localPosition = self.RoleLiveGO.transform.localPosition + Vector3.New(x_offset, tempOffset[2], 0)
go.transform.position = self.RoleLiveGO.transform.position
self.RoleLiveGO.transform.localPosition = temp
-- 旋转特效方向
local worldReduceX = endV3.x - go.transform.position.x
local worldReduceY = endV3.y - go.transform.position.y
local angle = math.acos(math.abs(worldReduceX) / math.sqrt(worldReduceX * worldReduceX + worldReduceY * worldReduceY)) * 57.29578
go.transform.localScale = self.camp == 0 and Vector3.one or Vector3.New(-1, 1, 1)
local isUp = endV3.y > go.transform.position.y
local rotateZ = 0
local isFlip = self.camp == 0 and 1 or -1
rotateZ = isUp and isFlip*angle or isFlip*-angle
--go.transform.localRotation = Vector3.New(0, 0, rotateZ)
if combat.IsBulletRotation == 1 then
go.transform:DORotate(Vector3.New(0, 0, rotateZ), 0)
end
Util.ClearTrailRender(go)
self:PlayParticleSystem(bulletEffect, go, nil, duration + 0.5)
PlayUIAnims(go)
--飞行子弹轨迹
DoTween.To(
DG.Tweening.Core.DOGetter_UnityEngine_Vector3(
function()
return go.transform.position
end
),
DG.Tweening.Core.DOSetter_UnityEngine_Vector3(
function(progress)
go.transform.position = progress
end
),
endV3,
duration
):SetEase(Ease.InQuad)
end
if count >= 1 and skill.attackCount - 1 == #skill.continueTime then
for i = 1, #skill.continueTime do
local time = 0
for j = 1, i do
time = time + skill.continueTime[j]
end
self:DelayFunc(
time,
function()
BulletFly()
end
)
end
BulletFly()
else
BulletFly()
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 = self:loadAssetForScene(path, self.RootPanel.battleSceneSkillTransform)
go.transform.localScale = Vector3.one
if camp == 0 then
go.transform.localPosition = Vector3.New(0,-3,0)
else
go.transform.localPosition = Vector3.New(0,3,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 go = self:loadAssetForScene(healEffect, self.RoleLiveGO.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:OnImmuneTrigger(buff)
if buff.type == BuffName.Control then
self:TextBuffFloating(TextFloatingColor.Blue, GetLanguageStrById(50278))
end
end
--护盾减伤
function RoleView:OnShildReduce(reduceValue)
-- self:ArtFloating(ArtFloatingType.ShieldDef, ArtFloatingColor.Shiled, reduceValue, false)
end
-- 盾效果触发
function RoleView:OnShieldTrigger(shield)
if shield.shieldType == ShieldTypeName.AllReduce then
self:ImageBuffFloating("z_zhandou_wudizi")
else
-- self:TextBuffFloating(TextFloatingColor.Blue, GetLanguageStrById(10275))
-- self:TextBuffFloating(TextFloatingColor.Blue, "减免"..shield.nowReduceValue)
-- if shield.nowReduceValue~= 0 then
-- self:ArtFloating(ArtFloatingType.ShieldDef, ArtFloatingColor.Shiled, shield.nowReduceValue, false)
-- end
end
end
-- 哈哈,没打着
function RoleView:OnBeHitMiss(atkRole, skill)
self:TextBuffFloating(TextFloatingColor.Blue, GetLanguageStrById(12218))
local sortingOrder = nil
local effName = "n1_eff_hit_miss"
local go = self:loadAssetForScene(effName, self.RoleLiveGO.transform)
go.transform.localScale = Vector3.one
go.transform.localPosition = Vector3.zero
go:SetActive(true)
self:AddDelayRecycleRes(effName, go, 3)
-- local sound = {"n1_snd_miss_expl_1", "n1_snd_miss_expl_2", "n1_snd_miss_expl_3"}
-- local soundidx = math.random(1, #sound)
-- SoundManager.PlaySound(sound[soundidx])
end
local DotTypeTip = {
[0] = GetLanguageStrById(10276),
[1] = GetLanguageStrById(10277),
[2] = GetLanguageStrById(10278),
[3] = GetLanguageStrById(10279),
[4] = GetLanguageStrById(12739),
[5] = GetLanguageStrById(12740),
[6] = GetLanguageStrById(12741),
[7] = GetLanguageStrById(10283),
}
--
function RoleView:OnDamaged(atkRole, dmg, bCrit, finalDmg, damageType, dotType, skill, isForbear,defRole,reduceSheild)
--反击伤害不计算到总伤害里面
if skill and skill.skillSubType ~= SkillSubType.BeatBack then
--LogError(atkRole.roleId.." : " ..SkillSumDamagedValue.."+"..dmg.."="..SkillSumDamagedValue+dmg)
SkillSumDamagedValue = SkillSumDamagedValue + dmg
end
if reduceSheild==nil then
reduceSheild = 0
end
--仅显示护盾显示
if reduceSheild > 0 then -- dmg <= 0 and
if skill and #skill.continueTime > 0 and skill.attackCount > 1 and #skill.continueTime == skill.attackCount - 1 then
local count = skill.attackCount
local d = math.floor(reduceSheild / count)
if count ~= 1 then
-- 后续伤害延迟打出
for i = 1, #skill.continueTime do
local time = 0
for j = 1, i do
time = time + skill.continueTime[j]
end
local bIsLastDamage = i == #skill.continueTime and true or false
self:DelayFunc(time, function ()
if d > 0 then
self:OnceDamaged(atkRole, dmg, bCrit, finalDmg, damageType, dotType, skill, bIsLastDamage, isForbear,d)
elseif bIsLastDamage then
self:OnceDamaged(atkRole, dmg, bCrit, finalDmg, damageType, dotType, skill, bIsLastDamage, isForbear,reduceSheild)
end
end)
end
-- 显示打出第一次护盾
if d > 0 then
local fd = reduceSheild - d * (count - 1)
self:OnceDamaged(atkRole, dmg, bCrit, finalDmg, damageType, dotType, skill, false, isForbear,fd)
end
else
self:OnceDamaged(atkRole, dmg, bCrit, finalDmg, damageType, dotType, skill, true, isForbear,reduceSheild)
end
else
self:OnceDamaged(atkRole, dmg, bCrit, finalDmg, damageType, dotType, skill, true, isForbear,reduceSheild)
end
-- 中断仅走护盾显示
if dmg <= 0 then
return
end
end
if skill and #skill.continueTime > 0 and skill.attackCount > 1 and #skill.continueTime == skill.attackCount - 1 then
local count = skill.attackCount
local d = math.floor(dmg / count)
-- 如果平均伤害小于0 则
if count ~= 1 then
-- 后续伤害延迟打出
for i = 1, #skill.continueTime do
local time = 0
for j = 1, i do
time = time + skill.continueTime[j]
end
local bIsLastDamage = i == #skill.continueTime and true or false
self:DelayFunc(time, function ()
if d > 0 then
self:OnceDamaged(atkRole, d, bCrit, finalDmg, damageType, dotType, skill, bIsLastDamage, isForbear)
elseif bIsLastDamage then
self:OnceDamaged(atkRole, dmg, bCrit, finalDmg, damageType, dotType, skill, bIsLastDamage, isForbear)
end
end)
end
-- 立刻打出第一次伤害
if d > 0 then
local fd = dmg - d * (count - 1)
self:OnceDamaged(atkRole, fd, bCrit, finalDmg, damageType, dotType, skill, false, isForbear)
end
else
self:OnceDamaged(atkRole, dmg, bCrit, finalDmg, damageType, dotType, skill, true, isForbear)
end
else
self:OnceDamaged(atkRole, dmg, bCrit, finalDmg, damageType, dotType, skill, true, isForbear)
end
end
--
function RoleView:OnceDamaged(atkRole, dmg, bCrit, finalDmg, damageType, dotType, skill, isLastDamage, isForbear,reduceSheild)
if self.isDead then
return
end
if reduceSheild == nil then reduceSheild = 0 end
--战斗粘滞
self.RootPanel:BattleSticky()
if reduceSheild > 0 then
self:ArtFloating(ArtFloatingType.ShieldDef, ArtFloatingColor.Shiled, reduceSheild, false)
else
if dotType then
if dotType == DotType.Poison then
-- self:ArtFloating(ArtFloatingType.PoisonDamage, ArtFloatingColor.Poison, dmg, isForbear)
self:TextBuffFloating(2, DotTypeTip[dotType]..dmg)
elseif dotType == DotType.Burn then
self:ArtFloating(ArtFloatingType.FireDamage, ArtFloatingColor.Fire, dmg, isForbear)
else
-- LogError("dot!!"..DotTypeTip[dotType]..dmg)
self:TextBuffFloating(2, DotTypeTip[dotType]..dmg)
end
else
if bCrit then -- 暴击红色并显示暴击
self:ArtFloating(ArtFloatingType.CritDamage, ArtFloatingColor.Red, dmg, isForbear)
else
if atkRole.isTeam then -- 异妖紫色
self:ArtFloating(ArtFloatingType.Damage, ArtFloatingColor.Purple, dmg, isForbear)
else
if skill and skill.type == BattleSkillType.Special then -- 技能黄色
self:ArtFloating(ArtFloatingType.Damage, ArtFloatingColor.Yellow, dmg, isForbear)
else -- 普攻白色
self:ArtFloating(ArtFloatingType.Damage, ArtFloatingColor.White, dmg, isForbear)
end
end
end
end
end
if skill then
local combat = BattleManager.GetSkillCombat(SkillLogicConfig[skill.id].SkillDisplay)
-- local strength = Vector3.New(0.8, 0, 0.4)
-- if combat.isRecoil == 0 then
-- strength = Vector3.New(0.4, 0, 0.4)
-- end
self.RoleLiveGO.transform:DOKill(true)
local startValue = self.RoleLiveGO.transform.localPosition.x;
local endValue = self.RoleLiveGO.transform.localPosition.x;
if self.camp ~= 0 then
endValue = endValue + 0.6
else
endValue = endValue - 0.6
end
self.RoleLiveGO.transform.localPosition = Vector3.New(endValue, self.RoleLiveGO.transform.localPosition.y, self.RoleLiveGO.transform.localPosition.z)
self.RoleLiveGO.transform:DOLocalMoveX(startValue, 0.3):SetEase(Ease.OutQuad)
if self.RoleLiveGO.name ~= "role_aijiyanhou" and not self.role.leader then
self:PlaySpineAnim(self.RoleLiveGOGraphic, 0, RoleAnimationName.Injured, false)
end
-- self.RoleLiveGO.transform:DOShakePosition(0.3, strength, 50, 10, false, true):OnComplete(
-- function()
-- self.RoleLiveGO.transform.localPosition = Vector3.zero
-- end
-- )
if self.DoColor_Spine_Tweener then
self.DoColor_Spine_Tweener:Kill()
end
self.DoColor_Spine_Tweener = Util.DoColor_Spine(self.RoleLiveGOGraphic, Color.New(1, 0, 0, 1), 0.3):OnComplete(
function()
self.DoColor_Spine_Tweener = Util.DoColor_Spine(self.RoleLiveGOGraphic, Color.New(1, 1, 1, 1), 0.1)
end
)
self:checkShake(combat)
self:CheckSkillHitEffect("hit", combat, skill)
-- 播放受击动画
if isLastDamage and not self.isDead and not self.role.leader then
if combat.isDiaup == 1 then
self:PlaySpineAnim(self.RoleLiveGOGraphic, 0, RoleAnimationName.Hurt, false)
end
end
end
--执行死亡动作
if isLastDamage and not self.isDead then
if self.isGoDead then
self:RealDead()
end
end
end
function RoleView:OnHealed(castRole)
if true then
return
end
local go = self:loadAssetForScene(healEffect, self.RoleLiveGO.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,
[BuffName.BEffect] = 8,
[BuffName.Brand] = 9,
[BuffName.Bond] = 10
}
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
elseif bType == BuffName.Immune then
cType = buff.immuneType
elseif bType == BuffName.Curse then
cType = buff.curseType
elseif bType == BuffName.BEffect then
cType = buff.bEffectType
elseif bType == BuffName.Bond then
cType = 15
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 node = self:loadAssetForScene(buffName, self.RoleLiveGO.transform)
node.transform.localScale = Vector3.one
node.transform.localPosition = offset and Vector3.New(offset[1], offset[2], 0) or Vector3.zero
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
--> 设置buff特效ordering
function RoleView:SetBuffOrdering()
--> 节点在人物上 所以只取节点的 不取Live的
local order = self.GameObject.transform.parent:GetComponent("Canvas").sortingOrder
for name, v in pairs(self.BuffEffectList) do
Util.SetParticleSortLayer(v.node, order)
end
end
--> 战斗播放动画期间 buff 隐藏
function RoleView:HideBuff(isHide)
for name, v in pairs(self.BuffEffectList) do
v.node:SetActive(not isHide)
end
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:AddBuff(buff,eConfig)
if not buff then
return
end
if not self.BuffList then
self.BuffList = {}
end
table.insert(self.BuffList,{ Buff = buff,Config = eConfig })
end
function RoleView:RemoveBuff(buff)
if not buff then
return
end
if not self.BuffList then
return
end
local rIndex
for k, v in ipairs(self.BuffList) do
if v.Buff == buff then
rIndex = k
break
end
end
if rIndex then
table.remove(self.BuffList, rIndex)
end
end
function RoleView:RemoveAllBuff()
if not self.BuffList then
return
end
self.BuffList = {}
end
function RoleView:OnBuffStart(buff)
-- 临时显示
if buff.type == BuffName.NoDead then
self:TextBuffFloating(2, GetLanguageStrById(10280))
return
end
local eConfig = self:GetBuffEffectConfig(buff)
if not eConfig then return end
-- LogError(string.format("buff.type:%s DescColorType:%s des:%s",buff.type,eConfig.DescColorType,GetLanguageStrById(eConfig.Describe)))
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, GetLanguageStrById(eConfig.Describe)..GetLanguageStrById(10281))
self:AddBuffIcon(buff, eConfig.Icon)
SoundManager.PlayBattleSound(SoundConfig.Sound_Buff)
else
self:AddBuffEffect(eConfig.DHit)
self:AddBuffEffect(eConfig.DContinue)
self:TextBuffFloating(eConfig.DDescColorType, GetLanguageStrById(eConfig.Describe)..GetLanguageStrById(10282))
self:AddBuffIcon(buff, eConfig.DIcon)
SoundManager.PlayBattleSound(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, GetLanguageStrById(eConfig.Describe))
end
self:AddBuffIcon(buff, eConfig.Icon)
end
self:AddBuff(buff,eConfig)
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)
-- -- 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, GetLanguageStrById(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)
-- LogError("buff"..buff.type.." ico"..eConfig.Icon)
end
self:RemoveBuff(buff)
end
function RoleView:OnDead()
self.isGoDead = true--受击到最后一下时检测,并执行死亡
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.materialPropertyBlock:SetFloat("_HP",0)
self.hpGo:SetPropertyBlock(self.materialPropertyBlock)
end
-- 暴毙
function RoleView:onBeSecKill()
self:TextBuffFloating(TextFloatingColor.Red, GetLanguageStrById(10284))
end
--通知死亡
function RoleView:OnRealDead()
-- self.isGoDead = true--受击到最后一下时检测,并执行死亡
--血条先隐藏 避免穿帮
-- self.GameObject:SetActive(false)
end
--执行死亡
function RoleView:RealDead()
self.isGoDead = false
self.isPlayDead = true --播放死亡动画
-- if self.camp == 0 then
-- Util.SetGray(self.RoleIconGO, true)
-- else
self.RoleLiveGO:SetActive(true)
local order = BattleLogic.CurOrder
self.GameObject:SetActive(false)
-- 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)
-- if self.shadow then
-- self.shadow:SetActive(false)
-- end
-- end
-- )
-- end
-- )
local _complete = nil
_complete = function(state)
-- BattleManager.ResumeBattle()
-- self.RoleLiveGOGraphic.color = Color.New(1, 1, 1, 1)
if order == BattleLogic.CurOrder then
self.RoleLiveGO:SetActive(false)
-- if self.shadow then
-- self.shadow:SetActive(false)
-- end
end
self.isPlayDead = false --播放死亡动画完成
--死亡动画执行完成,检查是否可复活
if self.isRelive then
self:RoleRelive()
end
end
--替换材质
local spineComponent = self.RoleLiveGOGraphic
self.spineDeadMaterial = poolManager:LoadAsset("spineDead", PoolManager.AssetType.Other);
local spineMaterial = spineComponent:GetComponent("MeshRenderer").sharedMaterial
local customMaterialOverride = spineComponent.CustomMaterialOverride
self.spineDeadMaterial = Material.New(self.spineDeadMaterial)
if spineMaterial then
self.spineDeadMaterial:SetTexture("_MainTex", spineMaterial:GetTexture("_MainTex"))
customMaterialOverride:Add(spineMaterial, self.spineDeadMaterial);
local startColor = Color.New(0.07843138, 0.145098, 1, 1)
local endColor = Color.New(startColor.r, startColor.g, startColor.b, 1)
if self.DoColor_Spine_Tweener then
self.DoColor_Spine_Tweener:Kill()
end
self.DoColor_Spine_Tweener = Util.DoColor_Spine(spineComponent, startColor, endColor, 0):OnComplete(
function()
startColor.a = 1
endColor.a = 0
self.DoColor_Spine_Tweener = Util.DoColor_Spine(spineComponent, startColor, endColor, 0.8):OnComplete(
function()
Util.SetColor_Spine(spineComponent, Color.New(1, 1, 1, 1))
--清除替换材质
local customMaterialOverride = spineComponent.CustomMaterialOverride
customMaterialOverride:Clear()
_complete()
end
)
end
)
else--材质找不到直接播放死亡
LogError(self.RoleLiveGO.name.." 材质球丢了")
_complete()
end
-- end
local color = Color.New(75, 75, 75, 255)/255
Util.SetColor(self.GameObject, color)
-- Util.SetColor(self.RoleLiveGOGraphic, color)
-- 回收所有buff相关效果
self:RemoveAllBuffEffect()
self:RemoveAllBuffIcon()
self:RemoveAllBuff()
-- self.RoleLiveGOGraphic.freeze = true
self.isDead = true
-- self.RootPanel:SetShake()
self.RootPanel:ShakeCamera()
local effName = "x1_eff_dead"
local go = self:loadAssetForScene(effName, self.RootPanel.battleSceneSkillTransform)
go.transform.localScale = Vector3.one
go.transform.position = self.RoleLiveGO.transform.position
go.transform:SetParent(self.RootPanel.skillEffectRoot.transform)
go:SetActive(true)
self:AddDelayRecycleRes(effName, go, 3)
-- local sound = {"n1_snd_destory"}
-- local soundidx = math.random(1, #sound)
-- SoundManager.PlaySound(sound[soundidx])
self.RootPanel:BattleSticky_Param(0.18, 0.5) -----死亡缓速
end
function RoleView:onRoleRelive()
self.isRelive = true --标记需要复活
if self.isDead then
if self.isPlayDead then
--等待死亡动画执行完,就可以复活了
else
self:RoleRelive()--直接执行复活
end
end
end
function RoleView:RoleRelive()
self.isDead = false
self.isRelive = false--已经执行复活了
--播放复活特效 策划修改了特效的名字需要核对
local effName = "x1_buff_fuhuo_elf"
local effect_relive = self:loadAssetForScene(effName, self.RoleLiveGO.transform.parent)
effect_relive.transform.localScale = Vector3.one
effect_relive.transform.localPosition = Vector3.zero
effect_relive:SetActive(true)
self:AddDelayRecycleRes(effName, effect_relive, 4)
--根据特效时机重新显示角色
self:DelayFunc(0.2,function ()
self.GameObject:SetActive(true)
self.RoleLiveGO:SetActive(true)
self:ResetSpineComponent(self.RoleLiveGOGraphic)
--显示重新显示所有buff
self:ReliveResetBuffIcon()
end)
--文字显示
self:TextBuffFloating(4, GetLanguageStrById(10285))
end
function RoleView:ReliveResetBuffIcon()
local list = BattleLogic.BuffMgr:GetBuff(self.role)
if #list> 0 then
for key, buff in pairs(list) do
if not buff.disperse then
local eConfig = self:GetBuffEffectConfig(buff)
self:AddBuffIcon(buff, eConfig.Icon)
end
end
end
end
function RoleView:OnEnd()
self.isPlay = false
end
function RoleView:OrderStart()
self.isPlay = true
end
function RoleView:Dispose()
-- 清空所有延迟方法
self:ClearDelayFunc()
self:ClearLoopFunc()
self.GameObject.transform.parent.localScale = Vector3.one
--立即回收延迟列表上的资源
for k, v in pairs(self.delayRecycleList) do
for i = 1, #v do
if v[i].type == PoolManager.AssetTypeGo.GameObjectFrame then
poolManager:UnLoadFrame(k, v[i].node)
else
poolManager:UnLoadAsset(k, v[i].node, PoolManager.AssetType.GameObject)
end
end
self.delayRecycleList[k] = nil
end
-- 回收所有buff相关效果
self:RemoveAllBuffEffect()
self:RemoveAllBuffIcon()
self:RemoveAllBuff()
if self.DoColor_Spine_Tweener then
self.DoColor_Spine_Tweener:Kill()
self.DoColor_Spine_Tweener = nil
end
self.RoleLiveGOGraphic:DOKill()
RoleView:ResetSpineComponent(self.RoleLiveGOGraphic)
poolManager:UnLoadSpine(self.livePath, self.RoleLiveGO)
BattlePool.RecycleItem(self.GameObject, BATTLE_POOL_TYPE.ENEMY_ROLE_2)
if self.spineDeadMaterial ~= nil then
GameObject.Destroy(self.spineDeadMaterial)
self.spineDeadMaterial = nil
end
end
--重置Spine脚本
function RoleView:ResetSpineComponent(spineComponent)
Util.SetColor_Spine(spineComponent, Color.white)
spineComponent.CustomMaterialOverride:Clear()
spineComponent.AnimationState:ClearEvent_Complete()
spineComponent.Skeleton:SetToSetupPose()
spineComponent.AnimationState:ClearTracks()
spineComponent.AnimationState:SetAnimation(0, RoleAnimationName.Stand, true)
end
---播放粒子特效
function RoleView:PlayParticleSystem(path, go, animationName, delayTime, delayFunc, delType, beforeFunc)
--显示自动播放粒子特效
go:SetActive(true)
--播放特效里的动画
local sg = Util.GetComponentInChildren(go, "spine-unity", "Spine.Unity.SkeletonAnimation", true)
if sg ~= nil then
if not animationName then
animationName = sg.AnimationName
end
sg.Skeleton:SetToSetupPose()
sg.AnimationState:ClearEvent_Complete()
sg.AnimationState:ClearTracks() -- 清除上一个动画的影响(修复概率攻击动画播放错误的问题)
sg.AnimationState:SetAnimation(0, animationName, false)
end
--设置相机
local effectCamera = go:GetComponent("EffectCamera")
if effectCamera and effectCamera.effectCamera then
if effectCamera.CameraAni then
--获取相机动画时长
local animator = effectCamera.CameraAni:GetComponent("Animator")
local animationTime = Util.GetAnimatorTime(animator)
effectCamera.CameraAni.localPosition = Vector3.New(go.transform.position.x * -go.transform.localScale.x, 0, -go.transform.position.z)
self.RootPanel:SetCameraParent(effectCamera.effectCamera)
self:DelayFunc(animationTime, function ()
--相机复位
if effectCamera and effectCamera.effectCamera then
if self.RootPanel.camera3D.transform.parent == effectCamera.effectCamera then --如果还是当时设置的父节点,就复位
self.RootPanel:SetCameraParent(self.RootPanel.camera3DPos)
end
end
end)
else
LogRed("特效的CameraAni = nil :" .. path)
end
end
self:AddDelayRecycleRes(path, go, delayTime, delayFunc, delType, function()
if beforeFunc then
beforeFunc()
end
end)
end
--播放特写
function RoleView:PlayCloseup(combat)
local go = self:loadAssetForScene(combat.Closeup, self.RootPanel.closeupPos)
go.transform.localPosition = Vector3.zero
go.transform.localEulerAngles = Vector3.zero
-- local localScale = Vector3.one
-- if self.role.camp ~= 0 then
-- localScale.x = localScale.x * -1
-- end
-- go.transform.localScale = localScale
--更换多语言资源
local left = Util.GetGameObject(go.gameObject, "Left/fontPos/font"):GetComponent("MeshRenderer").materials[0]
local right = Util.GetGameObject(go.gameObject, "Right/fontPos/font"):GetComponent("MeshRenderer").materials[0]
local name = left:GetTexture("_TextureSample0").name
local newName = GetPictureFont(string.sub(name, 1, #(name)-3))
local material = poolManager:LoadAsset(newName, PoolManager.AssetType.Other)
if material == nil then
LogRed("无" .. newName)
else
left:SetTexture("_TextureSample0", material)
right:SetTexture("_TextureSample0", material)
end
local closeupGo = nil
if self.camp == 0 then
Util.GetGameObject(go, "Left"):SetActive(true)
Util.GetGameObject(go, "Right"):SetActive(false)
closeupGo = Util.GetGameObject(go, "Left")
else
Util.GetGameObject(go, "Left"):SetActive(false)
Util.GetGameObject(go, "Right"):SetActive(true)
closeupGo = Util.GetGameObject(go, "Right")
end
--显示自动播放粒子特效
go:SetActive(true)
--播放特效里的动画
local sg = Util.GetComponentInChildren(closeupGo, "spine-unity", "Spine.Unity.SkeletonAnimation", true)
if sg ~= nil then
local animationName = sg.AnimationName
sg.Skeleton:SetToSetupPose()
sg.AnimationState:ClearEvent_Complete()
sg.AnimationState:ClearTracks() -- 清除上一个动画的影响(修复概率攻击动画播放错误的问题)
sg.AnimationState:SetAnimation(0, animationName, false)
end
--设置相机
local effectCamera = closeupGo:GetComponent("EffectCamera")
if effectCamera and effectCamera.effectCamera then
if effectCamera.CameraAni then
effectCamera.CameraAni.localPosition = Vector3.New(closeupGo.transform.position.x * -closeupGo.transform.localScale.x, 0, -closeupGo.transform.position.z)
self.RootPanel:SetCameraParent(effectCamera.effectCamera)
else
LogRed("特效的CameraAni = nil :" .. path)
end
end
self:AddDelayRecycleRes(combat.Closeup, go, combat.CloseupDuration / 1000, nil, nil, function()
--相机复位
if effectCamera and effectCamera.effectCamera then
self.RootPanel:SetCameraParent(self.RootPanel.camera3DPos)
end
end)
end
--播放PV的预制
function RoleView:PlayPVPrefab(pvPath, pvDuration, isLeft)
local go = self:loadAssetForScene(pvPath, self.RootPanel.pvPos)
local pvName
if isLeft then
pvName = "Left"
else
pvName = "Right"
end
local pvGo = Util.GetGameObject(go, pvName)
--显示自动播放粒子特效
pvGo:SetActive(true)
--播放特效里的动画
local sg = Util.GetComponentInChildren(go, "spine-unity", "Spine.Unity.SkeletonAnimation", true)
if sg ~= nil then
local animationName = sg.AnimationName
sg.Skeleton:SetToSetupPose()
sg.AnimationState:ClearEvent_Complete()
sg.AnimationState:ClearTracks() -- 清除上一个动画的影响(修复概率攻击动画播放错误的问题)
sg.AnimationState:SetAnimation(0, animationName, false)
end
--设置相机
local effectCamera = go:GetComponent("EffectCamera")
local cameraParent = nil
if effectCamera then
if isLeft then
if effectCamera.effectCamera_left then
cameraParent = effectCamera.effectCamera_left
else
cameraParent = effectCamera.effectCamera
end
else
if effectCamera.effectCamera_right then
cameraParent = effectCamera.effectCamera_right
else
cameraParent = effectCamera.effectCamera
end
end
end
if cameraParent then
self.RootPanel:SetCameraParent(cameraParent)
end
self:AddDelayRecycleRes(pvPath, go, pvDuration / 1000, nil, nil, function()
if cameraParent then
self.RootPanel:SetCameraParent(self.RootPanel.camera3DPos)
end
end)
end