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);
|
|
}
|
|
}
|
|
} |