| | |
| | | }; |
| | | |
| | | private Dictionary<Spine.TrackEntry, Action> trackEntryCallbacks = new Dictionary<Spine.TrackEntry, Action>(); |
| | | |
| | | private Dictionary<int, SkillBase> skillTrackDict = new Dictionary<int, SkillBase>(); |
| | | public Action OnAttackAnimationComplete; |
| | | public Action OnHitAnimationComplete; |
| | | private List<Action> runningActions = new List<Action>(); |
| | |
| | | currentTrack = null; |
| | | playingSkill = false; |
| | | playingSkillWithAnim = false; |
| | | skillTrackDict.Clear(); |
| | | } |
| | | |
| | | public virtual Spine.TrackEntry PlayAnimation(MotionName motionName, bool loop, Action onComplete = null) |
| | |
| | | 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; |
| | | // 前摇 |
| | |
| | | |
| | | if (hasAnim) |
| | | { |
| | | if (null != skillTrack) |
| | | // 检查轨道是否已被占用(修复:原来检查 null != skillTrack 永远为 false) |
| | | if (activeSkillTracks.ContainsKey(trackIndex) || skillTrackDict.ContainsKey(trackIndex)) |
| | | { |
| | | //等待上一技能动画结束 暂时处理办法 |
| | | UniTaskExtension.DelayFrames((GameObject)null, 1, () => |
| | |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | if (skillTrackDict.ContainsKey(trackIndex)) |
| | | { |
| | | skillBase.ForceFinished(); |
| | | skillTrackDict.Remove(trackIndex); |
| | | } |
| | | |
| | | skillTrackDict[trackIndex] = skillBase; |
| | | |
| | | // 只有主技能才更新 currentTrack |
| | | if (!isSubSkill) |
| | |
| | | { |
| | | if (skillBase.IsFinished()) |
| | | { |
| | | skillTrackDict.Remove(trackIndex); |
| | | // 清理并退出(保证状态一致) |
| | | if (skillTrack != null && activeSkillTracks.ContainsKey(trackIndex)) |
| | | { |
| | |
| | | // 检查当前轨道是否被新技能覆盖 |
| | | if (!activeSkillTracks.ContainsKey(trackIndex) || activeSkillTracks[trackIndex] != skillTrack) |
| | | { |
| | | skillTrackDict[trackIndex].ForceFinished(); |
| | | skillTrackDict.Remove(trackIndex); |
| | | Debug.LogError("技能动画被打断,强制结束 " + skillConfig.SkillID); |
| | | skillBase.ForceFinished(); |
| | | |
| | |
| | | { |
| | | playingSkill = false; |
| | | } |
| | | |
| | | skillTrackDict.Remove(trackIndex); |
| | | |
| | | RemoveAction(frameHandler); |
| | | onComplete?.Invoke(); |
| | |
| | | runningActions.Clear(); |
| | | activeSkillTracks.Clear(); |
| | | |
| | | // 强制结束所有正在执行的技能 |
| | | foreach (var kv in skillTrackDict) |
| | | { |
| | | kv.Value?.ForceFinished(); |
| | | } |
| | | skillTrackDict.Clear(); |
| | | |
| | | // 重置子技能轨道池 |
| | | if (availableSubTracks == null) |
| | | availableSubTracks = new Queue<int>(); |
| | |
| | | |
| | | activeSkillTracks.Clear(); |
| | | |
| | | // 强制结束所有正在执行的技能(复活时需要清理所有技能状态) |
| | | foreach (var kv in skillTrackDict) |
| | | { |
| | | kv.Value?.ForceFinished(); |
| | | } |
| | | skillTrackDict.Clear(); |
| | | |
| | | // 3. 重置子技能轨道池 |
| | | if (availableSubTracks == null) |
| | | availableSubTracks = new Queue<int>(); |