103 lines
3.3 KiB
C#
103 lines
3.3 KiB
C#
using Games.Events;
|
||
using Module.Log;
|
||
using UnityEngine;
|
||
public class CameraSpaceBlur : MonoBehaviour
|
||
{
|
||
public Material blurMaterial;
|
||
public float maxBlurOffset = 0.1f;
|
||
public float maxBright = 0.7f;
|
||
public AnimationCurve enterCurve = new AnimationCurve(new Keyframe(0f, 0f), new Keyframe(0.65f, 0.1f), new Keyframe(1f, 1f));
|
||
public AnimationCurve exitCurve = new AnimationCurve(new Keyframe(1f, 1f), new Keyframe(0.1f, 0.72f), new Keyframe(0f, 0f));
|
||
public float enterTime = 1.7f;
|
||
public float exitTime = 1.5f;
|
||
|
||
private Material _mMaterial;
|
||
private Camera _mCamera;
|
||
private bool _maxEventSent;
|
||
private float _time;
|
||
private float _offset;
|
||
private float _bright;
|
||
|
||
private void Start()
|
||
{
|
||
// Disable if we don't support image effects
|
||
if (!SystemInfo.supportsImageEffects)
|
||
{
|
||
LogModule.DebugLog("Disabling the Camera Blur. Image effects are not supported (do you have Unity Pro?)");
|
||
enabled = false;
|
||
}
|
||
else
|
||
{
|
||
_mCamera = GetComponent<Camera>();
|
||
if (blurMaterial == null)
|
||
{
|
||
LogModule.ErrorLog(string.Format("{0}未设置BlurMaterial!", gameObject.name));
|
||
enabled = false;
|
||
}
|
||
else if (_mCamera == null)
|
||
{
|
||
LogModule.ErrorLog(string.Format("{0}没有摄像机!", gameObject.name));
|
||
enabled = false;
|
||
}
|
||
else
|
||
_mMaterial = Instantiate(blurMaterial);
|
||
}
|
||
}
|
||
private void OnEnable()
|
||
{
|
||
_time = 0f;
|
||
_maxEventSent = false;
|
||
}
|
||
private void Update()
|
||
{
|
||
if (_time < enterTime)
|
||
{
|
||
if (_time <= 0 && SceneMovieManager.Instance.CheckPlaySceneMovie(false, 3f)) //场景过场动画的,给个2秒的延迟让其加载
|
||
return;
|
||
|
||
float ratio = _time / enterTime;
|
||
ratio = enterCurve.Evaluate(ratio);
|
||
_bright = ratio * maxBright;
|
||
_offset = ratio * maxBlurOffset;
|
||
}
|
||
else
|
||
{
|
||
if (!_maxEventSent)
|
||
{
|
||
// 刻意保留一帧最大值来遮挡摄像机镜头变换和其他变换效果
|
||
_maxEventSent = true;
|
||
var ratio = enterCurve.Evaluate(1);
|
||
_bright = ratio * maxBright;
|
||
_offset = ratio * maxBlurOffset;
|
||
EventDispatcher.Instance.Dispatch(Games.Events.EventId.CameraSpaceBlurMax);
|
||
}
|
||
else if (_time < enterTime + exitTime)
|
||
{
|
||
float ratio = (_time - enterTime) / exitTime;
|
||
ratio = exitCurve.Evaluate(ratio);
|
||
_bright = ratio * maxBright;
|
||
_offset = ratio * maxBlurOffset;
|
||
}
|
||
else
|
||
{
|
||
enabled = false;
|
||
SceneMovieManager.Instance.PlaySceneMovie();
|
||
}
|
||
}
|
||
_time += Time.deltaTime;
|
||
}
|
||
private void OnDestroy()
|
||
{
|
||
Destroy(_mMaterial);
|
||
}
|
||
private void OnRenderImage(RenderTexture source, RenderTexture destination)
|
||
{
|
||
SetMaterial();
|
||
Graphics.Blit(source, destination, _mMaterial);
|
||
}
|
||
private void SetMaterial()
|
||
{
|
||
_mMaterial.SetFloat("_Offset", _offset);
|
||
_mMaterial.SetFloat("_Bright", _bright);
|
||
}
|
||
} |