using Module.Log; using UnityEngine; public class CameraRadialBlur : MonoBehaviour { public Material blurMaterial; public float enterTime = 1f; public float exitTime = 1f; private int _width; private int _height; private float _startTime; private Material _instance; private int _layerMask; private Camera _camera; private RenderTexture _source; private bool _init; private bool _exit; private void OnEnable() { if (_init) { if (!SystemInfo.supportsImageEffects) { LogModule.DebugLog("Disabling the RadialBlur. Image effects are not supported"); enabled = false; } else if (_camera == null) enabled = false; else { _width = Screen.width; _height = Screen.height; if (!PlayerPreferenceData.SystemQualityHighResolution) { _width /= 2; _height /= 2; } _startTime = Time.time; _instance = new Material(blurMaterial); _source = RenderTexture.GetTemporary(_width, _height, 24, RenderTextureFormat.ARGB32); _camera.targetTexture = _source; _camera.Render(); _camera.targetTexture = null; //_exit = false; _exit = true; } } } private void Start () { if (_camera == null) _camera = GetComponent(); _init = true; OnEnable(); } public void Exit() { _exit = true; } private void OnDisable() { if (!GameManager.applicationQuit) { if (_instance != null) { Destroy(_instance); _instance = null; } if (_source != null) { RenderTexture.ReleaseTemporary(_source); _source = null; } } } private bool CheckMovieOver = false; private void Update() { if (CheckMovieOver == false && SceneMovieManager.Instance.CheckPlaySceneMovie(false, 3f)) //场景过场动画的,给个2秒的延迟让其加载 { _startTime = Time.time; return; } CheckMovieOver = true; if (Time.time < _startTime + enterTime) { var ratio = Mathf.Clamp01((Time.time - _startTime) / enterTime); _instance.SetFloat("_BlurRatio", ratio); } else if (!_exit) _instance.SetFloat("_BlurRatio", 1f); else { if (Time.time < _startTime + enterTime + exitTime) { var ratio = Mathf.Clamp01((_startTime + enterTime + exitTime - Time.time) / exitTime); _instance.SetFloat("_BlurRatio", ratio); } else { enabled = false; SceneMovieManager.Instance.PlaySceneMovie(); } } } private void OnPreRender() { _layerMask = _camera.cullingMask; _camera.cullingMask = 0; } private void OnPostRender() { _camera.cullingMask = _layerMask; } private void OnRenderImage(RenderTexture src, RenderTexture dest) { var tempA = RenderTexture.GetTemporary(_width, _height); //var tempB = RenderTexture.GetTemporary(_width, _height); Graphics.Blit(_source, tempA, _instance); Graphics.Blit(tempA, dest, _instance); //Graphics.Blit(tempB, dest, _instance); } }