Files
Main/Assets/Plugins/Code/UniScene/Camera/CameraBlendRender.cs
2025-01-25 04:38:09 +08:00

77 lines
2.4 KiB
C#

using System;
using UnityEngine;
namespace Thousandto.Plugins.Common.UniScene
{
//摄像机混合脚本
public class CameraBlendRender : MonoBehaviour
{
#region//私有变量
private float _blendTime = 1f;
private float _timer = 0f;
private Action _finishCallBack = null;
private Shader _shader = null;
private Material _material = null;
private Camera _targetCamera = null;
private RenderTexture _targetTex = null;
#endregion
#region//公有函数
public void PlayBlend(Camera target, float time, Action finishCallBack)
{
if(_shader == null)
{
_shader = Core.Base.ShaderEx.Find("Ares/Camera/CameraBlendPass");
}
if(_material == null)
{
_material = new Material(_shader);
}
_timer = 0f;
_blendTime = time;
if(_targetCamera != null)
{
_targetCamera.targetTexture = null;
}
if(_targetTex == null)
{
_targetTex = RenderTexture.GetTemporary(Screen.width, Screen.height, 24, RenderTextureFormat.ARGB32);
_targetTex.name = "RenderTexture9";
_targetTex.antiAliasing = 1;
}
_targetCamera = target;
_targetCamera.targetTexture = _targetTex;
//渲染一次,防止出现白色
_targetCamera.Render();
_finishCallBack = finishCallBack;
Update();
}
#endregion
#region//脚本函数
private void Update()
{
_timer += Time.deltaTime;
_material.SetTexture("_TargetText", _targetTex);
_material.SetFloat("_LerpValue", _timer / _blendTime);
if (_timer >= _blendTime)
{
_finishCallBack();
}
//同步摄像机位置,防止重影
_targetCamera.transform.localPosition = transform.localPosition;
}
private void OnRenderImage(RenderTexture source, RenderTexture destination)
{
Graphics.Blit(source, destination, _material);
}
private void OnDestroy()
{
GameObject.DestroyImmediate(_material);
RenderTexture.ReleaseTemporary(_targetTex);
_targetCamera.targetTexture = null;
}
#endregion
}
}