|  |  |  | using Entitas; | 
					
						
							|  |  |  | using UnityEngine; | 
					
						
							|  |  |  | using Game; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public class TimelineSystem : IExecuteSystem, IInitializeSystem | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     private IGroup<GameEntity> _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; | 
					
						
							|  |  |  |             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) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 //超过结束时间的 | 
					
						
							|  |  |  |                 if (clipReal.IsAlive) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     //从激活状态退出的 | 
					
						
							|  |  |  |                     clipReal.OnLeave(); | 
					
						
							|  |  |  |                     clipReal.IsAlive = false; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 else | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     //没有激活过 直接退出的 | 
					
						
							|  |  |  |                     clipReal.OnEnter(); | 
					
						
							|  |  |  |                     clipReal.OnStay(); | 
					
						
							|  |  |  |                     clipReal.OnLeave(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 clipReal.HasRun = true; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 //case2 到激活时间、未到结束时间的 | 
					
						
							|  |  |  |                 if (!clipReal.IsAlive) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     clipReal.OnEnter(); | 
					
						
							|  |  |  |                     clipReal.IsAlive = true; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 clipReal.OnStay(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |