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

159 lines
4.8 KiB
C#
Raw Normal View History

2026-02-06 17:55:06 +08:00
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;
}
}
}