hch
2026-01-27 60275f016e144fddeaab0e2fb8b13dd5d6ddbbc8
Main/System/Battle/Skill/SkillBase.cs
@@ -35,7 +35,7 @@
    public bool isPlay = false;
    //  父RecordAction(SkillRecordAction),用于子技能建立父子关系
    protected RecordAction parentRecordAction;
    protected SkillRecordAction ownRecordAction;
    
    //  技能动画是否播放完成(针对有动画的技能)
    protected bool isMotionCompleted = false;
@@ -73,9 +73,9 @@
    }
    //  设置父RecordAction
    public void SetParentRecordAction(RecordAction recordAction)
    public void SetOwnRecordAction(SkillRecordAction recordAction)
    {
        parentRecordAction = recordAction;
        ownRecordAction = recordAction;
    }
#if UNITY_EDITOR
@@ -513,6 +513,10 @@
                {
                    break;
                }
                if (ssc.SkillType == 8)
                {
                    break;
                }
                SkillRecordAction skillRecordAction = CustomHB426CombinePack.CreateSkillAction(battleField.guid, new List<GameNetPackBasic> { skillPack });
                allSubSkills.Add((skillPack.packUID, skillRecordAction));
                removePackList.Add(pack);
@@ -530,9 +534,20 @@
                {
                    break;
                }
                if (ssc.SkillType == 8)
                {
                    break;
                }
                SkillRecordAction skillRecordAction = combinePack.CreateSkillAction();
                allSubSkills.Add((sp.packUID, skillRecordAction));
                removePackList.Add(pack);
                if (skillRecordAction.useParentRecordPlayer)
                {
                    break;
                }
            }
        }
@@ -546,11 +561,13 @@
        foreach (var (packUID, recordAction) in allSubSkills)
        {
            battleField.recordPlayer.ImmediatelyPlay(recordAction);
            if (recordAction.IsNeedWaiting())
            if (recordAction.useParentRecordPlayer)
            {
                currentWaitingSkill.Add(recordAction);
                ownRecordAction.GetInnerRecordPlayer().PlayRecord(recordAction, ownRecordAction);
            }
            else
            {
                ownRecordAction.GetInnerRecordPlayer().ImmediatelyPlay(recordAction);
            }
        }
    }
@@ -814,12 +831,12 @@
#endif
        // 先调用目标受伤
        DeathRecordAction recordAc = target.Hurt(hurtParam, parentRecordAction);
        DeathRecordAction recordAc = target.Hurt(hurtParam, ownRecordAction);
        if (null != recordAc)
        {
            tempDeadPackList.Remove(hurtParam.hurter.hurtObj.ObjID);
            battleField.recordPlayer.ImmediatelyPlay(recordAc, parentRecordAction, true);
            ownRecordAction.GetInnerRecordPlayer().ImmediatelyPlay(recordAc, ownRecordAction, true);
            currentWaitingSkill.Add(recordAc);
        }
        
@@ -909,7 +926,7 @@
            // 【使用 parentRecordAction.innerRecordPlayer】
            // 原因:HP刷新包是技能内部产生的,应该由当前SkillRecordAction的innerRecordPlayer管理
            // 这样可以确保HP刷新与技能的生命周期绑定,ForceFinish时一并处理
            PackageRegeditEx.DistributeToRecordAction(refreshPack, parentRecordAction);
            PackageRegeditEx.DistributeToRecordAction(refreshPack, ownRecordAction);
            packList.Remove(refreshPack);
        }
    }
@@ -975,7 +992,7 @@
            // 【使用 parentRecordAction.innerRecordPlayer】
            // 原因:掉落包是技能效果的一部分,应该由当前SkillRecordAction管理
            // 掉落包的分发与技能完成绑定,确保在技能ForceFinish时正确处理
            PackageRegeditEx.DistributeToRecordAction(_dropPack, parentRecordAction);
            PackageRegeditEx.DistributeToRecordAction(_dropPack, ownRecordAction);
            packList.Remove(_dropPack);
        }
