159 lines
4.8 KiB
C#
159 lines
4.8 KiB
C#
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;
|
||
}
|
||
}
|
||
}
|