| Main/System/Battle/BattleConst.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Main/System/Battle/BattleField/RecordActions/DeathRecordAction.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Main/System/Battle/BattleField/RecordActions/RebornRecordAction.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Main/System/Battle/BattleObject/BattleObject.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Main/System/Battle/Define/BattleDmgInfo.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Main/System/Battle/Define/DamageType.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Main/System/Battle/Motion/MotionBase.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Main/System/Battle/Skill/RebornSkill.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Main/System/Battle/Skill/SkillFactory.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
Main/System/Battle/BattleConst.cs
@@ -253,7 +253,7 @@ public const int BlockEffectID = 19999; // 格挡特效ID public const int RebornEffectID = 20000; // 复活特效ID public const int RebornEffectID = 10025; // 复活特效ID #endregion Main/System/Battle/BattleField/RecordActions/DeathRecordAction.cs
@@ -118,6 +118,11 @@ { isFinish = true; foreach (var kv in deathActionDict) { kv.Value.ForceFinish(); } // 直接结束 foreach (var deadPack in deadPackList) { Main/System/Battle/BattleField/RecordActions/RebornRecordAction.cs
@@ -1,6 +1,7 @@ using UnityEngine; using System.Collections.Generic; using System; using DG.Tweening; // 如果这个Action卡住了 大概率是因为 动作被其他动作中断了 导致没有回调 @@ -8,8 +9,15 @@ { private Action actionCallback; private float tweenDuration = 0.5f; private float keepDuration = 0.5f; private Sequence tweenSeq = DOTween.Sequence(); public RebornRecordAction(BattleField _battleField, BattleObject rebornObj, Action _callback) : base(RecordActionType.Reborn, _battleField, null) : base(RecordActionType.Reborn, _battleField, rebornObj) { actionCallback = _callback; } @@ -17,7 +25,6 @@ public override void Run() { if (isFinish) return; @@ -25,23 +32,58 @@ if (!isRunOnce) { isRunOnce = true; PlayRebornEffect(); } } // 做一个从透明到恢复的渐变的同时 播放特效 public void PlayRebornEffect() { // 播放复活特效 battleField.battleEffectMgr.PlayEffect(battleObject, BattleConst.RebornEffectID, battleObject.heroRectTrans, battleObject.Camp, battleObject.teamHero.modelScale); // 渐变 battleObject.motionBase.skeletonAnim.skeleton.A = 0f; battleField.battleTweenMgr.OnKillTween(tweenSeq); tweenSeq = DOTween.Sequence(); tweenSeq.Append(DOVirtual.Float(0f, 1f, tweenDuration / battleField.speedRatio, value => { battleObject.motionBase.skeletonAnim.skeleton.A = value; })); tweenSeq.Append(DOVirtual.DelayedCall(keepDuration / battleField.speedRatio, () => { battleObject?.AfterReborn(); actionCallback?.Invoke(); actionCallback = null; isFinish = true; } })); battleField.battleTweenMgr.OnPlayTween(tweenSeq); } public override void ForceFinish() { isFinish = true; if (!isRunOnce) if (isFinish) { actionCallback?.Invoke(); actionCallback = null; return; } battleField.battleTweenMgr.OnKillTween(tweenSeq); battleObject.motionBase.skeletonAnim.skeleton.A = 1f; battleObject?.AfterReborn(); actionCallback?.Invoke(); actionCallback = null; isFinish = true; base.ForceFinish(); } } Main/System/Battle/BattleObject/BattleObject.cs
@@ -476,23 +476,43 @@ buffMgr.RemoveAllBuff(); } public void OnReborn(HB427_tagSCUseSkill.tagSCUseSkillHurt vNetData) // 释放者就是复活者时调用 public void PreReborn(bool reviveSelf = false) { // 处理复活逻辑 heroGo.SetActive(true); motionBase.skeletonAnim.skeleton.A = 0f; motionBase.skeletonAnim.LateUpdate(); heroRectTrans.anchoredPosition = Vector2.zero; motionBase.ResetForReborn(reviveSelf); } // 复活action public void OnReborn(HB427_tagSCUseSkill.tagSCUseSkillHurt vNetData, bool reviveSelf = false) { heroGo.SetActive(true); motionBase.ResetForReborn(reviveSelf); heroRectTrans.anchoredPosition = Vector2.zero; motionBase.skeletonAnim.skeleton.A = 0f; motionBase.skeletonAnim.LateUpdate(); RebornRecordAction recordAction = new RebornRecordAction(battleField, this, () => { battleField.OnObjReborn((uint)ObjID); teamHero.curHp = GeneralDefine.GetFactValue(vNetData.CurHP, vNetData.CurHPEx); heroRectTrans.anchoredPosition = Vector2.zero; // Debug.LogError("OnReborn " + teamHero.curHp); teamHero.isDead = false; heroGo.SetActive(true); motionBase.ResetForReborn(); }); battleField.recordPlayer.InsertRecord(recordAction); } public void AfterReborn() { // 清空所有 motionBase.ResetForReborn(false); } // 伤害还要看 是否闪避 暴击 and so on 需要有一个DamageType 服务器应该会给 protected virtual BattleDmgInfo PopDamage(BattleHurtParam battleHurtParam) { Main/System/Battle/Define/BattleDmgInfo.cs
@@ -121,6 +121,10 @@ case ServerDamageType.Recovery: convertedAttackTypes |= (int)DamageType.Recovery; break; case ServerDamageType.Reborn: convertedAttackTypes |= (int)DamageType.Recovery; break; case ServerDamageType.Immune: convertedAttackTypes |= (int)DamageType.Immune; Main/System/Battle/Define/DamageType.cs
@@ -15,6 +15,8 @@ Damage = 2,//普通伤害 Recovery = 4,//治疗 Reborn = 8,//复活 Immune = 16,//免疫 Block = 32, //格挡 Main/System/Battle/Motion/MotionBase.cs
@@ -566,14 +566,18 @@ } // 新增:专门用于复活的完整重置方法 public void ResetForReborn() public void ResetForReborn(bool reviveSelf = false) { // 1. 清理所有动画轨道(包括死亡动画的轨道9) animState?.ClearTracks(); // 2. 清理所有回调和动作队列 trackEntryCallbacks.Clear(); // 如果复活技能是自己释放 这里不能清空 if (!reviveSelf) runningActions.Clear(); activeSkillTracks.Clear(); // 3. 重置子技能轨道池 @@ -617,6 +621,7 @@ // 10. 播放待机动画 PlayAnimation(MotionName.idle, true); skeletonAnim.LateUpdate(); } public void SetSpeedRatio(float ratio) Main/System/Battle/Skill/RebornSkill.cs
@@ -18,17 +18,90 @@ { for (int i = 0; i < hitList.Count; i++) { var hitInfo = hitList[i]; BattleObject targetObj = battleField.battleObjMgr.GetBattleObject((int)hitInfo.ObjID); if (targetObj != null) var hurt = hitList[i]; BattleObject battleObject = battleField.battleObjMgr.GetBattleObject((int)hitList[i].ObjID); if (battleObject != null) { targetObj.battleField.battleEffectMgr.PlayEffect(targetObj, BattleConst.RebornEffectID, targetObj.heroRectTrans, targetObj.Camp, targetObj.teamHero.modelScale); // B427中 tagSCUseSkillHurt 为复活的目标, HurtHP、HurtHPEx - 复活回血, CurHP、CurHPEx - 复活后的血量 targetObj.OnReborn(hitInfo); battleObject.OnReborn(hurt, hurt.ObjID == caster.teamHero.ObjID); } } // 处理主目标列表 foreach (var hurt in hitList) { BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID); if (target == null) { Debug.LogError("目标为空 target == null ObjId : " + hurt.ObjID); continue; } OnHitEachTarget(_hitIndex, target, hurt); } } protected override void OnHitEachTarget(int _hitIndex, BattleObject target, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt) { BattleHurtParam hurtParam = BattleUtility.CalcBattleHurtParam(this, _hitIndex, target, hurt, null, null); // 先调用目标受伤 target.Hurt(hurtParam); // 再调用施法者吸血/反伤 caster.OnHurtTarget(hurtParam); } public override void Cast() { bool isCasterReborn = IsRebornTarget(caster); // 如果是复活施法者 先调用预复活 把角色显示出来回到idle动画 if (isCasterReborn) { caster.PreReborn(true); } // for (int i = 0; i < tagUseSkillAttack.HurtList.Length; i++) // { // var hurt = tagUseSkillAttack.HurtList[i]; // BattleObject battleObject = battleField.battleObjMgr.GetBattleObject((int)tagUseSkillAttack.HurtList[i].ObjID); // if (battleObject != null) // { // battleObject.PreReborn(); // } // } base.Cast(); } private bool IsRebornTarget(BattleObject _battleObj) { if (null == _battleObj) return false; for (int i = 0; i < tagUseSkillAttack.HurtList.Length; i++) { var hurt = tagUseSkillAttack.HurtList[i]; BattleObject battleObject = battleField.battleObjMgr.GetBattleObject((int)tagUseSkillAttack.HurtList[i].ObjID); if (battleObject.ObjID == _battleObj.ObjID) { return true; } } return false; } public override void OnMiddleFrameStart(int times) { skillEffect.OnMiddleFrameStart(times); // 修复:添加空值检查 } // 技能中摇结束回调:通知技能效果处理中摇结束 public override void OnMiddleFrameEnd(int times, int hitIndex) { skillEffect.OnMiddleFrameEnd(times, hitIndex); // 修复:添加空值检查 } public override void OnFinalFrameEnd() { skillEffect?.OnFinalFrameEnd(); // 修复:添加空值检查 } } Main/System/Battle/Skill/SkillFactory.cs
@@ -78,7 +78,7 @@ skill = new MountBuffSkill(_caster, skillConfig, vNetData, packList, battleField); break; default: Debug.LogError("超出了技能类型范围 请检查配置, 目前暂时只支持攻击类型的技能 " + skillConfig.SkillType); Debug.LogError(skillConfig.SkillID + " : 超出了技能类型范围 请检查配置, 目前暂时只支持攻击类型的技能 " + skillConfig.SkillType); break; }