Unity scene & game 屏幕效果相机管理学习

在做屏幕相关效果时,不可避免地我们要对相机画面做修改,但是你去修改的相机是哪个?如果不做处理,可能会scene有效果,game没效果。

//每个相机自己的对应对象
private class MyCameraData
{
	public Material material;
	//销毁管理
	public void Dispose()
    {
        if (material != null)
        {
            SafeDestroy(material);
            material = null;
        }
    }
}
private static Dictionary<Camera, MyCameraData> cacheData = new Dictionary<Camera, MyCameraData>();

private MyCameraData GetData(CameraData cameraData)
{
    var camera = cameraData.camera;
    if (!cacheData.TryGetValue(camera, out var data))
    {
        data = new MyCameraData();
        cacheData.Add(camera, data);
    }

    return data;
}

public override bool Execute(ref CameraData cameraData, CommandBuffer cmd, RenderTargetIdentifier source,
 RenderTargetIdentifier destination)
{
	//根据相机属性创建对应data
   var data = GetData(cameraData);
   if (!GetMaterial(data)) return false;

	//TODO
	
   cmd.Blit(source, destination, data.material);

   return true;
}

public override void Cleanup()
{
    base.Cleanup();
    Dispose();
}
protected override void OnDestroy()
{
    base.OnDestroy();
    Dispose();
}

//获取指定shader
bool GetMaterial(PerCameraData data)
  {
      if (data.material == null)
      {
          var MyShader = Shader.Find(shaderTag);
          if (MyShader == null)
          {
              Debug.Log($"Check for missing shader {shaderTag}");
              return false;
          }

          data.material = CoreUtils.CreateEngineMaterial(Shader.Find(shaderTag));
      }

      if (data.material == null)
      {
          Debug.LogWarning("Missing material. effect will not Active. Check for missing shader");
          return false;
      }

      if (!data.material.shader.isSupported) return false;
      return true;
  }
  
private static void SafeDestroy(Object obj)
{
    if (Application.isEditor)
    {
        DestroyImmediate(obj);
    }
    else
    {
        Destroy(obj);
    }
}
private void Dispose()
{
    foreach (var MyCameraData in _cacheData)
    {
        MyCameraData.Value.Dispose();
    }

    _cacheData.Clear();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值