hch
2025-10-30 dc7922d80c1d133b6261b8af1d521567d2c0a35d
Main/System/Battle/Motion/MotionBase.cs
@@ -5,7 +5,7 @@
public class MotionBase
{
    public static float MotionTimeScale = 1f;
    public float MotionTimeScale = 1f;
    public static List<string> AttackMotionList = new List<string>
    {
        MotionName.attack.ToString().ToLower(),
@@ -26,6 +26,12 @@
    private SkeletonIllusionShadow illusionShadow;
    private bool playingSkillAnim = false;
    private bool isUnderControl = false;
    private float pauseTime = 0f;
    private float resumeTime = 0f;
    public virtual void Init(SkeletonAnimation skelAnim)
    {
        skeletonAnim = skelAnim;
@@ -36,7 +42,6 @@
        }
        animState = skeletonAnim.AnimationState;
        animState.TimeScale = MotionTimeScale;
        skeletonAnim.timeScale = MotionTimeScale;
        skeleton = skeletonAnim.Skeleton;
@@ -118,6 +123,8 @@
    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,9 +156,25 @@
                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)
            {
@@ -283,7 +306,7 @@
    protected virtual void OnAnimationComplete(Spine.TrackEntry trackEntry)
    {
        if (trackEntry?.Animation?.Name == null) return;
        string animName = trackEntry.Animation.Name.ToLower();
        if (AttackMotionList.Contains(animName))
@@ -296,12 +319,33 @@
            OnHitAnimationComplete?.Invoke();
            PlayAnimation(MotionName.idle, true);
        }
        if (trackEntryCallbacks.TryGetValue(trackEntry, out var callback))
        {
            trackEntryCallbacks.Remove(trackEntry);
            callback?.Invoke();
        }
    }
    public void SetControledAnimation()
    {
        //  受到硬控的时候,保持受击动画的第三帧,直到控制结束 或者最后一击死亡,移除控制效果后,恢复到待机状态或者播放死亡动画
        //  这里是受到硬控时候 需要表现的动画
        var entry = PlayAnimation(MotionName.hit, false);
        float threeFrameTrackTime = 3f / BattleConst.skillMotionFps;
        entry.TrackTime = threeFrameTrackTime;
        entry.TimeScale = 0;
        isUnderControl = true;
    }
    public void CancelControledAnimation()
    {
        //  硬控结束,恢复动画播放
        isUnderControl = false;
        PlayAnimation(MotionName.idle, true);
    }
    public virtual void Run()
@@ -314,14 +358,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()
@@ -335,16 +379,15 @@
    public void SetSpeedRatio(float ratio)
    {
        MotionTimeScale = ratio;
        if (animState != null) animState.TimeScale = ratio;
        if (skeletonAnim != null) skeletonAnim.timeScale = ratio;
    }
    public void ShowIllusionShadow(bool isVisible)
    public void ShowIllusionShadow(bool isVisible, Color color = default)
    {
        if (illusionShadow != null)
        {
            illusionShadow.SetSkeletonAnimation(skeletonAnim);
            illusionShadow.Show(isVisible);
            illusionShadow.Show(isVisible, color);
        }
    }
}