MeowmentDebugTool/Packages/com.bywaystudios.meowmentdebugtool/Editor/DebugToolPrefabGenerator.cs
2025-12-19 12:14:42 +08:00

980 lines
41 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using UnityEngine;
using UnityEditor;
using UnityEngine.UI;
using TMPro;
using MeowmentDebugTool;
namespace MeowmentDebugTool.Editor
{
/// <summary>
/// 通用调试工具预制件生成器
/// 用于创建UniversalDebugTool所需的完整UI预制件
/// </summary>
public class DebugToolPrefabGenerator : EditorWindow
{
private string prefabSavePath = "Assets/UniversalDebugTool.prefab";
[MenuItem("Tools/Debug Tool/生成调试工具预制件")]
public static void ShowWindow()
{
var window = GetWindow<DebugToolPrefabGenerator>("调试工具预制件生成器");
window.minSize = new Vector2(400, 300);
window.Show();
}
private void OnGUI()
{
GUILayout.Space(10);
EditorGUILayout.LabelField("通用调试工具预制件生成器", EditorStyles.boldLabel);
EditorGUILayout.HelpBox("这个工具将创建一个完整的调试工具UI预制件包含所有必需的组件和布局。", MessageType.Info);
GUILayout.Space(10);
EditorGUILayout.LabelField("保存路径:", EditorStyles.boldLabel);
EditorGUILayout.BeginHorizontal();
prefabSavePath = EditorGUILayout.TextField(prefabSavePath);
if (GUILayout.Button("浏览", GUILayout.Width(60)))
{
string path = EditorUtility.SaveFilePanelInProject("保存预制件", "UniversalDebugTool", "prefab", "选择保存位置");
if (!string.IsNullOrEmpty(path))
{
prefabSavePath = path;
}
}
EditorGUILayout.EndHorizontal();
GUILayout.Space(20);
if (GUILayout.Button("生成预制件", GUILayout.Height(40)))
{
GeneratePrefab();
}
GUILayout.Space(10);
EditorGUILayout.HelpBox(
"生成后的预制件将包含:\n" +
"• 主窗口 (1080x2340)\n" +
"• 标签页系统\n" +
"• 参数查看页面\n" +
"• 自定义按钮页面\n" +
"• 设置页面\n" +
"• 输入对话框",
MessageType.None);
}
private void GeneratePrefab()
{
try
{
// 创建根对象
GameObject root = new GameObject("UniversalDebugTool");
// 添加Canvas
Canvas canvas = root.AddComponent<Canvas>();
canvas.renderMode = RenderMode.ScreenSpaceOverlay;
canvas.sortingOrder = 999; // 确保显示在最上层
CanvasScaler scaler = root.AddComponent<CanvasScaler>();
scaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize;
scaler.referenceResolution = new Vector2(1080, 2340);
scaler.matchWidthOrHeight = 0.5f;
root.AddComponent<GraphicRaycaster>();
// 添加主组件
UniversalDebugTool debugTool = root.AddComponent<UniversalDebugTool>();
// 创建主窗口
GameObject mainWindow = CreateMainWindow(root.transform);
// 创建标签页容器
GameObject tabContainer = CreateTabContainer(mainWindow.transform);
// 创建关闭按钮(在标签容器的最左边)
GameObject closeButton = CreateCloseButton(tabContainer.transform);
// 创建内容容器
GameObject contentContainer = CreateContentContainer(mainWindow.transform);
// 创建各个页面
GameObject parametersPage = CreateParametersPage(contentContainer.transform);
GameObject customButtonsPage = CreateCustomButtonsPage(contentContainer.transform);
GameObject toolbarPage = CreateToolbarPage(contentContainer.transform);
GameObject settingsPage = CreateSettingsPage(contentContainer.transform);
// 创建标签按钮预制件
GameObject tabButtonPrefab = CreateTabButtonPrefab();
// 创建自定义按钮预制件
GameObject customButtonPrefab = CreateCustomButtonPrefab();
// 创建输入对话框
GameObject inputDialog = CreateInputDialog(mainWindow.transform);
// 创建悬浮按钮
GameObject floatingButton = CreateFloatingButton(root.transform);
// 设置引用
SetupReferences(debugTool, mainWindow, tabContainer, contentContainer,
parametersPage, customButtonsPage, toolbarPage, settingsPage,
tabButtonPrefab, customButtonPrefab, inputDialog, canvas,
closeButton, floatingButton);
// 保存为预制件
PrefabUtility.SaveAsPrefabAsset(root, prefabSavePath);
// 清理临时对象
DestroyImmediate(root);
DestroyImmediate(tabButtonPrefab);
DestroyImmediate(customButtonPrefab);
AssetDatabase.Refresh();
EditorUtility.DisplayDialog("成功", $"预制件已生成: {prefabSavePath}", "确定");
// 选中生成的预制件
Selection.activeObject = AssetDatabase.LoadAssetAtPath<GameObject>(prefabSavePath);
}
catch (System.Exception e)
{
EditorUtility.DisplayDialog("错误", $"生成预制件时出错: {e.Message}", "确定");
Debug.LogError(e);
}
}
private GameObject CreateMainWindow(Transform parent)
{
GameObject obj = new GameObject("MainWindow");
obj.transform.SetParent(parent, false);
RectTransform rt = obj.AddComponent<RectTransform>();
rt.sizeDelta = new Vector2(1080, 2340);
// 锚点在左上角确保在任何分辨率下都能看到顶部的tabbar
rt.anchorMin = new Vector2(0, 1);
rt.anchorMax = new Vector2(0, 1);
rt.pivot = new Vector2(0, 1);
rt.anchoredPosition = new Vector2(0, 0);
Image bg = obj.AddComponent<Image>();
bg.color = new Color(0.1f, 0.1f, 0.1f, 0.95f);
return obj;
}
private GameObject CreateTabContainer(Transform parent)
{
GameObject obj = new GameObject("TabButtonContainer");
obj.transform.SetParent(parent, false);
RectTransform rt = obj.AddComponent<RectTransform>();
rt.anchorMin = new Vector2(0, 1);
rt.anchorMax = new Vector2(1, 1);
rt.pivot = new Vector2(0.5f, 1);
rt.anchoredPosition = new Vector2(0, 0);
rt.sizeDelta = new Vector2(0, 100);
HorizontalLayoutGroup layout = obj.AddComponent<HorizontalLayoutGroup>();
layout.childControlWidth = false; // 改为false让关闭按钮有固定宽度
layout.childControlHeight = true;
layout.childForceExpandWidth = false; // 改为false
layout.childForceExpandHeight = true;
layout.spacing = 10;
layout.padding = new RectOffset(10, 10, 10, 10);
return obj;
}
private GameObject CreateCloseButton(Transform parent)
{
GameObject btn = new GameObject("CloseButton");
btn.transform.SetParent(parent, false);
RectTransform rt = btn.AddComponent<RectTransform>();
rt.sizeDelta = new Vector2(100, 80); // 固定宽度
LayoutElement layout = btn.AddComponent<LayoutElement>();
layout.preferredWidth = 100;
layout.flexibleWidth = 0;
Image img = btn.AddComponent<Image>();
img.color = new Color(0.8f, 0.2f, 0.2f); // 红色
Button button = btn.AddComponent<Button>();
button.targetGraphic = img;
GameObject textObj = new GameObject("Text");
textObj.transform.SetParent(btn.transform, false);
RectTransform textRt = textObj.AddComponent<RectTransform>();
textRt.anchorMin = Vector2.zero;
textRt.anchorMax = Vector2.one;
textRt.sizeDelta = Vector2.zero;
TextMeshProUGUI text = textObj.AddComponent<TextMeshProUGUI>();
text.text = "✕";
text.fontSize = 48;
text.alignment = TextAlignmentOptions.Center;
text.color = Color.white;
return btn;
}
private GameObject CreateFloatingButton(Transform parent)
{
GameObject floatBtn = new GameObject("FloatingButton");
floatBtn.transform.SetParent(parent, false);
RectTransform rt = floatBtn.AddComponent<RectTransform>();
rt.sizeDelta = new Vector2(120, 120);
// 使用中心锚点,确保拖动坐标系一致
rt.anchorMin = new Vector2(0.5f, 0.5f);
rt.anchorMax = new Vector2(0.5f, 0.5f);
rt.pivot = new Vector2(0.5f, 0.5f);
// 初始位置在右上角Canvas中心坐标系
rt.anchoredPosition = new Vector2(470, 1100); // 对于1080x2340分辨率
Image img = floatBtn.AddComponent<Image>();
img.color = new Color(0.2f, 0.7f, 0.3f, 0.9f); // 半透明绿色
Button button = floatBtn.AddComponent<Button>();
button.targetGraphic = img;
// 添加可拖动组件
DraggableFloatingButton draggable = floatBtn.AddComponent<DraggableFloatingButton>();
draggable.clampToScreen = true;
draggable.snapToEdge = true;
draggable.edgePadding = 20f;
draggable.snapDuration = 0.3f;
// 添加文本
GameObject textObj = new GameObject("Text");
textObj.transform.SetParent(floatBtn.transform, false);
RectTransform textRt = textObj.AddComponent<RectTransform>();
textRt.anchorMin = Vector2.zero;
textRt.anchorMax = Vector2.one;
textRt.sizeDelta = Vector2.zero;
TextMeshProUGUI text = textObj.AddComponent<TextMeshProUGUI>();
text.text = "DEBUG";
text.fontSize = 24;
text.alignment = TextAlignmentOptions.Center;
text.color = Color.white;
text.fontStyle = FontStyles.Bold;
// 默认隐藏
floatBtn.SetActive(false);
return floatBtn;
}
private GameObject CreateContentContainer(Transform parent)
{
GameObject obj = new GameObject("ContentContainer");
obj.transform.SetParent(parent, false);
RectTransform rt = obj.AddComponent<RectTransform>();
rt.anchorMin = new Vector2(0, 0);
rt.anchorMax = new Vector2(1, 1);
rt.pivot = new Vector2(0.5f, 0.5f);
rt.offsetMin = new Vector2(20, 20);
rt.offsetMax = new Vector2(-20, -120); // 为标签栏留空间
return obj;
}
private GameObject CreateParametersPage(Transform parent)
{
GameObject page = new GameObject("ParametersPage");
page.transform.SetParent(parent, false);
RectTransform rt = page.AddComponent<RectTransform>();
rt.anchorMin = Vector2.zero;
rt.anchorMax = Vector2.one;
rt.sizeDelta = Vector2.zero;
// 创建ScrollView
GameObject scrollView = new GameObject("ScrollView");
scrollView.transform.SetParent(page.transform, false);
RectTransform scrollRt = scrollView.AddComponent<RectTransform>();
scrollRt.anchorMin = Vector2.zero;
scrollRt.anchorMax = Vector2.one;
scrollRt.sizeDelta = Vector2.zero;
ScrollRect scroll = scrollView.AddComponent<ScrollRect>();
scroll.horizontal = false;
scroll.vertical = true;
// Viewport
GameObject viewport = new GameObject("Viewport");
viewport.transform.SetParent(scrollView.transform, false);
RectTransform viewportRt = viewport.AddComponent<RectTransform>();
viewportRt.anchorMin = Vector2.zero;
viewportRt.anchorMax = Vector2.one;
viewportRt.sizeDelta = Vector2.zero;
viewport.AddComponent<RectMask2D>();
// Content
GameObject content = new GameObject("Content");
content.transform.SetParent(viewport.transform, false);
RectTransform contentRt = content.AddComponent<RectTransform>();
contentRt.anchorMin = new Vector2(0, 1);
contentRt.anchorMax = new Vector2(1, 1);
contentRt.pivot = new Vector2(0.5f, 1);
contentRt.sizeDelta = new Vector2(0, 2000);
VerticalLayoutGroup vlg = content.AddComponent<VerticalLayoutGroup>();
vlg.childControlWidth = true;
vlg.childControlHeight = true;
vlg.childForceExpandWidth = true;
vlg.childForceExpandHeight = false;
vlg.spacing = 20;
vlg.padding = new RectOffset(20, 20, 20, 20);
ContentSizeFitter csf = content.AddComponent<ContentSizeFitter>();
csf.verticalFit = ContentSizeFitter.FitMode.PreferredSize;
scroll.content = contentRt;
scroll.viewport = viewportRt;
// 设备信息文本
GameObject deviceInfo = CreateTextObject("DeviceInfoText", content.transform);
deviceInfo.GetComponent<TextMeshProUGUI>().text = "设备信息将在这里显示";
// 系统信息文本
GameObject systemInfo = CreateTextObject("SystemInfoText", content.transform);
systemInfo.GetComponent<TextMeshProUGUI>().text = "系统信息将在这里显示";
return page;
}
private GameObject CreateCustomButtonsPage(Transform parent)
{
GameObject page = new GameObject("CustomButtonsPage");
page.transform.SetParent(parent, false);
RectTransform rt = page.AddComponent<RectTransform>();
rt.anchorMin = Vector2.zero;
rt.anchorMax = Vector2.one;
rt.sizeDelta = Vector2.zero;
// 创建ScrollView
GameObject scrollView = new GameObject("ScrollView");
scrollView.transform.SetParent(page.transform, false);
RectTransform scrollRt = scrollView.AddComponent<RectTransform>();
scrollRt.anchorMin = Vector2.zero;
scrollRt.anchorMax = Vector2.one;
scrollRt.sizeDelta = Vector2.zero;
ScrollRect scroll = scrollView.AddComponent<ScrollRect>();
scroll.horizontal = false;
scroll.vertical = true;
// Viewport
GameObject viewport = new GameObject("Viewport");
viewport.transform.SetParent(scrollView.transform, false);
RectTransform viewportRt = viewport.AddComponent<RectTransform>();
viewportRt.anchorMin = Vector2.zero;
viewportRt.anchorMax = Vector2.one;
viewportRt.sizeDelta = Vector2.zero;
viewport.AddComponent<RectMask2D>();
// Content (按钮容器)
GameObject buttonContainer = new GameObject("ButtonContainer");
buttonContainer.transform.SetParent(viewport.transform, false);
RectTransform contentRt = buttonContainer.AddComponent<RectTransform>();
contentRt.anchorMin = new Vector2(0, 1);
contentRt.anchorMax = new Vector2(1, 1);
contentRt.pivot = new Vector2(0.5f, 1);
contentRt.sizeDelta = new Vector2(0, 2000);
GridLayoutGroup grid = buttonContainer.AddComponent<GridLayoutGroup>();
grid.cellSize = new Vector2(300, 80);
grid.spacing = new Vector2(20, 20);
grid.padding = new RectOffset(20, 20, 20, 20);
grid.constraint = GridLayoutGroup.Constraint.FixedColumnCount;
grid.constraintCount = 3;
ContentSizeFitter csf = buttonContainer.AddComponent<ContentSizeFitter>();
csf.verticalFit = ContentSizeFitter.FitMode.PreferredSize;
scroll.content = contentRt;
scroll.viewport = viewportRt;
return page;
}
private GameObject CreateToolbarPage(Transform parent)
{
GameObject page = new GameObject("ToolbarPage");
page.transform.SetParent(parent, false);
RectTransform rt = page.AddComponent<RectTransform>();
rt.anchorMin = Vector2.zero;
rt.anchorMax = Vector2.one;
rt.sizeDelta = Vector2.zero;
// 内容容器
GameObject content = new GameObject("Content");
content.transform.SetParent(page.transform, false);
RectTransform contentRt = content.AddComponent<RectTransform>();
contentRt.anchorMin = new Vector2(0, 1);
contentRt.anchorMax = new Vector2(1, 1);
contentRt.pivot = new Vector2(0.5f, 1);
contentRt.anchoredPosition = new Vector2(0, 0);
contentRt.sizeDelta = new Vector2(0, 1500);
VerticalLayoutGroup vlg = content.AddComponent<VerticalLayoutGroup>();
vlg.childControlWidth = true;
vlg.childControlHeight = false;
vlg.childForceExpandWidth = true;
vlg.spacing = 40;
vlg.padding = new RectOffset(50, 50, 50, 50);
// 标题
GameObject title = CreateTextObject("Title", content.transform);
TextMeshProUGUI titleText = title.GetComponent<TextMeshProUGUI>();
titleText.text = "系统工具";
titleText.fontSize = 48;
titleText.alignment = TextAlignmentOptions.Center;
titleText.fontStyle = FontStyles.Bold;
LayoutElement titleLayout = title.AddComponent<LayoutElement>();
titleLayout.preferredHeight = 80;
// 时间缩放控制
GameObject timeScaleControl = CreateTimeScaleControl(content.transform);
// 可以在这里添加更多工具...
return page;
}
private GameObject CreateTimeScaleControl(Transform parent)
{
// 主容器
GameObject container = new GameObject("TimeAdjustControl");
container.transform.SetParent(parent, false);
RectTransform containerRt = container.AddComponent<RectTransform>();
VerticalLayoutGroup vlg = container.AddComponent<VerticalLayoutGroup>();
vlg.childControlWidth = true;
vlg.childControlHeight = false;
vlg.childForceExpandWidth = true;
vlg.spacing = 20;
vlg.padding = new RectOffset(20, 20, 20, 20);
Image bg = container.AddComponent<Image>();
bg.color = new Color(0.15f, 0.15f, 0.2f, 0.8f);
LayoutElement containerLayout = container.AddComponent<LayoutElement>();
containerLayout.preferredHeight = 400;
// 标题
GameObject titleObj = CreateTextObject("Title", container.transform);
TextMeshProUGUI titleText = titleObj.GetComponent<TextMeshProUGUI>();
titleText.text = "时间调整工具";
titleText.fontSize = 40;
titleText.alignment = TextAlignmentOptions.Center;
titleText.fontStyle = FontStyles.Bold;
LayoutElement titleLayout = titleObj.AddComponent<LayoutElement>();
titleLayout.preferredHeight = 60;
// 当前值显示
GameObject valueObj = CreateTextObject("ValueText", container.transform);
TextMeshProUGUI valueText = valueObj.GetComponent<TextMeshProUGUI>();
valueText.text = "60秒";
valueText.fontSize = 36;
valueText.alignment = TextAlignmentOptions.Center;
valueText.color = new Color(0.3f, 0.8f, 1f);
LayoutElement valueLayout = valueObj.AddComponent<LayoutElement>();
valueLayout.preferredHeight = 50;
// Slider
GameObject sliderObj = new GameObject("Slider");
sliderObj.transform.SetParent(container.transform, false);
RectTransform sliderRt = sliderObj.AddComponent<RectTransform>();
Slider slider = sliderObj.AddComponent<Slider>();
slider.minValue = 1f; // 最小1秒
slider.maxValue = 600f; // 最大600秒10分钟
slider.value = 60f; // 默认60秒
slider.wholeNumbers = true;
LayoutElement sliderLayout = sliderObj.AddComponent<LayoutElement>();
sliderLayout.preferredHeight = 60;
// Background
GameObject bg_obj = new GameObject("Background");
bg_obj.transform.SetParent(sliderObj.transform, false);
RectTransform bgRt = bg_obj.AddComponent<RectTransform>();
bgRt.anchorMin = new Vector2(0, 0.25f);
bgRt.anchorMax = new Vector2(1, 0.75f);
bgRt.sizeDelta = Vector2.zero;
Image bgImage = bg_obj.AddComponent<Image>();
bgImage.color = new Color(0.2f, 0.2f, 0.2f);
// Fill Area
GameObject fillArea = new GameObject("Fill Area");
fillArea.transform.SetParent(sliderObj.transform, false);
RectTransform fillAreaRt = fillArea.AddComponent<RectTransform>();
fillAreaRt.anchorMin = new Vector2(0, 0.25f);
fillAreaRt.anchorMax = new Vector2(1, 0.75f);
fillAreaRt.sizeDelta = new Vector2(-20, 0);
// Fill
GameObject fill = new GameObject("Fill");
fill.transform.SetParent(fillArea.transform, false);
RectTransform fillRt = fill.AddComponent<RectTransform>();
fillRt.sizeDelta = Vector2.zero;
Image fillImage = fill.AddComponent<Image>();
fillImage.color = new Color(0.2f, 0.7f, 1f);
fillImage.type = Image.Type.Filled;
fillImage.fillMethod = Image.FillMethod.Horizontal;
slider.fillRect = fillRt;
// Handle Slide Area
GameObject handleArea = new GameObject("Handle Slide Area");
handleArea.transform.SetParent(sliderObj.transform, false);
RectTransform handleAreaRt = handleArea.AddComponent<RectTransform>();
handleAreaRt.anchorMin = new Vector2(0, 0);
handleAreaRt.anchorMax = new Vector2(1, 1);
handleAreaRt.sizeDelta = new Vector2(-20, 0);
// Handle
GameObject handle = new GameObject("Handle");
handle.transform.SetParent(handleArea.transform, false);
RectTransform handleRt = handle.AddComponent<RectTransform>();
handleRt.sizeDelta = new Vector2(40, 0);
Image handleImage = handle.AddComponent<Image>();
handleImage.color = new Color(1f, 1f, 1f);
slider.handleRect = handleRt;
slider.targetGraphic = handleImage;
// 说明文字
GameObject descObj = CreateTextObject("Description", container.transform);
TextMeshProUGUI descText = descObj.GetComponent<TextMeshProUGUI>();
descText.text = "拖动设置时间量1秒 - 10分钟";
descText.fontSize = 28;
descText.alignment = TextAlignmentOptions.Center;
descText.color = new Color(0.7f, 0.7f, 0.7f);
LayoutElement descLayout = descObj.AddComponent<LayoutElement>();
descLayout.preferredHeight = 40;
// 按钮容器
GameObject buttonContainer = new GameObject("ButtonContainer");
buttonContainer.transform.SetParent(container.transform, false);
HorizontalLayoutGroup hlg = buttonContainer.AddComponent<HorizontalLayoutGroup>();
hlg.spacing = 30;
hlg.childControlWidth = true;
hlg.childControlHeight = true;
hlg.childForceExpandWidth = true;
LayoutElement btnContainerLayout = buttonContainer.AddComponent<LayoutElement>();
btnContainerLayout.preferredHeight = 100;
// 增加时间按钮
GameObject increaseBtn = CreateButton("IncreaseButton", "增加时间 ▲", buttonContainer.transform);
increaseBtn.GetComponent<Image>().color = new Color(0.2f, 0.8f, 0.3f);
// 减少时间按钮
GameObject decreaseBtn = CreateButton("DecreaseButton", "减少时间 ▼", buttonContainer.transform);
decreaseBtn.GetComponent<Image>().color = new Color(0.8f, 0.3f, 0.2f);
return container;
}
private GameObject CreateSettingsPage(Transform parent)
{
GameObject page = new GameObject("SettingsPage");
page.transform.SetParent(parent, false);
RectTransform rt = page.AddComponent<RectTransform>();
rt.anchorMin = Vector2.zero;
rt.anchorMax = Vector2.one;
rt.sizeDelta = Vector2.zero;
// 内容容器
GameObject content = new GameObject("Content");
content.transform.SetParent(page.transform, false);
RectTransform contentRt = content.AddComponent<RectTransform>();
contentRt.anchorMin = new Vector2(0, 1);
contentRt.anchorMax = new Vector2(1, 1);
contentRt.pivot = new Vector2(0.5f, 1);
contentRt.sizeDelta = new Vector2(0, 800);
VerticalLayoutGroup vlg = content.AddComponent<VerticalLayoutGroup>();
vlg.childControlWidth = true;
vlg.childControlHeight = false;
vlg.childForceExpandWidth = true;
vlg.spacing = 30;
vlg.padding = new RectOffset(50, 50, 50, 50);
// 标题
GameObject title = CreateTextObject("Title", content.transform);
TextMeshProUGUI titleText = title.GetComponent<TextMeshProUGUI>();
titleText.text = "窗口尺寸设置";
titleText.fontSize = 48;
titleText.alignment = TextAlignmentOptions.Center;
LayoutElement titleLayout = title.AddComponent<LayoutElement>();
titleLayout.preferredHeight = 80;
// 当前分辨率显示
GameObject currentRes = CreateTextObject("CurrentResolutionText", content.transform);
TextMeshProUGUI currentResText = currentRes.GetComponent<TextMeshProUGUI>();
currentResText.text = "当前窗口尺寸: 1080 x 2340";
currentResText.fontSize = 36;
currentResText.alignment = TextAlignmentOptions.Center;
LayoutElement currentResLayout = currentRes.AddComponent<LayoutElement>();
currentResLayout.preferredHeight = 60;
// 宽度输入
GameObject widthField = CreateInputField("WidthInputField", "宽度", content.transform);
widthField.GetComponentInChildren<TMP_InputField>().text = "1080";
// 高度输入
GameObject heightField = CreateInputField("HeightInputField", "高度", content.transform);
heightField.GetComponentInChildren<TMP_InputField>().text = "2340";
// 按钮容器
GameObject buttonContainer = new GameObject("ButtonContainer");
buttonContainer.transform.SetParent(content.transform, false);
RectTransform btnContainerRt = buttonContainer.AddComponent<RectTransform>();
HorizontalLayoutGroup hlg = buttonContainer.AddComponent<HorizontalLayoutGroup>();
hlg.spacing = 30;
hlg.childControlWidth = true;
hlg.childControlHeight = true;
hlg.childForceExpandWidth = true;
LayoutElement btnContainerLayout = buttonContainer.AddComponent<LayoutElement>();
btnContainerLayout.preferredHeight = 100;
// 应用按钮
GameObject applyBtn = CreateButton("ApplyResolutionButton", "应用", buttonContainer.transform);
applyBtn.GetComponent<Image>().color = new Color(0.2f, 0.8f, 0.2f);
// 重置按钮
GameObject resetBtn = CreateButton("ResetResolutionButton", "重置", buttonContainer.transform);
resetBtn.GetComponent<Image>().color = new Color(0.8f, 0.5f, 0.2f);
return page;
}
private GameObject CreateTabButtonPrefab()
{
GameObject btn = new GameObject("TabButtonPrefab");
RectTransform rt = btn.AddComponent<RectTransform>();
rt.sizeDelta = new Vector2(200, 80);
Image img = btn.AddComponent<Image>();
img.color = Color.gray;
Button button = btn.AddComponent<Button>();
button.targetGraphic = img;
GameObject textObj = new GameObject("Text");
textObj.transform.SetParent(btn.transform, false);
RectTransform textRt = textObj.AddComponent<RectTransform>();
textRt.anchorMin = Vector2.zero;
textRt.anchorMax = Vector2.one;
textRt.sizeDelta = Vector2.zero;
TextMeshProUGUI text = textObj.AddComponent<TextMeshProUGUI>();
text.text = "Tab";
text.fontSize = 32;
text.alignment = TextAlignmentOptions.Center;
text.color = Color.white;
return btn;
}
private GameObject CreateCustomButtonPrefab()
{
GameObject btn = new GameObject("CustomButtonPrefab");
RectTransform rt = btn.AddComponent<RectTransform>();
rt.sizeDelta = new Vector2(200, 80);
Image img = btn.AddComponent<Image>();
img.color = new Color(0.3f, 0.3f, 0.8f);
Button button = btn.AddComponent<Button>();
button.targetGraphic = img;
GameObject textObj = new GameObject("Text");
textObj.transform.SetParent(btn.transform, false);
RectTransform textRt = textObj.AddComponent<RectTransform>();
textRt.anchorMin = Vector2.zero;
textRt.anchorMax = Vector2.one;
textRt.sizeDelta = Vector2.zero;
textRt.offsetMin = new Vector2(10, 10);
textRt.offsetMax = new Vector2(-10, -10);
TextMeshProUGUI text = textObj.AddComponent<TextMeshProUGUI>();
text.text = "Button";
text.fontSize = 24;
text.alignment = TextAlignmentOptions.Center;
text.color = Color.white;
text.enableWordWrapping = true;
return btn;
}
private GameObject CreateInputDialog(Transform parent)
{
GameObject dialog = new GameObject("InputDialog");
dialog.transform.SetParent(parent, false);
RectTransform rt = dialog.AddComponent<RectTransform>();
rt.anchorMin = Vector2.zero;
rt.anchorMax = Vector2.one;
rt.sizeDelta = Vector2.zero;
// 背景遮罩
Image bg = dialog.AddComponent<Image>();
bg.color = new Color(0, 0, 0, 0.7f);
// 对话框面板
GameObject panel = new GameObject("Panel");
panel.transform.SetParent(dialog.transform, false);
RectTransform panelRt = panel.AddComponent<RectTransform>();
panelRt.sizeDelta = new Vector2(700, 500);
panelRt.anchorMin = new Vector2(0.5f, 0.5f);
panelRt.anchorMax = new Vector2(0.5f, 0.5f);
panelRt.pivot = new Vector2(0.5f, 0.5f);
Image panelBg = panel.AddComponent<Image>();
panelBg.color = new Color(0.2f, 0.2f, 0.2f);
VerticalLayoutGroup vlg = panel.AddComponent<VerticalLayoutGroup>();
vlg.spacing = 20;
vlg.padding = new RectOffset(30, 30, 30, 30);
vlg.childControlWidth = true;
vlg.childControlHeight = false;
vlg.childForceExpandWidth = true;
// 标题
GameObject title = CreateTextObject("Title", panel.transform);
TextMeshProUGUI titleText = title.GetComponent<TextMeshProUGUI>();
titleText.text = "输入";
titleText.fontSize = 40;
titleText.alignment = TextAlignmentOptions.Center;
LayoutElement titleLayout = title.AddComponent<LayoutElement>();
titleLayout.preferredHeight = 60;
// 输入框
GameObject inputFieldObj = CreateInputField("InputField", "请输入...", panel.transform);
LayoutElement inputLayout = inputFieldObj.AddComponent<LayoutElement>();
inputLayout.preferredHeight = 100;
// 按钮容器
GameObject btnContainer = new GameObject("ButtonContainer");
btnContainer.transform.SetParent(panel.transform, false);
HorizontalLayoutGroup hlg = btnContainer.AddComponent<HorizontalLayoutGroup>();
hlg.spacing = 20;
hlg.childControlWidth = true;
hlg.childControlHeight = true;
hlg.childForceExpandWidth = true;
LayoutElement btnContainerLayout = btnContainer.AddComponent<LayoutElement>();
btnContainerLayout.preferredHeight = 100;
// 确认按钮
GameObject confirmBtn = CreateButton("ConfirmButton", "确认", btnContainer.transform);
confirmBtn.GetComponent<Image>().color = new Color(0.2f, 0.8f, 0.2f);
// 取消按钮
GameObject cancelBtn = CreateButton("CancelButton", "取消", btnContainer.transform);
cancelBtn.GetComponent<Image>().color = new Color(0.8f, 0.3f, 0.3f);
dialog.SetActive(false);
return dialog;
}
private GameObject CreateTextObject(string name, Transform parent)
{
GameObject obj = new GameObject(name);
obj.transform.SetParent(parent, false);
RectTransform rt = obj.AddComponent<RectTransform>();
rt.sizeDelta = new Vector2(800, 200);
TextMeshProUGUI text = obj.AddComponent<TextMeshProUGUI>();
text.fontSize = 28;
text.color = Color.white;
text.enableWordWrapping = true;
return obj;
}
private GameObject CreateButton(string name, string label, Transform parent)
{
GameObject btn = new GameObject(name);
btn.transform.SetParent(parent, false);
RectTransform rt = btn.AddComponent<RectTransform>();
rt.sizeDelta = new Vector2(200, 80);
Image img = btn.AddComponent<Image>();
img.color = new Color(0.3f, 0.3f, 0.8f);
Button button = btn.AddComponent<Button>();
button.targetGraphic = img;
GameObject textObj = new GameObject("Text");
textObj.transform.SetParent(btn.transform, false);
RectTransform textRt = textObj.AddComponent<RectTransform>();
textRt.anchorMin = Vector2.zero;
textRt.anchorMax = Vector2.one;
textRt.sizeDelta = Vector2.zero;
TextMeshProUGUI text = textObj.AddComponent<TextMeshProUGUI>();
text.text = label;
text.fontSize = 32;
text.alignment = TextAlignmentOptions.Center;
text.color = Color.white;
return btn;
}
private GameObject CreateInputField(string name, string placeholder, Transform parent)
{
GameObject inputFieldObj = new GameObject(name);
inputFieldObj.transform.SetParent(parent, false);
RectTransform rt = inputFieldObj.AddComponent<RectTransform>();
rt.sizeDelta = new Vector2(600, 80);
Image bg = inputFieldObj.AddComponent<Image>();
bg.color = new Color(0.15f, 0.15f, 0.15f);
TMP_InputField inputField = inputFieldObj.AddComponent<TMP_InputField>();
// Text Area
GameObject textArea = new GameObject("TextArea");
textArea.transform.SetParent(inputFieldObj.transform, false);
RectTransform textAreaRt = textArea.AddComponent<RectTransform>();
textAreaRt.anchorMin = Vector2.zero;
textAreaRt.anchorMax = Vector2.one;
textAreaRt.sizeDelta = Vector2.zero;
textAreaRt.offsetMin = new Vector2(10, 5);
textAreaRt.offsetMax = new Vector2(-10, -5);
RectMask2D mask = textArea.AddComponent<RectMask2D>();
// Placeholder
GameObject placeholderObj = new GameObject("Placeholder");
placeholderObj.transform.SetParent(textArea.transform, false);
RectTransform placeholderRt = placeholderObj.AddComponent<RectTransform>();
placeholderRt.anchorMin = Vector2.zero;
placeholderRt.anchorMax = Vector2.one;
placeholderRt.sizeDelta = Vector2.zero;
TextMeshProUGUI placeholderText = placeholderObj.AddComponent<TextMeshProUGUI>();
placeholderText.text = placeholder;
placeholderText.fontSize = 28;
placeholderText.color = new Color(0.5f, 0.5f, 0.5f);
placeholderText.fontStyle = FontStyles.Italic;
// Text
GameObject textObj = new GameObject("Text");
textObj.transform.SetParent(textArea.transform, false);
RectTransform textRt = textObj.AddComponent<RectTransform>();
textRt.anchorMin = Vector2.zero;
textRt.anchorMax = Vector2.one;
textRt.sizeDelta = Vector2.zero;
TextMeshProUGUI text = textObj.AddComponent<TextMeshProUGUI>();
text.text = "";
text.fontSize = 28;
text.color = Color.white;
inputField.textViewport = textAreaRt;
inputField.textComponent = text;
inputField.placeholder = placeholderText;
return inputFieldObj;
}
private void SetupReferences(UniversalDebugTool tool, GameObject mainWindow,
GameObject tabContainer, GameObject contentContainer, GameObject parametersPage,
GameObject customButtonsPage, GameObject toolbarPage, GameObject settingsPage,
GameObject tabButtonPrefab, GameObject customButtonPrefab, GameObject inputDialog,
Canvas canvas, GameObject closeButton, GameObject floatingButton)
{
var so = new SerializedObject(tool);
so.FindProperty("mainWindow").objectReferenceValue = mainWindow.GetComponent<RectTransform>();
so.FindProperty("canvas").objectReferenceValue = canvas;
so.FindProperty("tabButtonContainer").objectReferenceValue = tabContainer.GetComponent<RectTransform>();
so.FindProperty("contentContainer").objectReferenceValue = contentContainer.GetComponent<RectTransform>();
so.FindProperty("tabButtonPrefab").objectReferenceValue = tabButtonPrefab;
so.FindProperty("closeButton").objectReferenceValue = closeButton.GetComponent<Button>();
so.FindProperty("floatingButton").objectReferenceValue = floatingButton;
so.FindProperty("draggableComponent").objectReferenceValue = floatingButton.GetComponent<DraggableFloatingButton>();
// 参数页面
so.FindProperty("parametersPage").objectReferenceValue = parametersPage;
var deviceInfoText = parametersPage.transform.Find("ScrollView/Viewport/Content/DeviceInfoText")?.GetComponent<TextMeshProUGUI>();
var systemInfoText = parametersPage.transform.Find("ScrollView/Viewport/Content/SystemInfoText")?.GetComponent<TextMeshProUGUI>();
so.FindProperty("deviceInfoText").objectReferenceValue = deviceInfoText;
so.FindProperty("systemInfoText").objectReferenceValue = systemInfoText;
so.FindProperty("parametersScrollRect").objectReferenceValue = parametersPage.GetComponentInChildren<ScrollRect>();
// 自定义按钮页面
so.FindProperty("customButtonsPage").objectReferenceValue = customButtonsPage;
so.FindProperty("buttonContainer").objectReferenceValue = customButtonsPage.transform.Find("ScrollView/Viewport/ButtonContainer")?.GetComponent<RectTransform>();
so.FindProperty("buttonPrefab").objectReferenceValue = customButtonPrefab;
so.FindProperty("buttonsScrollRect").objectReferenceValue = customButtonsPage.GetComponentInChildren<ScrollRect>();
// 工具栏页面
so.FindProperty("toolbarPage").objectReferenceValue = toolbarPage;
var timeAdjustSlider = toolbarPage.transform.Find("Content/TimeAdjustControl/Slider")?.GetComponent<Slider>();
var timeAdjustValueText = toolbarPage.transform.Find("Content/TimeAdjustControl/ValueText")?.GetComponent<TextMeshProUGUI>();
var timeIncreaseButton = toolbarPage.transform.Find("Content/TimeAdjustControl/ButtonContainer/IncreaseButton")?.GetComponent<Button>();
var timeDecreaseButton = toolbarPage.transform.Find("Content/TimeAdjustControl/ButtonContainer/DecreaseButton")?.GetComponent<Button>();
so.FindProperty("timeAdjustSlider").objectReferenceValue = timeAdjustSlider;
so.FindProperty("timeAdjustValueText").objectReferenceValue = timeAdjustValueText;
so.FindProperty("timeIncreaseButton").objectReferenceValue = timeIncreaseButton;
so.FindProperty("timeDecreaseButton").objectReferenceValue = timeDecreaseButton;
// 设置页面
so.FindProperty("settingsPage").objectReferenceValue = settingsPage;
var widthField = settingsPage.transform.Find("Content/WidthInputField")?.GetComponentInChildren<TMP_InputField>();
var heightField = settingsPage.transform.Find("Content/HeightInputField")?.GetComponentInChildren<TMP_InputField>();
var currentResText = settingsPage.transform.Find("Content/CurrentResolutionText")?.GetComponent<TextMeshProUGUI>();
var applyBtn = settingsPage.transform.Find("Content/ButtonContainer/ApplyResolutionButton")?.GetComponent<Button>();
var resetBtn = settingsPage.transform.Find("Content/ButtonContainer/ResetResolutionButton")?.GetComponent<Button>();
so.FindProperty("widthInputField").objectReferenceValue = widthField;
so.FindProperty("heightInputField").objectReferenceValue = heightField;
so.FindProperty("currentResolutionText").objectReferenceValue = currentResText;
so.FindProperty("applyResolutionButton").objectReferenceValue = applyBtn;
so.FindProperty("resetResolutionButton").objectReferenceValue = resetBtn;
// 输入对话框
so.FindProperty("inputDialog").objectReferenceValue = inputDialog;
so.FindProperty("inputDialogTitle").objectReferenceValue = inputDialog.transform.Find("Panel/Title")?.GetComponent<TextMeshProUGUI>();
so.FindProperty("inputDialogInputField").objectReferenceValue = inputDialog.transform.Find("Panel/InputField")?.GetComponentInChildren<TMP_InputField>();
so.FindProperty("inputDialogConfirmBtn").objectReferenceValue = inputDialog.transform.Find("Panel/ButtonContainer/ConfirmButton")?.GetComponent<Button>();
so.FindProperty("inputDialogCancelBtn").objectReferenceValue = inputDialog.transform.Find("Panel/ButtonContainer/CancelButton")?.GetComponent<Button>();
so.ApplyModifiedProperties();
}
}
}