using System; using System.Collections.Generic; using System.IO; using UnityEngine; using UnityEngine.UI; using UnityEditor; using TMPro; public static class UIPrefabGenerator { public static void GeneratePrefabFromJson(string jsonPath, string prefabPath = null) { if (!File.Exists(jsonPath)) { Debug.LogError("JSON file not found: " + jsonPath); return; } string jsonContent = File.ReadAllText(jsonPath); UILayoutData layoutData = JsonUtility.FromJson(jsonContent); if (layoutData == null) { Debug.LogError("Failed to parse JSON file: " + jsonPath); return; } if (string.IsNullOrEmpty(prefabPath)) { prefabPath = "Assets/Game/GameHFResource/CN/UIWindows/" + layoutData.name + "/" + layoutData.name + ".prefab"; } GameObject root = new GameObject(layoutData.name); root.layer = layoutData.layer; Canvas canvas = root.AddComponent(); canvas.renderMode = RenderMode.ScreenSpaceOverlay; if (layoutData.canvas != null) { canvas.pixelPerfect = layoutData.canvas.pixelPerfect; } root.AddComponent(); root.AddComponent(); RectTransform rootRect = root.GetComponent(); SetRectTransform(rootRect, layoutData.rectTransform); foreach (var childData in layoutData.children) { CreateUIElement(childData, root.transform); } CreatePrefab(root, prefabPath); GameObject.DestroyImmediate(root); AssetDatabase.Refresh(); Debug.Log("UI Prefab generated successfully: " + prefabPath); } private static void CreateUIElement(UIElementData data, Transform parent) { GameObject obj = new GameObject(data.name); obj.transform.SetParent(parent, false); RectTransform rect = obj.AddComponent(); SetRectTransform(rect, data.rectTransform); switch (data.type) { case "Image": case "SFUI_Image": CreateImage(obj, data.image); break; case "Button": case "SFUI_Button": CreateButton(obj, data.button, data.image); break; case "TextMeshProUGUI": case "SFUI_TextMeshProUGUI": CreateTextMeshPro(obj, data.text); break; case "RectTransform": case "SFUI_Viewport": case "SFUI_Content": CreateRectTransform(obj, data.layoutGroup); break; case "ScrollRect": case "SFUI_ScrollRect": CreateScrollRect(obj, data.scrollRect); break; case "GridLayoutGroup": CreateGridLayoutGroup(obj, data.layoutGroup); break; case "VerticalLayoutGroup": CreateVerticalLayoutGroup(obj, data.layoutGroup); break; case "HorizontalLayoutGroup": CreateHorizontalLayoutGroup(obj, data.layoutGroup); break; case "Toggle": case "SFUI_Toggle": CreateToggle(obj, data.toggle); break; case "Slider": case "SFUI_Slider": CreateSlider(obj, data.slider); break; case "InputField": case "SFUI_InputField": CreateInputField(obj, data.inputField); break; case "CanvasScaler": case "GraphicRaycaster": break; case "SFUI_ListViewItem": CreateListViewItemPlaceholder(obj); break; case "Canvas": case "SFUI_Window": break; default: break; } if (data.children != null) { foreach (var childData in data.children) { CreateUIElement(childData, obj.transform); } } } private static void SetRectTransform(RectTransform rect, RectTransformData data) { if (data == null) return; rect.anchorMin = new Vector2(data.anchorMin[0], data.anchorMin[1]); rect.anchorMax = new Vector2(data.anchorMax[0], data.anchorMax[1]); rect.anchoredPosition3D = new Vector3(data.position[0], data.position[1], data.position[2]); rect.sizeDelta = new Vector2(data.sizeDelta[0], data.sizeDelta[1]); rect.pivot = new Vector2(data.pivot[0], data.pivot[1]); if (data.localScale != null && data.localScale.Length >= 3) { rect.localScale = new Vector3(data.localScale[0], data.localScale[1], data.localScale[2]); } if (data.localRotation != null && data.localRotation.Length >= 3) { rect.localEulerAngles = new Vector3(data.localRotation[0], data.localRotation[1], data.localRotation[2]); } } private static void CreateImage(GameObject obj, ImageData data) { if (data == null) return; Image image = obj.AddComponent(); if (!string.IsNullOrEmpty(data.sprite)) { Sprite sprite = AssetDatabase.LoadAssetAtPath(data.sprite); if (sprite != null) { image.sprite = sprite; } } try { image.type = (Image.Type)Enum.Parse(typeof(Image.Type), data.type); } catch { image.type = Image.Type.Simple; } image.color = new Color(data.color[0], data.color[1], data.color[2], data.color[3]); image.raycastTarget = data.raycastTarget; image.preserveAspect = data.preserveAspect; } private static void CreateButton(GameObject obj, ButtonData buttonData, ImageData imageData) { Button button = obj.AddComponent