NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Camera/EnableDepthTextureForCamera.cs

159 lines
4.8 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using UnityEngine;
using UnityEngine.Rendering.Universal;
using UnityEngine.SceneManagement;
namespace NLD
{
/// <summary>
/// 在特定相机和特定场景上启用depth texture
/// 用于支持需要深度信息的shader如雾效soft particles
/// </summary>
[RequireComponent(typeof(UnityEngine.Camera))]
public class EnableDepthTextureForCamera : MonoBehaviour
{
[Header("场景限制")]
[Tooltip("指定在哪些场景中启用depth texture留空则在所有场景生效")]
[SerializeField] private string[] targetSceneNames = new string[0];
[Header("调试信息")]
[Tooltip("是否输出调试日志")]
[SerializeField] private bool showDebugLog = true;
private UnityEngine.Camera _camera;
private UniversalAdditionalCameraData _cameraData;
private bool _originalRequireDepth;
private bool _isDepthEnabled = false;
private void OnEnable()
{
// 检查是否在目标场景中
if (!IsInTargetScene())
{
if (showDebugLog)
{
Debug.Log($"[EnableDepthTexture] 相机 '{gameObject.name}' 不在目标场景中,跳过启用");
}
return;
}
InitializeCamera();
EnableDepthTexture();
CheckRenderTextureConfiguration();
}
private void OnDisable()
{
RestoreOriginalSettings();
}
private void InitializeCamera()
{
_camera = GetComponent<UnityEngine.Camera>();
_cameraData = _camera.GetUniversalAdditionalCameraData();
if (_cameraData == null)
{
Debug.LogError($"[EnableDepthTexture] 相机 '{gameObject.name}' 没有UniversalAdditionalCameraData组件");
}
}
private void EnableDepthTexture()
{
if (_cameraData == null) return;
_originalRequireDepth = _cameraData.requiresDepthTexture;
_cameraData.requiresDepthTexture = true;
_isDepthEnabled = true;
if (showDebugLog)
{
Debug.Log($"[EnableDepthTexture] 已在相机 '{gameObject.name}' 上启用depth texture");
}
}
private void RestoreOriginalSettings()
{
if (_isDepthEnabled && _cameraData != null)
{
_cameraData.requiresDepthTexture = _originalRequireDepth;
_isDepthEnabled = false;
if (showDebugLog)
{
Debug.Log($"[EnableDepthTexture] 已恢复相机 '{gameObject.name}' 的原始depth texture设置");
}
}
}
private bool IsInTargetScene()
{
if (targetSceneNames == null || targetSceneNames.Length == 0)
{
return true;
}
string currentSceneName = SceneManager.GetActiveScene().name;
foreach (string sceneName in targetSceneNames)
{
if (string.IsNullOrEmpty(sceneName))
{
continue;
}
if (currentSceneName.Equals(sceneName, System.StringComparison.OrdinalIgnoreCase))
{
return true;
}
}
return false;
}
private void CheckRenderTextureConfiguration()
{
if (_camera == null || _camera.targetTexture == null)
{
return;
}
RenderTexture rt = _camera.targetTexture;
if (rt.depth == 0)
{
Debug.LogWarning(
$"[EnableDepthTexture] 警告:相机 '{gameObject.name}' 渲染到RenderTexture '{rt.name}'" +
$"但该RT没有depth buffer (depthBufferBits = 0)\n"
);
}
else if (showDebugLog)
{
Debug.Log(
$"[EnableDepthTexture] RenderTexture '{rt.name}' 配置正确 " +
$"(depthBufferBits = {rt.depth})"
);
}
}
public void SetDepthTextureEnabled(bool enabled)
{
if (_cameraData != null && IsInTargetScene())
{
_cameraData.requiresDepthTexture = enabled;
_isDepthEnabled = enabled;
if (showDebugLog)
{
Debug.Log($"[EnableDepthTexture] 运行时设置depth texture为: {enabled}");
}
}
}
public bool IsDepthTextureEnabled()
{
return _isDepthEnabled && _cameraData != null && _cameraData.requiresDepthTexture;
}
}
}