yyl
7 小时以前 6a4866771ba5910842c5908cc01eedc9e85aff59
125 战斗 复活技能提交 等待技能配置提交(前中后摇的复活技能配置)
9个文件已修改
197 ■■■■ 已修改文件
Main/System/Battle/BattleConst.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/RecordActions/DeathRecordAction.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/RecordActions/RebornRecordAction.cs 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleObject/BattleObject.cs 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Define/BattleDmgInfo.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Define/DamageType.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Motion/MotionBase.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Skill/RebornSkill.cs 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Skill/SkillFactory.cs 2 ●●● 补丁 | 查看 | 原始文档 | 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;
        }