using UnityEngine; using System.Collections; namespace Thousandto.Cinematic { /// <summary> /// 屏幕渐黑渐变 /// </summary> public class CinematicFadeBlack : MonoBehaviour { //-------------------变量声明部分------------------- #region Variables public Shader CurShader;//着色器实例 private Material CurMaterial;//当前的材质 //shader需要的参数 [0, 1] private float Intensity = 1; //外部控制变量 private float _speed = 1; private float _halfDuration = 0f; private Status _status; public float Duration = 2.0f; public float Strength = 0.5f; public bool Enable = false; #endregion //-------------------------材质的get&set---------------------------- #region MaterialGetAndSet Material material { get { if (CurMaterial == null) { CurMaterial = new Material(CurShader); CurMaterial.hideFlags = HideFlags.HideAndDontSave; } return CurMaterial; } } #endregion //-----------------------------------------【Start()函数】--------------------------------------------- // 说明:此函数仅在Update函数第一次被调用前被调用 //-------------------------------------------------------------------------------------------------------- void Start() { //找到当前的Shader文件 CurShader = Shader.Find("Funcell/Cinematic/CinematicBlackBoard"); } //-------------------------------------【OnRenderImage()函数】------------------------------------ // 说明:此函数在当完成所有渲染图片后被调用,用来渲染图片后期效果 //-------------------------------------------------------------------------------------------------------- void OnRenderImage(RenderTexture sourceTexture, RenderTexture destTexture) { //着色器实例不为空,就进行参数设置 if (CurShader != null) { //设置Shader中的外部变量 material.SetFloat("_BlackRate", Intensity); //拷贝源纹理到目标渲染纹理,加上我们的材质效果 Graphics.Blit(sourceTexture, destTexture, material); } //着色器实例为空,直接拷贝屏幕上的效果。此情况下是没有实现屏幕特效的 else { //直接拷贝源纹理到目标渲染纹理 Graphics.Blit(sourceTexture, destTexture); } } //-----------------------------------------【Update()函数】------------------------------------------ // 说明:此函数在每一帧中都会被调用 //-------------------------------------------------------------------------------------------------------- void Update() { if (!Enable) return; var timeDelta = Time.deltaTime; switch (_status) { case Status.ToBlack: Intensity -= timeDelta * _speed; if(Intensity <= 0) { Intensity = 0; _status = Status.Duration; } break; case Status.Duration: Duration -= timeDelta; if(Duration <= 0) { Duration = 0; _status = Status.ToWhite; } break; case Status.ToWhite: Intensity += timeDelta * _speed; if(Intensity >= 1) { Intensity = 1; _status = Status.Finish; } break; case Status.Finish: Duration = 0; enabled = false; Enable = false; break; } } //-----------------------------------------【OnDisable()函数】--------------------------------------- // 说明:当对象变为不可用或非激活状态时此函数便被调用 //-------------------------------------------------------------------------------------------------------- void OnDisable() { if (CurMaterial) { enabled = false; } } /// <summary> /// 开始变换 /// </summary> /// <param name="duration">变换持续时间</param> /// <param name="transDuration"></param> public void StartTrans(float duration = 1) { Intensity = 1; Duration = duration; Enable = true; enabled = true; _status = Status.ToBlack; } private enum Status { ToBlack, //渐黑 Duration, //持续时间 ToWhite, //渐白 Finish, //完成 } } }