You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			179 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
		
		
			
		
	
	
			179 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
| 
											2 years ago
										 | 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.MClips) | ||
|  |         { | ||
|  |             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(); | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | } |