using System; using TMPro; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; namespace SceneView { [Serializable] public struct RectTransformConfig { public Vector2 AnchorMin; public Vector2 AnchorMax; public Vector2 AnchoredPosition; public Vector2 SizeDelta; public Vector2 OffsetMin; public Vector2 OffsetMax; public Vector2 Pivot; // 默认配置 public static readonly RectTransformConfig Default = new RectTransformConfig( anchorMin: new Vector2(0, 1), anchorMax: new Vector2(0, 1), anchoredPosition: Vector2.zero, sizeDelta: Vector2.zero, offsetMin: Vector2.zero, offsetMax: Vector2.zero, pivot: new Vector2(0.5f, 0.5f) // 默认居中轴心点 ); public RectTransformConfig( Vector2 anchorMin, Vector2 anchorMax, Vector2 anchoredPosition, Vector2 sizeDelta, Vector2 offsetMin, Vector2 offsetMax, Vector2 pivot) { AnchorMin = anchorMin; AnchorMax = anchorMax; AnchoredPosition = anchoredPosition; SizeDelta = sizeDelta; OffsetMin = offsetMin; OffsetMax = offsetMax; Pivot = pivot; } } [Serializable] public struct ButtonConfig { public RectTransformConfig RectConfig; public Color BackgroundColor; public string Text; public int FontSize; public Color TextColor; public bool RaycastTarget; public static readonly ButtonConfig Default = new ButtonConfig( rectConfig: RectTransformConfig.Default, backgroundColor: new Color(0.2f, 0.2f, 0.2f, 1f), text: "Button", fontSize: 18, textColor: Color.white, raycastTarget: true ); public ButtonConfig( RectTransformConfig rectConfig, Color backgroundColor, string text, int fontSize, Color textColor, bool raycastTarget = true) { RectConfig = rectConfig; BackgroundColor = backgroundColor; Text = text; FontSize = fontSize; TextColor = textColor; RaycastTarget = raycastTarget; } } [Serializable] public struct TextConfig { public RectTransformConfig RectConfig; public string Text; public int FontSize; public Color TextColor; public TextAlignmentOptions Alignment; public bool RaycastTarget; public static readonly TextConfig Default = new TextConfig( rectConfig: RectTransformConfig.Default, text: "New Text", fontSize: 18, textColor: Color.white, alignment: TextAlignmentOptions.Center, raycastTarget: false ); public TextConfig( string text, int fontSize, Color textColor, TextAlignmentOptions alignment, bool raycastTarget, RectTransformConfig rectConfig) { RectConfig = rectConfig; Text = text; FontSize = fontSize; TextColor = textColor; Alignment = alignment; RaycastTarget = raycastTarget; } } [Serializable] public struct ScrollViewConfig { public Vector2 SizeDelta; // ScrollView 的尺寸 public bool Vertical; public bool Horizontal; public Color BackgroundColor; public Vector2 ContentPadding; // 内容区域的内边距(上下左右) public static readonly ScrollViewConfig Default = new ScrollViewConfig { SizeDelta = new Vector2(400, 300), Vertical = true, Horizontal = false, BackgroundColor = new Color(0.1f, 0.1f, 0.1f, 0.8f), ContentPadding = new Vector2(10, 10) // (horizontal, vertical) }; } [Serializable] public struct InputFieldConfig { public RectTransformConfig RectConfig; public Color BackgroundColor; public string PlaceholderText; public int PlaceholderFontSize; public Color PlaceholderTextColor; public Color TextColor; public int FontSize; public TextAlignmentOptions TextAlignment; public TMP_InputField.CharacterValidation CharacterValidation; public int CharacterLimit; public static readonly InputFieldConfig Default = new InputFieldConfig( rectConfig: RectTransformConfig.Default, backgroundColor: new Color(0.2f, 0.2f, 0.2f, 1f), placeholderText: "Enter text here", placeholderFontSize: 14, placeholderTextColor: new Color(0.7f, 0.7f, 0.7f, 1f), textColor: Color.white, fontSize: 18, textAlignment: TextAlignmentOptions.Left, characterValidation: TMP_InputField.CharacterValidation.None, characterLimit: 0 ); public InputFieldConfig( RectTransformConfig rectConfig, Color backgroundColor, string placeholderText, int placeholderFontSize, Color placeholderTextColor, Color textColor, int fontSize, TextAlignmentOptions textAlignment, TMP_InputField.CharacterValidation characterValidation = TMP_InputField.CharacterValidation.None, int characterLimit = 0) { RectConfig = rectConfig; BackgroundColor = backgroundColor; PlaceholderText = placeholderText; PlaceholderFontSize = placeholderFontSize; PlaceholderTextColor = placeholderTextColor; TextColor = textColor; FontSize = fontSize; TextAlignment = textAlignment; CharacterValidation = characterValidation; CharacterLimit = characterLimit; } } public static class ControlUtilities { // 通用方法:将 RectTransformConfig 应用于 RectTransform private static void ApplyRectTransformConfig(RectTransform rectTransform, RectTransformConfig config) { rectTransform.anchorMin = config.AnchorMin; rectTransform.anchorMax = config.AnchorMax; rectTransform.pivot = config.Pivot; var isStretched = config.SizeDelta == Vector2.zero; if (isStretched) { rectTransform.offsetMin = config.OffsetMin; rectTransform.offsetMax = config.OffsetMax; } else { rectTransform.anchoredPosition = config.AnchoredPosition; rectTransform.sizeDelta = config.SizeDelta; } } // ======================== // 按钮创建 // ======================== public static (Button? button, TextMeshProUGUI? text) CreateButton(RectTransform? parent, ButtonConfig config, UnityAction? onClick) { var btnObj = new GameObject(config.Text + "Button"); var btnRect = btnObj.AddComponent(); btnRect.SetParent(parent, false); ApplyRectTransformConfig(btnRect, config.RectConfig); var button = btnObj.AddComponent