using Entitas; using UnityEngine; using Game; public class TimelineSystem : IExecuteSystem, IInitializeSystem { private IGroup _entities; public void Initialize() { _entities = Util.GetGroup(GameMatcher.Timeline); } public void Execute() { foreach (var entity in _entities) { var timeline = entity.timeline; if (timeline.IsPause) continue; if (!timeline.IsRunning) continue; if (timeline.IsBeThrow) continue; UpdateCheckEnd(entity); if (!timeline.IsRunning) continue; UpdateTimeline(timeline); } } private static void UpdateCheckEnd(GameEntity entity) { var timeline = entity.timeline; timeline.TimePast += Time.deltaTime; if (timeline.TimePast >= timeline.TimeMax) { Util.EndSkillTimeline(entity); } } private static void UpdateTimeline(TimelineComponent timeline) { foreach (var clip in timeline.Timeline.Clips) { var clipReal = clip.Clip; var t = timeline.TimePast; var t1 = clipReal.StartTime; var t2 = clipReal.EndTime; //没有到激活时间的 if (t < t1) continue; //已经执行完毕的 if (clipReal.HasRun) continue; if (t >= t2) { clipReal.HasRun = true; //超过结束时间的 if (clipReal.IsAlive) { //从激活状态退出的 clipReal.OnLeave(); clipReal.IsAlive = false; } else { //没有激活过 直接退出的 clipReal.OnEnter(); clipReal.OnStay(); clipReal.OnLeave(); } } else { //case2 到激活时间、未到结束时间的 if (!clipReal.IsAlive) { clipReal.OnEnter(); clipReal.IsAlive = true; } clipReal.OnStay(); } } } }