using System.Collections.Generic; using UnityEngine.Timeline; namespace Game { public class TimelineObject { public readonly List Clips = new List(); } public class TimelineManager : ManagerBase { private const string SkillTimelinePathRoot = "Timeline/"; public void RunSkillTimeline(GameEntity entity, string skillName) { var entityTimeline = entity.timeline.Timeline; var asset = EnsureGetSkillTimeline(skillName); double timeMax = 0; var clips = new List(); foreach (var track in asset.GetOutputTracks()) { clips.Clear(); foreach (var clip in track.GetClips()) { var clipReal = TimelineClipPoolManager.Instance.CreateByClipType(clip.asset.GetType(), clip, entity); if (clipReal == null) { continue; } clips.Add(clipReal); if (clipReal.Clip.EndTime > timeMax) { timeMax = clipReal.Clip.EndTime; } } //这里需要按时间排序 同类型clip时序问题 clips.Sort((a, b) => (int)((a.Clip.EndTime - b.Clip.EndTime) * 1000)); entityTimeline.Clips.AddRange(clips); } entity.timeline.TimePast = 0; entity.timeline.TimeMax = timeMax; entity.timeline.IsRunning = true; } public void EndSkillTimeline(GameEntity entity) { var timeline = entity.timeline; if (timeline.Timeline != null) { foreach (var clip in timeline.Timeline.Clips) { var clipReal = clip.Clip; if (clipReal.IsAlive) { clipReal.OnLeave(); } clip.Destroy(); } timeline.Timeline.Clips.Clear(); } timeline.IsRunning = false; timeline.IsPause = false; } public TimelineAsset EnsureGetSkillTimeline(string path) { var pathReal = $"{SkillTimelinePathRoot}{path}"; return Util.Load(pathReal); } } }