diff --git a/Assets/ManagedResources/~Lua/Modules/Battle/BattleManager.lua b/Assets/ManagedResources/~Lua/Modules/Battle/BattleManager.lua index 4ed2fe1a9c..ea376dadd4 100644 --- a/Assets/ManagedResources/~Lua/Modules/Battle/BattleManager.lua +++ b/Assets/ManagedResources/~Lua/Modules/Battle/BattleManager.lua @@ -815,6 +815,7 @@ function this.GetSkillCombat(id) BeforeBullet = combat.BeforeBullet, SkillNumber = combat.SkillNumber, SkillDuration = combat.SkillDuration, + DamageDelay = combat.DamageDelay, BeforeOrientation = combat.BeforeOrientation, Orientation = combat.Orientation, HitOrientation = combat.HitOrientation, diff --git a/Assets/ManagedResources/~Lua/Modules/Battle/View/Unit/EnemyView.lua b/Assets/ManagedResources/~Lua/Modules/Battle/View/Unit/EnemyView.lua index d77358fcd0..3ed0e19415 100644 --- a/Assets/ManagedResources/~Lua/Modules/Battle/View/Unit/EnemyView.lua +++ b/Assets/ManagedResources/~Lua/Modules/Battle/View/Unit/EnemyView.lua @@ -417,10 +417,16 @@ local DotTypeTip = { } -- function EnemyView: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) + if skill then + -- 技能配置 + local combatId = BattleManager.GetCombatIdBySkin(skill.id, atkRole.roleData.skinId) + local combat = BattleManager.GetSkillCombat(combatId) + -- + local delay = combat.DamageDelay or 0 + local continue = skill.continueTime or 0 + local count = skill.attackCount or 1 + local space = continue / count + local d = math.floor(dmg / count) -- 如果平均伤害小于0 则 if d == 0 then d = dmg @@ -429,22 +435,36 @@ function EnemyView:OnDamaged(atkRole, dmg, bCrit, finalDmg, damageType, dotType, if BattleManager.IsBattleTestPanel() then LogYellow(string.format("目标阵营:%s, 位置:%s, 总伤害:%s, 伤害段数:%s,每段伤害:%s", self.camp, self.role.position, dmg, count, d)) 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 + -- 伤害文字延时,有些受击特效不是立刻播放文字 + self:DelayFunc(delay/1000, function() + -- 伤害文字 + 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) + -- 被伤害卡牌表现 + self:DOHitEffect(continue) + else + self:OnceDamaged(atkRole, dmg, bCrit, finalDmg, damageType, dotType, skill) + -- 被伤害卡牌表现 + self:DOHitEffect() + end + end) + -- 播放特效 + self.SkillCaster:CheckSkillHitEffect("hit", combat, skill) else if BattleManager.IsBattleTestPanel() then LogYellow(string.format("目标阵营:%s, 位置:%s, 总伤害:%s", self.camp, self.role.position, dmg)) end + -- 伤害文字 self:OnceDamaged(atkRole, dmg, bCrit, finalDmg, damageType, dotType, skill) + -- 被伤害卡牌表现 + self:DOHitEffect() end end -- @@ -476,26 +496,35 @@ function EnemyView:OnceDamaged(atkRole, dmg, bCrit, finalDmg, damageType, dotTyp end end end - 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) - -- 受击放大1.2倍 - self:DoScale(1.2, 0.3, function() - self:DoScale(1, 0.1) - end) -- 播放受击动画 self:PlaySpineAnim(self.RoleLiveGOGraphic, 0, "hit", false) - -- bo - if skill then - local combatId = BattleManager.GetCombatIdBySkin(skill.id, atkRole.roleData.skinId) - local combat = BattleManager.GetSkillCombat(combatId) - self.SkillCaster:CheckSkillHitEffect("hit", combat, skill) - end end +-- 播放卡牌受击效果 +function EnemyView:DOHitEffect(time, func) + -- 时间修正 + if not time or time < 0.3 then + time = 0.3 + end + -- 受击放大1.2倍 + self:DoScale(1.2, 0.1) + -- 卡面变红 + self.RoleLiveGOGraphic:DOColor(Color.New(1,0,0,1), 0.1):OnComplete(function () + self.RoleLiveGOGraphic:DOColor(Color.New(1,1,1,1), 0.1):SetDelay(time) + end) + -- 震动 + self.RoleLiveGOTran:DOShakeAnchorPos(time, Vector2.New(200, 100), 100, 50, false, true):OnComplete(function () + self.RoleLiveGO.transform.anchoredPosition = Vector2.New(self.outOffset[1], self.outOffset[2] ) + -- 恢复大小 + self:DoScale(1, 0.1) + -- 回调 + if func then + func() + end + end) +end + + function EnemyView:OnHealed(castRole) local sortingOrder = nil local go = BattleManager.LoadAsset(healEffect, sortingOrder) diff --git a/Assets/ManagedResources/~Lua/Modules/Battle/View/Unit/PlayerView.lua b/Assets/ManagedResources/~Lua/Modules/Battle/View/Unit/PlayerView.lua index 9cd04fcfb1..933beacf1d 100644 --- a/Assets/ManagedResources/~Lua/Modules/Battle/View/Unit/PlayerView.lua +++ b/Assets/ManagedResources/~Lua/Modules/Battle/View/Unit/PlayerView.lua @@ -456,10 +456,16 @@ local DotTypeTip = { } -- function PlayerView: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) + if skill then + -- 技能配置 + local combatId = BattleManager.GetCombatIdBySkin(skill.id, atkRole.roleData.skinId) + local combat = BattleManager.GetSkillCombat(combatId) + -- + local delay = combat.DamageDelay or 0 + local continue = skill.continueTime or 0 + local count = skill.attackCount or 1 + local space = continue / count + local d = math.floor(dmg / count) -- 如果平均伤害小于0 则 if d == 0 then d = dmg @@ -468,22 +474,36 @@ function PlayerView:OnDamaged(atkRole, dmg, bCrit, finalDmg, damageType, dotType if BattleManager.IsBattleTestPanel() then LogYellow(string.format("目标阵营:%s, 位置:%s, 总伤害:%s, 伤害段数:%s,每段伤害:%s", self.camp, self.role.position, dmg, count, d)) 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 + -- 伤害文字延时,有些受击特效不是立刻播放文字 + self:DelayFunc(delay/1000, function() + -- 伤害文字 + 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) + -- 被伤害卡牌表现 + self:DOHitEffect(continue) + else + self:OnceDamaged(atkRole, dmg, bCrit, finalDmg, damageType, dotType, skill) + -- 被伤害卡牌表现 + self:DOHitEffect() + end + end) + -- 播放特效 + self.SkillCaster:CheckSkillHitEffect("hit", combat, skill) else if BattleManager.IsBattleTestPanel() then LogYellow(string.format("目标阵营:%s, 位置:%s, 总伤害:%s", self.camp, self.role.position, dmg)) end + -- 伤害文字 self:OnceDamaged(atkRole, dmg, bCrit, finalDmg, damageType, dotType, skill) + -- 被伤害卡牌表现 + self:DOHitEffect() end end -- @@ -515,43 +535,49 @@ function PlayerView:OnceDamaged(atkRole, dmg, bCrit, finalDmg, damageType, dotTy end end end + -- 播放受击动画 + self:PlaySpineAnim(self.RoleLiveGOGraphic, 0, "hit", false) +end + +-- 播放卡牌受击效果 +function PlayerView:DOHitEffect(time, func) + -- 时间修正 + if not time or time < 0.3 then + time = 0.3 + end + -- 受击放大1.2倍 + self:DoScale(1.2, 0.1) -- 卡面变红 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() + end), 0, 0.1):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), 1, 0.1):SetEase(Ease.Linear):SetDelay(time) end) - - self.GameObject.transform.parent:DOShakeAnchorPos(0.3, Vector2.New(200, 100), 100, 50, false, true):OnComplete(function () + -- 震动 + self.GameObject.transform.parent:DOShakeAnchorPos(time, Vector2.New(200, 100), 100, 50, false, true):OnComplete(function () if self.GameObject then self.GameObject.transform.parent.anchoredPosition = Vector2.New(self.role.position == 1 and -145 or 0, -221) end - end) - - -- 受击放大1.2倍 - self:DoScale(1.2, 0.3, function() + -- 恢复大小 self:DoScale(1, 0.1) + -- 回调 + if func then + func() + end end) - -- 播放受击动画 - self:PlaySpineAnim(self.RoleLiveGOGraphic, 0, "hit", false) - - -- 播放受击特效 - if skill then - local combatId = BattleManager.GetCombatIdBySkin(skill.id, atkRole.roleData.skinId) - local combat = BattleManager.GetSkillCombat(combatId) - self.SkillCaster:CheckSkillHitEffect("hit", combat, skill) - end end + + function PlayerView:OnHealed(castRole) local sortingOrder = self.GameObject:GetComponent("Canvas").sortingOrder + 21 local go = BattleManager.LoadAsset(healEffect, sortingOrder)