yyl
2026-04-24 64d526e0f5b9f49fe5bd6dcf043f5071d996e7ad
Main/System/Battle/Motion/MotionBase.cs
@@ -45,6 +45,13 @@
    private bool playingSkill = false;
    private bool _playingSkillWithAnim = false;
#if UNITY_EDITOR
    //  [卡死诊断] 记录是谁把 playingSkillWithAnim 锁为 true、在哪一帧,供 SkillBase.ReportStuckIfNeeded 使用。
    //  不做 Run() 内 watchdog(避免刷屏);只在 SkillBase 自身发现卡死时一次性把这些信息打出来。
    private int _pswaSetTrueFrame = -1;
    private int _pswaSetTrueSkillId = 0;
    private string _pswaSetTrueStack = null;
#endif
    private bool playingSkillWithAnim
    {
        get => _playingSkillWithAnim;
@@ -58,6 +65,19 @@
                // 每次变更打印栈,定位到底是谁把 playingSkillWithAnim 设 true 了、谁清/不清
                BattleDebug.LogError($"[MotionBase owner={owner} hash={GetHashCode()}] playingSkillWithAnim {_playingSkillWithAnim} -> {value}\n"
                    + UnityEngine.StackTraceUtility.ExtractStackTrace());
            }
            //  [卡死诊断] 维护锁的持有者信息(上一轮的字段被回滚了,这里是最小必要集合)
            if (value && !_playingSkillWithAnim)
            {
                _pswaSetTrueFrame = UnityEngine.Time.frameCount;
                _pswaSetTrueStack = UnityEngine.StackTraceUtility.ExtractStackTrace();
                // skillId 由 ExecuteSkillAnim 紧接着赋值(setter 这里拿不到)
            }
            else if (!value && _playingSkillWithAnim)
            {
                _pswaSetTrueFrame = -1;
                _pswaSetTrueSkillId = 0;
                _pswaSetTrueStack = null;
            }
#endif
            _playingSkillWithAnim = value;
@@ -335,6 +355,10 @@
            activeSkillTracks[trackIndex] = skillTrack;
            playingSkillWithAnim = true;
#if UNITY_EDITOR
            //  [卡死诊断] setter 里拿不到 skillId,这里补上,供 SkillBase.ReportStuckIfNeeded dump
            _pswaSetTrueSkillId = skillConfig != null ? skillConfig.SkillID : 0;
#endif
        }
        
        playingSkill = true;
@@ -857,6 +881,11 @@
#if UNITY_EDITOR
    /// <summary>卡死诊断用:暴露 playingSkillWithAnim 标志位。</summary>
    public bool PlayingSkillWithAnimForDebug => playingSkillWithAnim;
    //  [卡死诊断] 给 SkillBase 卡死报告用:谁把 playingSkillWithAnim 锁为 true、在哪一帧。
    public int PlayingSkillAnimOwnerSkillIdForDebug => _pswaSetTrueSkillId;
    public int PlayingSkillAnimOwnerFrameForDebug => _pswaSetTrueFrame;
    public string PlayingSkillAnimOwnerStackForDebug => _pswaSetTrueStack;
#endif
    public bool CanStartDeath()