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.
		
		
		
		
		
			
		
			
				
	
	
		
			169 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			169 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C#
		
	
| using System.Collections.Generic;
 | |
| using UnityEngine.Rendering.PostProcessing;
 | |
| using UnityEngine;
 | |
| 
 | |
| //用于表现的全局效果 timescale 后处理参数等
 | |
| namespace Game
 | |
| {
 | |
|     public delegate void GlobalEffectHandler(float scale);
 | |
|     public enum EGlobalEffectType
 | |
|     {
 | |
|         Timescale,
 | |
|         Aberration,
 | |
|         Fov,
 | |
|         Max,
 | |
|     }
 | |
|     public class GlobalEffectInfo
 | |
|     {
 | |
|         public float MFrom;
 | |
|         public float MTo;
 | |
|         public float MTimeDuration;
 | |
|         public float MTimeLeft;
 | |
|         public float MTimeDelay;
 | |
|     }
 | |
|     public class GlobalEffectManager : ManagerBase<GlobalEffectManager>
 | |
|     {
 | |
|         private Dictionary<EGlobalEffectType, Queue<GlobalEffectInfo>> _mGlobalEffectDict = new Dictionary<EGlobalEffectType, Queue<GlobalEffectInfo>>();
 | |
|         private Dictionary<EGlobalEffectType, GlobalEffectHandler> _mGlobalEffectHandlerDict;
 | |
|         public GlobalEffectManager() { }
 | |
|         public override void OnCreate()
 | |
|         {
 | |
|             for (int i = 0; i < (int)EGlobalEffectType.Max; i++)
 | |
|             {
 | |
|                 _mGlobalEffectDict[(EGlobalEffectType)i] = new Queue<GlobalEffectInfo>();
 | |
|             }
 | |
|             _mGlobalEffectHandlerDict = new Dictionary<EGlobalEffectType, GlobalEffectHandler>(){
 | |
|                 {EGlobalEffectType.Timescale,SetTimeScale},
 | |
|                 {EGlobalEffectType.Aberration,SetAberration},
 | |
|                 {EGlobalEffectType.Fov,SetFov},
 | |
|             };
 | |
|         }
 | |
|         public override void Update()
 | |
|         {
 | |
|             foreach (var item in _mGlobalEffectDict)
 | |
|             {
 | |
|                 var type = item.Key;
 | |
|                 var infoQueue = item.Value;
 | |
|                 if (infoQueue.Count == 0)
 | |
|                 {
 | |
|                     continue;
 | |
|                 }
 | |
|                 var info = infoQueue.Peek();
 | |
|                 if (info.MTimeLeft <= 0)
 | |
|                 {
 | |
|                     continue;
 | |
|                 }
 | |
|                 if (info.MTimeDelay > 0)
 | |
|                 {
 | |
|                     info.MTimeDelay -= Time.unscaledDeltaTime;
 | |
|                     continue;
 | |
|                 }
 | |
|                 info.MTimeDelay = 0;
 | |
|                 var pastRate = (info.MTimeDuration - info.MTimeLeft) / info.MTimeDuration;
 | |
|                 var scaleRate = pastRate * pastRate;//y=x^2曲线
 | |
|                 var scaleDir = info.MTo - info.MFrom;
 | |
|                 var targetScale = info.MFrom + scaleDir * scaleRate;
 | |
|                 info.MTimeLeft -= Time.unscaledDeltaTime;
 | |
|                 if (info.MTimeLeft <= 0)
 | |
|                 {
 | |
|                     info.MTimeLeft = 0;
 | |
|                     targetScale = info.MTo;
 | |
|                     infoQueue.Dequeue();
 | |
|                 }
 | |
|                 SetScale(type, targetScale);
 | |
|             }
 | |
|         }
 | |
|         public override void OnDestroy() { }
 | |
|         public void SetEffect(EGlobalEffectType type, float scale)
 | |
|         {
 | |
|             SetEffectLerp(type, scale, scale, 0);
 | |
|         }
 | |
|         public void SetEffectLerp(EGlobalEffectType type, float scaleFrom, float scaleTo, float duration, float delay = 0)
 | |
|         {
 | |
|             //清空队列 并且设置当前值
 | |
|             SetScale(type, scaleFrom);
 | |
|             var infoQueue = _mGlobalEffectDict[type];
 | |
|             infoQueue.Clear();
 | |
|             var info = new GlobalEffectInfo();
 | |
|             info.MFrom = scaleFrom;
 | |
|             info.MTo = scaleTo;
 | |
|             info.MTimeDuration = duration;
 | |
|             info.MTimeLeft = duration;
 | |
|             info.MTimeDelay = delay;
 | |
|             infoQueue.Enqueue(info);
 | |
|         }
 | |
|         public void AppendEffectLerp(EGlobalEffectType type, float scaleFrom, float scaleTo, float duration, float delay = 0)
 | |
|         {
 | |
|             //加入队列
 | |
|             var infoQueue = _mGlobalEffectDict[type];
 | |
|             var info = new GlobalEffectInfo();
 | |
|             info.MFrom = scaleFrom;
 | |
|             info.MTo = scaleTo;
 | |
|             info.MTimeDuration = duration;
 | |
|             info.MTimeLeft = duration;
 | |
|             info.MTimeDelay = delay;
 | |
|             infoQueue.Enqueue(info);
 | |
|         }
 | |
| 
 | |
|         private void SetScale(EGlobalEffectType type, float scale)
 | |
|         {
 | |
|             _mGlobalEffectHandlerDict[type](scale);
 | |
|         }
 | |
|         private void SetTimeScale(float scale)
 | |
|         {
 | |
|             Time.timeScale = scale;
 | |
|         }
 | |
|         private void SetAberration(float scale)
 | |
|         {
 | |
|             var setting = Util.GetPostProcessSetting<ChromaticAberration>();
 | |
|             setting.intensity.value = scale;
 | |
|         }
 | |
|         private void SetFov(float scale)
 | |
|         {
 | |
|             var virtualCamera = Util.GetVirtualCamera();
 | |
|             var normalFOV = 25;//TODO 跟随相机设置
 | |
|             virtualCamera.m_Lens.FieldOfView = scale * normalFOV;
 | |
|         }
 | |
| 
 | |
|     }
 | |
|     public abstract partial class Util
 | |
|     {
 | |
|         public static void SetTimeScale(float scale)
 | |
|         {
 | |
|             GlobalEffectManager.Instance.SetEffect(EGlobalEffectType.Timescale, scale);
 | |
|         }
 | |
|         public static void SetGlobalEffect(EGlobalEffectType type, float scaleFrom, float scaleTo, float duration)
 | |
|         {
 | |
|             GlobalEffectManager.Instance.SetEffectLerp(type, scaleFrom, scaleTo, duration);
 | |
|         }
 | |
|         public static void AppendGlobalEffect(EGlobalEffectType type, float scaleFrom, float scaleTo, float duration)
 | |
|         {
 | |
|             GlobalEffectManager.Instance.AppendEffectLerp(type, scaleFrom, scaleTo, duration);
 | |
|         }
 | |
| 
 | |
|         public static void SetTimeScaleEffect(float scaleFrom, float scaleTo, float duration)
 | |
|         {
 | |
|             SetGlobalEffect(EGlobalEffectType.Timescale, scaleFrom, scaleTo, duration);
 | |
|         }
 | |
|         public static void SetAberrationEffect(float scaleFrom, float scaleTo, float duration)
 | |
|         {
 | |
|             SetGlobalEffect(EGlobalEffectType.Aberration, scaleFrom, scaleTo, duration);
 | |
|         }
 | |
|         public static void SetFovEffect(float scaleFrom, float scaleTo, float duration)
 | |
|         {
 | |
|             SetGlobalEffect(EGlobalEffectType.Fov, scaleFrom, scaleTo, duration);
 | |
|         }
 | |
|         public static void AppendTimeScaleEffect(float scaleFrom, float scaleTo, float duration)
 | |
|         {
 | |
|             AppendGlobalEffect(EGlobalEffectType.Timescale, scaleFrom, scaleTo, duration);
 | |
|         }
 | |
|         public static void AppendAberrationEffect(float scaleFrom, float scaleTo, float duration)
 | |
|         {
 | |
|             AppendGlobalEffect(EGlobalEffectType.Aberration, scaleFrom, scaleTo, duration);
 | |
|         }
 | |
|         public static void AppendFovEffect(float scaleFrom, float scaleTo, float duration)
 | |
|         {
 | |
|             AppendGlobalEffect(EGlobalEffectType.Fov, scaleFrom, scaleTo, duration);
 | |
|         }
 | |
|     }
 | |
| } |