hch
2025-10-28 2d49ec4f87de5fdedcac25a2bd45c97a0c332a04
Main/System/Battle/Motion/MotionBase.cs
@@ -18,13 +18,17 @@
    public Action OnHitAnimationComplete;
    private List<Action> runningActions = new List<Action>();
    protected SkeletonAnimation skeletonAnim;
    public SkeletonAnimation skeletonAnim;
    protected Spine.AnimationState animState;
    protected Spine.Skeleton skeleton;
    protected float defaultMixDuration = 0f;
    private Spine.TrackEntry currentTrack;
    private SkeletonIllusionShadow illusionShadow;
    private bool playingSkillAnim = false;
    private float pauseTime = 0f;
    private float resumeTime = 0f;
    public virtual void Init(SkeletonAnimation skelAnim)
    {
@@ -36,7 +40,6 @@
        }
        animState = skeletonAnim.AnimationState;
        animState.TimeScale = MotionTimeScale;
        skeletonAnim.timeScale = MotionTimeScale;
        skeleton = skeletonAnim.Skeleton;
@@ -118,6 +121,9 @@
    private Spine.TrackEntry ExecuteSkillAnim(SkillConfig skillConfig, SkillBase skillBase, Action onComplete,
        Spine.Animation targetAnim, bool hasAnim, bool isSubSkill)
    {
        bool isPangdeSkill = 1003020 == skillConfig.SkillID;
        int loopCount = skillConfig.LoopCount;
        int[] activeFrames = skillConfig.ActiveFrames ?? new int[0];
        int frameCount = activeFrames.Length;
@@ -149,14 +155,36 @@
                return;
            }
            float currentFrame = 0f;
            if (BattleConst.skillMotionFps > 0)
                currentFrame = hasAnim ? (skillTrack.TrackTime * skillTrack.TimeScale * BattleConst.skillMotionFps) : ((Time.time - startTime) * MotionTimeScale * BattleConst.skillMotionFps);
            float trackTime = 0f; //hasAnim ? skillTrack.TrackTime * skillTrack.TimeScale : (Time.time - startTime) * MotionTimeScale;
            if (hasAnim)
            {
                trackTime = skillTrack.TrackTime;
            }
            else
            {
                float adjustedTime = Time.time;
                if (pauseTime > 0f && resumeTime > pauseTime)
                {
                    startTime = startTime + (resumeTime - pauseTime);
                    pauseTime = 0f;
                    resumeTime = 0f;
                }
                trackTime = (adjustedTime - startTime) * MotionTimeScale;
            }
            float currentFrame = trackTime * BattleConst.skillMotionFps;
            if (hasAnim)
            {
                if (currentTrack != skillTrack)
                {
                    Debug.LogError("技能动画被打断,强制结束 " + skillConfig.SkillID);
                    skillBase.ForceFinished();
                    RemoveAction(frameHandler);
                    playingSkillAnim = false;
                    return;
                }
                
                if (skillTrack.TrackTime == 0) failCount++;
                if (failCount > 100)
@@ -308,14 +336,14 @@
    public virtual void Pause()
    {
        if (animState != null) animState.TimeScale = 0f;
        if (skeletonAnim != null) skeletonAnim.timeScale = 0f;
        pauseTime = Time.time;
    }
    public virtual void Resume()
    {
        if (animState != null) animState.TimeScale = MotionTimeScale;
        if (skeletonAnim != null) skeletonAnim.timeScale = MotionTimeScale;
        resumeTime = Time.time;
    }
    public void HaveRest()
@@ -329,7 +357,6 @@
    public void SetSpeedRatio(float ratio)
    {
        MotionTimeScale = ratio;
        if (animState != null) animState.TimeScale = ratio;
        if (skeletonAnim != null) skeletonAnim.timeScale = ratio;
    }