976 lines
41 KiB
C#
976 lines
41 KiB
C#
using UnityEngine;
|
||
using UnityEditor;
|
||
using UnityEngine.UI;
|
||
using TMPro;
|
||
|
||
/// <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();
|
||
}
|
||
}
|