@@ -1233,6 +1250,7 @@
            return false;
        }
        // 检查最终完成状态
        if (isFinished && moveFinished)
        {
@@ -1243,7 +1261,7 @@
            }
            //  如果自己内部的recora action的 inner record player还有没执行完的包 也是返回false
            if (parentRecordAction != null && parentRecordAction.GetInnerRecordPlayer().IsPlaying())
            if (ownRecordAction != null && ownRecordAction.GetInnerRecordPlayer().IsPlaying())
            {
                return false;
            }
@@ -1254,16 +1272,16 @@
                battleField.RemoveCastingSkill(caster.ObjID, this);
                
                //  传递parentRecordAction,让死亡技能等待当前技能完成
                DeathRecordAction recordAction = battleField.OnObjsDead(new List<BattleDeadPack>(tempDeadPackList.Values));
                DeathRecordAction recordAction = battleField.OnObjsDead(new List<BattleDeadPack>(tempDeadPackList.Values), null, ownRecordAction);
                if (null != recordAction)
                {
                    parentRecordAction.GetInnerRecordPlayer().ImmediatelyPlay(recordAction);
                    ownRecordAction.GetInnerRecordPlayer().ImmediatelyPlay(recordAction);
                    tempDeadPackList.Clear();
                    return false;
                }
            }
            return true;
            return !ownRecordAction.GetInnerRecordPlayer().IsPlaying();
        }
        return false;
@@ -1286,8 +1304,9 @@
        RecordAction rc = battleField.OnObjsDead(new List<BattleDeadPack>(tempDeadPackList.Values));
        if (null != rc)
        {
            parentRecordAction.GetInnerRecordPlayer().ImmediatelyPlay(rc);
            ownRecordAction.GetInnerRecordPlayer().ImmediatelyPlay(rc);
        }
        tempDeadPackList.Clear();
        // 1. 强制结束技能效果
        skillEffect?.ForceFinished();
@@ -1328,12 +1347,6 @@
            // 取消幻影效果
            caster.motionBase?.ShowIllusionShadow(false);
            // 播放待机动画(如果还活着)
            if (!caster.teamHero.isDead)
            {
                caster.motionBase?.ResetForReborn(false);
            }
        }
        // 5. 恢复 UI 状态
@@ -1458,11 +1471,20 @@
            if (pack is CustomHB426CombinePack combinePack && combinePack.startTag.Tag.StartsWith("Skill_"))
            {
                BattleDebug.LogError("other skill casting " + combinePack.startTag.Tag);
                var skillRecordAction = combinePack.CreateSkillAction();
                skillRecordAction.fromSkill = this;
                currentWaitingSkill.Add(skillRecordAction);
                parentRecordAction.GetInnerRecordPlayer().PlayRecord(skillRecordAction);
                //  需要给真正parent播的
                if (skillRecordAction.useParentRecordPlayer && skillRecordAction.parentSkillAction != null)
                {
                    skillRecordAction.parentSkillAction.GetInnerRecordPlayer().PlayRecord(skillRecordAction);
                }
                else
                {
                    ownRecordAction.GetInnerRecordPlayer().PlayRecord(skillRecordAction);
                }
                return false;
            }
            else if (IsBuffPack(pack))
@@ -1495,7 +1517,7 @@
                // 【使用 parentRecordAction.innerRecordPlayer】
                // 原因:技能执行过程中的包(Buff、属性刷新等)是技能效果的一部分
                // 应该由SkillRecordAction的innerRecordPlayer管理,确保与技能生命周期一致
                PackageRegeditEx.DistributeToRecordAction(pack, parentRecordAction);
                PackageRegeditEx.DistributeToRecordAction(pack, ownRecordAction);
            }
        }
@@ -1566,7 +1588,7 @@
            // 【使用 parentRecordAction.innerRecordPlayer】
            // 原因:Buff包是技能效果的核心组成部分,应该由SkillRecordAction管理
            // 即使是强制分发的情况,也要保持在正确的RecordAction上下文中
            PackageRegeditEx.DistributeToRecordAction(pack, parentRecordAction);
            PackageRegeditEx.DistributeToRecordAction(pack, ownRecordAction);
        }
    }