|  |  |  | using System.Linq; | 
					
						
							|  |  |  | using Entitas; | 
					
						
							|  |  |  | using UnityEngine; | 
					
						
							|  |  |  | using Game; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /// <summary> | 
					
						
							|  |  |  | /// 实体减速、暂停 在此管理 | 
					
						
							|  |  |  | /// </summary> | 
					
						
							|  |  |  | public class PauseSystem : IExecuteSystem, IInitializeSystem | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     private IGroup<GameEntity> _entities; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public void Initialize() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         _entities = Util.GetGroup(GameMatcher.Pause); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public void Execute() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         foreach (var entity in _entities) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             UpdatePause(entity); | 
					
						
							|  |  |  |             UpdatePauseFix(entity); //确保至少播出1帧的 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private static void UpdatePause(GameEntity entity) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         var pause = entity.pause; | 
					
						
							|  |  |  |         var isChange = false; | 
					
						
							|  |  |  |         if (pause.IsPause) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             pause.PauseTime -= Time.deltaTime; | 
					
						
							|  |  |  |             pause.PauseTime = Mathf.Max(pause.PauseTime, 0); | 
					
						
							|  |  |  |             if (pause.PauseTime == 0) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 pause.IsPause = false; | 
					
						
							|  |  |  |                 isChange = true; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if (pause.PausePreFrame > 0) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 pause.PausePreFrame--; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 if (pause.PauseTime > 0) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     pause.IsPause = true; | 
					
						
							|  |  |  |                     isChange = true; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (entity.iD.Data.IsDestroy) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             //即将销毁的 强制取消pause | 
					
						
							|  |  |  |             pause.IsPause = false; | 
					
						
							|  |  |  |             isChange = true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!isChange) | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         UpdateAnimPause(entity, pause.IsPause); | 
					
						
							|  |  |  |         UpdateEffectPause(entity, pause.IsPause); | 
					
						
							|  |  |  |         UpdateMovePause(entity, pause.IsPause); | 
					
						
							|  |  |  |         UpdateTimelinePause(entity, pause.IsPause); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private static void UpdateAnimPause(GameEntity entity, bool isPause) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (!entity.hasAnimation) | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         var anim = entity.animation; | 
					
						
							|  |  |  |         var pause = entity.pause; | 
					
						
							|  |  |  |         if (isPause) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             pause.AnimeSpeedCache = anim.Animator.speed; | 
					
						
							|  |  |  |             anim.Animator.speed = 0; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             anim.Animator.speed = pause.AnimeSpeedCache; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private static void UpdateEffectPause(GameEntity entity, bool isPause) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (!entity.hasView) | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         var view = entity.view; | 
					
						
							|  |  |  |         foreach (var particle in view.EffectObject.Select(item => item.GameObject.GetComponent<ParticleSystem>())) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             switch (isPause) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 case true when !particle.isPaused: | 
					
						
							|  |  |  |                     particle.Pause(); | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 case false when particle.isPaused: | 
					
						
							|  |  |  |                     particle.Play(); | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private static void UpdateMovePause(GameEntity entity, bool isPause) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (!entity.hasMove) | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         var move = entity.move; | 
					
						
							|  |  |  |         var pause = entity.pause; | 
					
						
							|  |  |  |         if (isPause) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             pause.VelocityCache = move.Velocity; | 
					
						
							|  |  |  |             move.Velocity = Vector3.zero; | 
					
						
							|  |  |  |             move.Rigidbody.Sleep(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             move.Velocity = pause.VelocityCache; | 
					
						
							|  |  |  |             move.Rigidbody.WakeUp(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private static void UpdateTimelinePause(GameEntity entity, bool isPause) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (!entity.hasTimeline) | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         var timeline = entity.timeline; | 
					
						
							|  |  |  |         if (!timeline.IsRunning) | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         timeline.IsPause = isPause; | 
					
						
							|  |  |  |         foreach (var clip in timeline.Timeline.Clips) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             var clipReal = clip.Clip; | 
					
						
							|  |  |  |             if (clipReal.IsAlive) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 clipReal.OnPause(isPause); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private static void UpdatePauseFix(GameEntity entity) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         var pause = entity.pause; | 
					
						
							|  |  |  |         if (!pause.IsPause) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         UpdateEffectPauseFix(entity); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private static void UpdateEffectPauseFix(GameEntity entity) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (!entity.hasView) | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         var view = entity.view; | 
					
						
							|  |  |  |         foreach (var item in view.EffectObject) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             var particle = item.GameObject.GetComponent<ParticleSystem>(); | 
					
						
							|  |  |  |             if (particle.time < 2f / GameConst.FPS) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 particle.Play(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 particle.Pause(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |