Files
Cielonos/Assets/Plugins/FlexibleUI/Editor/FlexibleBlur/DemoSceneFeatureCheckWindow.cs
SoulliesOfficial 649b7a5ddc 更新
2026-05-23 08:27:50 -04:00

84 lines
3.3 KiB
C#

using System.Linq;
using System.Reflection;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine.SceneManagement;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
namespace JeffGrawAssets.FlexibleUI
{
[InitializeOnLoad]
public class DemoSceneFeatureCheckWindow : EditorWindow
{
const float WindowWidth = 500f;
const float WindowHeight = 80;
private ScriptableRendererData rendererData;
static DemoSceneFeatureCheckWindow() => EditorSceneManager.sceneOpened += StartupCheck;
static void StartupCheck(Scene scene, OpenSceneMode _)
{
// Only show the popup when we're loading a demo scene. In any other scene, the UIBlur or FlexibleImage component will provide directions when added, but in a demo scene the user may not check the existing components.
var lowerPath = scene.path.ToLower();
if (!lowerPath.Contains("flexibleblur") || !lowerPath.Contains("scenes"))
return;
var pipelineAsset = QualitySettings.GetRenderPipelineAssetAt(QualitySettings.GetQualityLevel()) as UniversalRenderPipelineAsset;
if (pipelineAsset == null)
{
pipelineAsset = GraphicsSettings.defaultRenderPipeline as UniversalRenderPipelineAsset;
if (pipelineAsset == null)
return;
}
// If any renderer contains the feature, fair to say the user knows what they are doing.
#if UNITY_2023_2_OR_NEWER
if (pipelineAsset.rendererDataList.ToArray().Any(x => x != null && x.TryGetRendererFeature<FlexibleBlurFeature>(out var _)))
return;
#else
var dataListField = typeof(UniversalRenderPipelineAsset).GetField("m_RendererDataList", BindingFlags.NonPublic | BindingFlags.Instance);
var dataListObj = dataListField?.GetValue(pipelineAsset);
if (dataListObj is not ScriptableRendererData[] dataList || dataList.SelectMany(x => x.rendererFeatures).Any(x => x is FlexibleBlurFeature))
return;
#endif
var window = GetWindowWithRect<DemoSceneFeatureCheckWindow>
(
new Rect(0.5f * (Screen.width - WindowWidth), 0.5f * (Screen.height - WindowHeight), WindowWidth, WindowHeight), true, "Flexible Blur", true
);
var defaultRendererIdxField = typeof(UniversalRenderPipelineAsset).GetField("m_DefaultRendererIndex", BindingFlags.NonPublic | BindingFlags.Instance);
var defaultRendererIdxFieldObj = defaultRendererIdxField?.GetValue(pipelineAsset);
int defaultRendererIdx = defaultRendererIdxFieldObj is int obj ? obj : 0;
#if UNITY_2023_2_OR_NEWER
window.rendererData = pipelineAsset.rendererDataList[defaultRendererIdx];
#else
window.rendererData = dataList[defaultRendererIdx];
#endif
}
void OnGUI()
{
var mainMessage = new GUIStyle(EditorStyles.label)
{
alignment = TextAnchor.MiddleCenter,
fontSize = 16
};
GUILayout.Space(6);
GUILayout.Label($"{nameof(FlexibleBlurFeature)} should be present in at least one renderer.", mainMessage);
GUILayout.FlexibleSpace();
if (!GUILayout.Button("Open DEFAULT Renderer", GUILayout.Height(36)))
return;
EditorGUIUtility.PingObject(rendererData);
Selection.activeObject = rendererData;
Close();
}
}
}