yyl
4 天以前 7935e509ef7a17cfcaceb81944745b19f8b7087c
花鬘自身复活问题修复

(cherry picked from commit 9f132e559085257c141d86697eda693ceb02c5b7)
4个文件已修改
93 ■■■■■ 已修改文件
Main/System/Battle/BattleField/RecordActions/RebornRecordAction.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Motion/MotionBase.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/RecordPlayer/RecordPlayer.cs 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Skill/RebornSkill.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/RecordActions/RebornRecordAction.cs
@@ -46,6 +46,8 @@
        if (!isRunOnce)
        {
            isRunOnce = true;
            //  复活动画开始,锁住 recordPlayer,owner=this 允许自身继续执行,其余等待
            battleField.recordPlayer.SetExclusiveLock(true, this);
            PlayRebornEffect();
        }
    }
@@ -63,6 +65,7 @@
        {
            actionCallback?.Invoke();
            actionCallback = null;
            battleField.recordPlayer.SetExclusiveLock(false, null);
            isActionCompleted = true;
            isFinish = true;
            return;
@@ -100,6 +103,8 @@
            }
            actionCallback?.Invoke();
            actionCallback = null;
            //  复活流程结束,解锁
            battleField.recordPlayer.SetExclusiveLock(false, null);
            isActionCompleted = true;  // 标记动作完成
            isFinish = true;
        }));
@@ -117,6 +122,9 @@
        battleField.battleTweenMgr.OnKillTween(tweenSeq);
        //  强制结束时也要解锁
        battleField.recordPlayer.SetExclusiveLock(false, null);
        foreach (var bo in rebornObjs)
        {
            var battleObj = bo;
Main/System/Battle/Motion/MotionBase.cs
@@ -789,7 +789,7 @@
        if (Launch.Instance != null && Launch.Instance.isOpenBattleDebug)
        {
            string owner = skeletonAnim != null && skeletonAnim.gameObject != null ? skeletonAnim.gameObject.name : "(no-skel)";
            BattleDebug.LogError($"[MotionBase.ResetForReborn owner={owner} hash={GetHashCode()}] reviveSelf={reviveSelf} 调用栈:\n{UnityEngine.StackTraceUtility.ExtractStackTrace()}");
             BattleDebug.LogError($"[MotionBase.ResetForReborn owner={owner} hash={GetHashCode()}] reviveSelf={reviveSelf} 调用栈:\n{UnityEngine.StackTraceUtility.ExtractStackTrace()}");
        }
#endif
        // 跟 HaveRest 同理:先强制结束所有正在运行的 skillBase,
Main/System/Battle/RecordPlayer/RecordPlayer.cs
@@ -19,6 +19,27 @@
    private bool isForceFinish = false;
    //  立即播放并接管队列:正在并发运行、current结束后若尚未完成则提升为currentRecordAction
    private RecordAction pendingTakeoverAction = null;
    //  复活独占锁:锁住期间只有 owner 可以执行,其他 RecordAction 保留并等待解锁
    private bool isExclusiveLocked = false;
    //  持有独占锁的 action(允许它在锁住期间继续执行)
    private RecordAction exclusiveLockOwner = null;
    /// <summary>
    /// 设置独占锁。<br/>
    /// locked=true 时:暂停 owner 之外的 RecordAction 调度,已有队列和新入队 action 均保留等待。
    /// locked=false 时解锁,恢复正常调度。
    /// </summary>
    public void SetExclusiveLock(bool locked, RecordAction owner = null)
    {
        isExclusiveLocked = locked;
        exclusiveLockOwner = locked ? owner : null;
    }
    public bool IsExclusiveLocked => isExclusiveLocked;
    public bool IsForceFinish
    {
        get { return isForceFinish; }
@@ -169,6 +190,27 @@
        }
    }
    /// <summary>
    /// 立即开始并发播放 recordAction,同时将其设为「队列接管者」:
    /// 当 currentRecordAction 播放完毕时,若该 action 尚未结束,
    /// 则将其从 immediatelyActionList 提升为新的 currentRecordAction,
    /// 阻止队列继续推进,直到它也完成为止。
    /// </summary>
    public void ImmediatelyPlayThenBlockQueue(RecordAction recordAction)
    {
        if (recordAction == null) return;
        recordAction.actionOwner = this;
        if (isForceFinish || stepForcefinish)
        {
            recordAction.ForceFinish();
            return;
        }
        //  立即加入并发列表,开始执行
        immediatelyActionList.Add(recordAction);
        //  标记为待接管者,current结束后由 Run() 将其提升
        pendingTakeoverAction = recordAction;
    }
    public void InsertRecord(RecordAction recordAction, int position = 0)
    {
        if (recordAction == null) return;
@@ -298,6 +340,12 @@
                    removeIndexList.Add(i);
                    continue;
                }
                //  独占锁期间,非 owner 的 immediate action 只等待,不执行也不移除
                if (isExclusiveLocked && action != exclusiveLockOwner)
                {
                    continue;
                }
                
                //  检查是否可以开始执行(WaitingPlay条件检查)
                if (!action.CanStartExecution())
@@ -370,6 +418,12 @@
    {
        ImmediatelyPlayRun();
        //  独占锁期间,主线 current/queue 暂停,只允许 owner 继续执行
        if (isExclusiveLocked && (exclusiveLockOwner == null || currentRecordAction != exclusiveLockOwner))
        {
            return;
        }
        // 等待下一个action
        if (isWaitingNextAction)
        {
@@ -387,7 +441,7 @@
        if (currentRecordAction == null)
        {
            if (recordActionQueue.Count <= 0)
            if (recordActionQueue.Count <= 0 && pendingTakeoverAction == null)
            {
                return;
            }
@@ -419,6 +473,21 @@
        if (currentRecordAction == null)
        {
            //  检查是否有待接管的 action
            if (pendingTakeoverAction != null)
            {
                if (!pendingTakeoverAction.IsFinished())
                {
                    //  提升为 currentRecordAction,阻塞队列推进
                    immediatelyActionList.Remove(pendingTakeoverAction);
                    currentRecordAction = pendingTakeoverAction;
                    pendingTakeoverAction = null;
                    return;
                }
                //  已经完成,直接清除,不阻塞
                pendingTakeoverAction = null;
            }
            if (recordActionQueue.Count > 0)
            {
                currentRecordAction = recordActionQueue.Dequeue();
@@ -457,6 +526,9 @@
    {
        currentRecordAction?.ForceFinish();
        currentRecordAction = null;
        pendingTakeoverAction = null;
        isExclusiveLocked = false;
        exclusiveLockOwner = null;
        recordActionQueue.Clear();
        immediatelyActionList.Clear();
    }
@@ -469,6 +541,9 @@
    public void ForceFinish()
    {
        isForceFinish = true;
        isExclusiveLocked = false;
        exclusiveLockOwner = null;
        pendingTakeoverAction = null;
        for (int i = immediatelyActionList.Count - 1; i >= 0; i--)
        {
            var action = immediatelyActionList[i];
@@ -496,9 +571,12 @@
            currentRecordAction.ForceFinish();
        }
        currentRecordAction = null;
        pendingTakeoverAction = null;
        recordActionQueue.Clear();
        immediatelyActionList.Clear();
        isForceFinish = false;
        isExclusiveLocked = false;
        exclusiveLockOwner = null;
        stepForcefinish = false;
    }
Main/System/Battle/Skill/RebornSkill.cs
@@ -54,7 +54,8 @@
        });
        battleField.recordPlayer.ImmediatelyPlay(recordAction);
        battleField.recordPlayer.SetExclusiveLock(true, recordAction);
        battleField.recordPlayer.ImmediatelyPlayThenBlockQueue(recordAction);
        bool vValue = true;