Files
Main/Assets/Plugins/Code/Cinematic/Effect/CinematicFadeBlack.cs

156 lines
5.3 KiB
C#
Raw Normal View History

2025-01-25 04:38:09 +08:00
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, //完成
}
}
}