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.
		
		
		
		
		
			
		
			
				
	
	
		
			183 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			183 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C#
		
	
| 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;
 | |
| 
 | |
|         if (entity.IsMaster())
 | |
|         {
 | |
|             Util.SetControl(!pause.IsPause);
 | |
|         }
 | |
| 
 | |
|         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();
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| } |