using UnityEditor; using UnityEngine; using UnityEngine.UI; using XericUI.ReflectionUIGenerator; namespace XericUIEditor.ReflectionUIGenerator { /// /// 反射界面生成器的 Hierarchy 右键菜单示例 /// 在 Hierarchy 中右键 -> Xeric UI -> Create Reflection UI Example 即可快速创建示例场景 /// /// 创建后: /// 1. 将配置好的 XuiavrgPropertyGroupScriptableObject 通过代码传入 Manager /// 2. 调用 manager.BuildEntries(new XuiavrgExampleTestData()) 构建 Entry /// 3. 调用 manager.GenerateUI() 生成界面 /// public static class XuiavrgExampleMenu { private const string MenuPath = "GameObject/Xeric UI/Create Reflection UI Example"; private const int MenuPriority = 10; [MenuItem(MenuPath, false, MenuPriority)] private static void CreateReflectionUIExample() { // 1. 确保有 Canvas(如果没有则创建) Canvas canvas = Object.FindObjectOfType(); if (canvas == null) { GameObject canvasGo = new GameObject("Canvas", typeof(Canvas), typeof(CanvasScaler), typeof(GraphicRaycaster)); canvas = canvasGo.GetComponent(); canvas.renderMode = RenderMode.ScreenSpaceOverlay; canvasGo.GetComponent().uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize; canvasGo.GetComponent().referenceResolution = new Vector2(1920, 1080); Undo.RegisterCreatedObjectUndo(canvasGo, "Create Reflection UI Example"); } // 2. 确保有 EventSystem if (Object.FindObjectOfType() == null) { GameObject eventSystemGo = new GameObject("EventSystem", typeof(UnityEngine.EventSystems.EventSystem), typeof(UnityEngine.EventSystems.StandaloneInputModule)); Undo.RegisterCreatedObjectUndo(eventSystemGo, "Create Reflection UI Example"); } // 3. 创建示例根节点(带 Manager 和 Grid 布局) GameObject rootPanel = new GameObject("ReflectionUIExample", typeof(RectTransform), typeof(XuiavrgInspectorManager)); Undo.RegisterCreatedObjectUndo(rootPanel, "Create Reflection UI Example"); rootPanel.transform.SetParent(canvas.transform, false); RectTransform rootRt = rootPanel.GetComponent(); rootRt.anchorMin = Vector2.zero; rootRt.anchorMax = Vector2.one; rootRt.offsetMin = new Vector2(100, 100); rootRt.offsetMax = new Vector2(-100, -100); // 添加背景 Image Image rootImage = rootPanel.AddComponent(); rootImage.color = new Color(0.15f, 0.15f, 0.15f, 0.9f); // 4. 创建 Grid 布局的内容区域(作为 Entry 生成的父节点) GameObject contentArea = new GameObject("ContentGrid", typeof(RectTransform), typeof(GridLayoutGroup), typeof(ContentSizeFitter)); Undo.RegisterCreatedObjectUndo(contentArea, "Create Reflection UI Example"); contentArea.transform.SetParent(rootPanel.transform, false); RectTransform contentRt = contentArea.GetComponent(); contentRt.anchorMin = Vector2.zero; contentRt.anchorMax = Vector2.one; contentRt.offsetMin = new Vector2(20, 20); contentRt.offsetMax = new Vector2(-20, -20); // 配置 GridLayoutGroup GridLayoutGroup gridLayout = contentArea.GetComponent(); gridLayout.cellSize = new Vector2(400, 60); gridLayout.spacing = new Vector2(10, 10); gridLayout.padding = new RectOffset(10, 10, 10, 10); gridLayout.startCorner = GridLayoutGroup.Corner.UpperLeft; gridLayout.startAxis = GridLayoutGroup.Axis.Horizontal; gridLayout.childAlignment = TextAnchor.UpperLeft; gridLayout.constraint = GridLayoutGroup.Constraint.FixedColumnCount; gridLayout.constraintCount = 1; // 配置 ContentSizeFitter - 垂直方向自适应 ContentSizeFitter fitter = contentArea.GetComponent(); fitter.horizontalFit = ContentSizeFitter.FitMode.Unconstrained; fitter.verticalFit = ContentSizeFitter.FitMode.PreferredSize; // 5. 选中新创建的节点 Selection.activeGameObject = rootPanel; Debug.Log("[Xuiavrg] 反射界面示例已创建。\n" + "使用步骤:\n" + "1. 创建 XuiavrgPropertyGroupScriptableObject 并设置 groupName/supportedTags\n" + "2. 调用 manager.BuildEntries(new XuiavrgExampleTestData())\n" + "3. 调用 manager.GenerateUI()"); } [MenuItem(MenuPath, true)] private static bool ValidateCreateReflectionUIExample() { return true; } } }