Files
ichni_Creator_Studio/Assets/Scripts/Manager/PostProcessingManager.cs
SoulliesOfficial bcd71d225e Radial Blur
2025-07-15 08:52:36 -04:00

91 lines
3.2 KiB
C#

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Sirenix.OdinInspector;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
namespace Ichni.Editor
{
public class PostProcessingManager : MonoBehaviour
{
public Volume globalVolume;
public NBPostProcessingController nbController;
public PixelateFeature pixelateFeature;
void Awake()
{
FindAndCacheFeatureWithReflection();
SetFeatureActive(false);
SetPixelateStrength(Screen.width, Screen.height);
}
private void FindAndCacheFeatureWithReflection()
{
var pipelineAsset = GraphicsSettings.currentRenderPipeline as UniversalRenderPipelineAsset;
if (pipelineAsset == null)
{
Debug.LogError("当前渲染管线不是 UniversalRenderPipelineAsset。");
return;
}
// 2. 使用反射来获取内部的 m_RendererDataList 字段
FieldInfo rendererDataListField = typeof(UniversalRenderPipelineAsset).GetField("m_RendererDataList", BindingFlags.NonPublic | BindingFlags.Instance);
if (rendererDataListField == null)
{
Debug.LogError("在 UniversalRenderPipelineAsset 中无法通过反射找到 'm_RendererDataList' 字段。API可能已在你的URP版本中更改。");
return;
}
var rendererDataList = rendererDataListField.GetValue(pipelineAsset) as ScriptableRendererData[];
if (rendererDataList == null)
{
Debug.LogError("获取渲染器数据列表失败。");
return;
}
// 3. 遍历获取到的列表来查找我们的Feature
foreach (var rendererData in rendererDataList)
{
if (rendererData == null) continue;
var feature = rendererData.rendererFeatures.OfType<PixelateFeature>().FirstOrDefault();
if (feature != null)
{
pixelateFeature = feature;
Debug.Log("成功找到并缓存 pixelateFeature (通过反射)!");
break;
}
}
if (pixelateFeature == null)
{
Debug.LogError("在所有 RendererData 中都未找到 pixelateFeature。");
}
}
public void SetFeatureActive(bool enable)
{
if (pixelateFeature != null)
{
pixelateFeature.SetActive(enable);
}
}
public void SetPixelateStrength(float strengthX, float strengthY)
{
if (pixelateFeature != null)
{
pixelateFeature.settings.pixelateStrengthX = strengthX;
pixelateFeature.settings.pixelateStrengthY = strengthY;
pixelateFeature.pixelatePass.UpdateConfig(strengthX, strengthY);
}
else
{
Debug.LogError("Pixelate feature is not initialized.");
}
}
}
}