| | |
| | | private Spine.TrackEntry currentTrack; |
| | | private Dictionary<int, Spine.TrackEntry> activeSkillTracks = new Dictionary<int, Spine.TrackEntry>(); |
| | | |
| | | // 死亡动画专用轨道索引 |
| | | private const int DeathTrackIndex = 9; |
| | | |
| | | // 子技能轨道池管理(在Init中初始化,不要在这里初始化) |
| | | private Queue<int> availableSubTracks; |
| | | private Dictionary<SkillBase, int> subSkillTrackMap = new Dictionary<SkillBase, int>(); |
| | |
| | | if (animState == null) return null; |
| | | |
| | | // 使用轨道9作为死亡动画专用轨道(独立于主轨道0和子技能轨道1-8) |
| | | const int deathTrackIndex = 9; |
| | | |
| | | // 清除死亡轨道上的回调 |
| | | if (activeSkillTracks.TryGetValue(deathTrackIndex, out var oldDeathTrack)) |
| | | if (activeSkillTracks.TryGetValue(DeathTrackIndex, out var oldDeathTrack)) |
| | | { |
| | | if (trackEntryCallbacks.ContainsKey(oldDeathTrack)) |
| | | trackEntryCallbacks.Remove(oldDeathTrack); |
| | |
| | | return null; |
| | | } |
| | | |
| | | Spine.TrackEntry deathTrack = animState.SetAnimation(deathTrackIndex, deadAnim, false); |
| | | Spine.TrackEntry deathTrack = animState.SetAnimation(DeathTrackIndex, deadAnim, false); |
| | | |
| | | if (deathTrack != null) |
| | | { |
| | | activeSkillTracks[deathTrackIndex] = deathTrack; |
| | | activeSkillTracks[DeathTrackIndex] = deathTrack; |
| | | |
| | | if (onComplete != null) |
| | | trackEntryCallbacks[deathTrack] = onComplete; |
| | |
| | | |
| | | private void AddAction(Action action) => runningActions.Add(action); |
| | | private void RemoveAction(Action action) => runningActions.Remove(action); |
| | | |
| | | // 检查是否有活跃的技能轨道(排除死亡轨道) |
| | | private bool HasActiveSkillTracks() |
| | | { |
| | | if (activeSkillTracks.Count == 0) return false; |
| | | if (activeSkillTracks.Count == 1 && activeSkillTracks.ContainsKey(DeathTrackIndex)) return false; |
| | | return true; |
| | | } |
| | | |
| | | public Spine.TrackEntry PlaySkillAnimation(SkillConfig skillConfig, SkillBase skillBase, bool isSubSkill, Action onComplete = null) |
| | | { |
| | |
| | | subSkillTrackMap.Remove(skillBase); |
| | | } |
| | | |
| | | // 只有当没有其他活跃技能时才复位 playingSkillAnim |
| | | if (activeSkillTracks.Count == 0) |
| | | // 只有当没有其他活跃技能时才复位 playingSkillAnim(排除死亡轨道) |
| | | if (!HasActiveSkillTracks()) |
| | | { |
| | | playingSkillWithAnim = false; |
| | | playingSkill = false; |
| | |
| | | subSkillTrackMap.Remove(skillBase); |
| | | } |
| | | |
| | | if (activeSkillTracks.Count == 0) |
| | | if (!HasActiveSkillTracks()) |
| | | { |
| | | playingSkill = false; |
| | | playingSkillWithAnim = false; |
| | |
| | | if (skillTrack.TrackTime == 0) failCount++; |
| | | if (failCount > 100) |
| | | { |
| | | Debug.LogError("技能动画播放失败,强制结束 " + skillConfig.SkillID); |
| | | Debug.LogError("技能动画播放失败,强制结束 " + skillConfig.SkillID + " is caster dead " + skillBase.caster.IsDead()); |
| | | skillBase.ForceFinished(); |
| | | RemoveAction(frameHandler); |
| | | if (activeSkillTracks.ContainsKey(trackIndex)) |
| | |
| | | subSkillTrackMap.Remove(skillBase); |
| | | } |
| | | |
| | | if (activeSkillTracks.Count == 0) |
| | | if (!HasActiveSkillTracks()) |
| | | { |
| | | playingSkillWithAnim = false; |
| | | playingSkill = false; |
| | |
| | | subSkillTrackMap.Remove(skillBase); |
| | | } |
| | | |
| | | // 只有当没有其他活跃技能时才复位 playingSkillAnim |
| | | if (activeSkillTracks.Count == 0) |
| | | // 只有当没有其他活跃技能时才复位 playingSkillAnim(排除死亡轨道) |
| | | if (!HasActiveSkillTracks()) |
| | | { |
| | | playingSkill = false; |
| | | } |