345 lines
13 KiB
C#
345 lines
13 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Text;
|
|
using Runtime.Helper;
|
|
using TMPro;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
|
|
namespace HK.Editor
|
|
{
|
|
public class GenUIDataEditor : UnityEditor.Editor
|
|
{
|
|
private static string itemFolderPath = $"{Application.dataPath}/Scripts/Runtime/UI/Item";
|
|
private static string logicFolderPath = $"{Application.dataPath}/Scripts/Runtime/UI/Logic";
|
|
private static string templatePath = $"{Application.dataPath}/Resources/Template/UILogicTemplate.txt";
|
|
|
|
[MenuItem("GameObject/ZTool/UITool/自动绑定数据")]
|
|
public static void AutoBindData()
|
|
{
|
|
foreach (var go in Selection.gameObjects)
|
|
{
|
|
List<Transform> list = new List<Transform>();
|
|
FindUI(go.transform, ref list);
|
|
|
|
var binding = go.GetOrAddComponent<GameObjectBinding>();
|
|
foreach (var transform in list)
|
|
{
|
|
binding.AddValue(transform);
|
|
}
|
|
|
|
EditorUtility.SetDirty(go);
|
|
Debug.Log("自动绑定数据 完成");
|
|
}
|
|
}
|
|
|
|
[MenuItem("GameObject/ZTool/UITool/清空并自动绑定数据")]
|
|
public static void ClearAndAutoBindData()
|
|
{
|
|
foreach (var go in Selection.gameObjects)
|
|
{
|
|
List<Transform> list = new List<Transform>();
|
|
FindUI(go.transform, ref list);
|
|
|
|
var binding = go.GetOrAddComponent<GameObjectBinding>();
|
|
binding.ClearValue();
|
|
foreach (var transform in list)
|
|
{
|
|
binding.AddValue(transform);
|
|
}
|
|
|
|
EditorUtility.SetDirty(go);
|
|
Debug.Log("清空并自动绑定数据 完成");
|
|
}
|
|
}
|
|
|
|
static void FindUI(Transform go, ref List<Transform> list)
|
|
{
|
|
if (go.name.Contains("txt_") || go.name.Contains("txt") ||
|
|
go.name.Contains("btn_") || go.name.Contains("btn") ||
|
|
go.name.Contains("tog_") || go.name.Contains("tog") ||
|
|
go.name.Contains("img_") || go.name.Contains("img") ||
|
|
go.name.Contains("inp_") || go.name.Contains("inp") ||
|
|
go.name.Contains("panel_") || go.name.Contains("panel") ||
|
|
go.name.Contains("dro_") || go.name.Contains("dro") ||
|
|
go.name.Contains("go_") || go.name.Contains("go") ||
|
|
go.name.Contains("scr_") || go.name.Contains("scr") ||
|
|
go.name.Contains("raw_") || go.name.Contains("raw") ||
|
|
go.name.Contains("sli_") || go.name.Contains("sli"))
|
|
{
|
|
list.Add(go);
|
|
}
|
|
|
|
for (var i = 0; i < go.childCount; i++)
|
|
{
|
|
FindUI(go.GetChild(i), ref list);
|
|
}
|
|
}
|
|
|
|
[MenuItem("GameObject/ZTool/UITool/自动生成Item并绑定数据")]
|
|
public static void FindClassAndGenBindItemData()
|
|
{
|
|
// var go = Selection.activeObject as GameObject;
|
|
foreach (var go in Selection.gameObjects)
|
|
{
|
|
var binding = go.GetOrAddComponent<GameObjectBinding>();
|
|
var substring = go.name.Replace("UI", "");
|
|
Debug.Log(substring);
|
|
if (!substring.Contains("Item"))
|
|
{
|
|
substring = $"{substring}Item";
|
|
}
|
|
|
|
string filePath = $"{itemFolderPath}/{substring}.cs";
|
|
string allText;
|
|
if (!Directory.Exists(itemFolderPath))
|
|
{
|
|
Directory.CreateDirectory(itemFolderPath);
|
|
}
|
|
|
|
allText = File.ReadAllText(templatePath);
|
|
if (!File.Exists(filePath))
|
|
{
|
|
File.Create(filePath).Dispose();
|
|
}
|
|
else
|
|
{
|
|
if (!EditorUtility.DisplayDialog("提示", $"是否确认删除‘{substring}’脚本的内容?", "ok", "cancel"))
|
|
{
|
|
Debug.Log("取消生成");
|
|
return;
|
|
}
|
|
}
|
|
|
|
allText = allText.Replace("#CLASSNAME#", substring);
|
|
|
|
allText = allText.Replace("#VARIABLEDEFINITION#", ReplaceVD(binding.Datas));
|
|
allText = allText.Replace("#INITFIND#", ReplaceInitBind(binding.Datas));
|
|
allText = allText.Replace("#INITADDLISTENER#", ReplaceInitAddListener(binding.Datas));
|
|
allText = allText.Replace("#METHOD#", ReplaceAddMethod(binding.Datas));
|
|
allText = allText.Replace("#DISPOSE#", ReplaceDisposeRemoveListener(binding.Datas));
|
|
allText = allText.Replace("#DISPOSEISNULL#", ReplaceDisposeIsNull(binding.Datas));
|
|
allText = allText.Replace("#BASE#", "UIItemBase");
|
|
|
|
File.WriteAllText(filePath, allText);
|
|
Debug.Log("自动生成绑定数据 完成");
|
|
}
|
|
}
|
|
|
|
[MenuItem("GameObject/ZTool/UITool/自动生成UI并绑定数据")]
|
|
public static void FindClassAndGenBindData()
|
|
{
|
|
// var go = Selection.activeObject as GameObject;
|
|
foreach (var go in Selection.gameObjects)
|
|
{
|
|
var binding = go.GetOrAddComponent<GameObjectBinding>();
|
|
var substring = go.name.Replace("UI", "");
|
|
Debug.Log(substring);
|
|
substring = $"{substring}UI";
|
|
|
|
string filePath = $"{logicFolderPath}/{substring}.cs";
|
|
string allText;
|
|
if (!Directory.Exists(logicFolderPath))
|
|
{
|
|
Directory.CreateDirectory(logicFolderPath);
|
|
}
|
|
|
|
allText = File.ReadAllText(templatePath);
|
|
if (!File.Exists(filePath))
|
|
{
|
|
File.Create(filePath).Dispose();
|
|
}
|
|
else
|
|
{
|
|
if (!EditorUtility.DisplayDialog("提示", $"是否确认删除‘{substring}’脚本的内容?", "ok", "cancel"))
|
|
{
|
|
Debug.Log("取消生成");
|
|
return;
|
|
}
|
|
}
|
|
|
|
allText = allText.Replace("#CLASSNAME#", substring);
|
|
|
|
allText = allText.Replace("#VARIABLEDEFINITION#", ReplaceVD(binding.Datas));
|
|
allText = allText.Replace("#INITFIND#", ReplaceInitBind(binding.Datas));
|
|
allText = allText.Replace("#INITADDLISTENER#", ReplaceInitAddListener(binding.Datas));
|
|
allText = allText.Replace("#METHOD#", ReplaceAddMethod(binding.Datas));
|
|
allText = allText.Replace("#DISPOSE#", ReplaceDisposeRemoveListener(binding.Datas));
|
|
allText = allText.Replace("#DISPOSEISNULL#", ReplaceDisposeIsNull(binding.Datas));
|
|
allText = allText.Replace("#BASE#", "UIBase");
|
|
|
|
File.WriteAllText(filePath, allText);
|
|
Debug.Log("自动生成绑定数据 完成");
|
|
}
|
|
}
|
|
|
|
static string ReplaceVD(IReadOnlyList<GameObjectBindingData> AllData) // 定义
|
|
{
|
|
StringBuilder sb = new StringBuilder();
|
|
foreach (var data in AllData)
|
|
{
|
|
var typeStr = CheckType(data);
|
|
sb.AppendLine($"[SerializeField] private {typeStr} {data.name};");
|
|
}
|
|
|
|
return sb.ToString();
|
|
}
|
|
|
|
static string ReplaceInitBind(IReadOnlyList<GameObjectBindingData> AllData) // 定义
|
|
{
|
|
StringBuilder sb = new StringBuilder();
|
|
foreach (var data in AllData)
|
|
{
|
|
var typeStr = CheckType(data);
|
|
sb.AppendLine($"{data.name} = GetValue<{typeStr}>(\"{data.name}\");");
|
|
}
|
|
|
|
return sb.ToString();
|
|
}
|
|
|
|
static string ReplaceInitAddListener(IReadOnlyList<GameObjectBindingData> AllData) // 定义
|
|
{
|
|
StringBuilder sb = new StringBuilder();
|
|
foreach (var data in AllData)
|
|
{
|
|
var typeStr = CheckType(data);
|
|
if (typeStr == nameof(Button))
|
|
{
|
|
sb.AppendLine($"{data.name}.onClick.AddListener(OnClick{data.name});");
|
|
}
|
|
else if (typeStr == nameof(Slider) || typeStr == nameof(Toggle) ||
|
|
typeStr == nameof(TMP_Dropdown) || typeStr == nameof(Dropdown) ||
|
|
typeStr == nameof(ScrollRect))
|
|
{
|
|
sb.AppendLine($"{data.name}.onValueChanged.AddListener(OnValueChanged{data.name});");
|
|
}
|
|
}
|
|
|
|
return sb.ToString();
|
|
}
|
|
|
|
static string ReplaceAddMethod(IReadOnlyList<GameObjectBindingData> AllData) // 定义
|
|
{
|
|
StringBuilder sb = new StringBuilder();
|
|
foreach (var data in AllData)
|
|
{
|
|
var typeStr = CheckType(data);
|
|
if (typeStr == nameof(Button))
|
|
{
|
|
sb.AppendLine($"private void OnClick{data.name}() {{}}");
|
|
}
|
|
else if (typeStr == nameof(Slider))
|
|
{
|
|
sb.AppendLine($"private void OnValueChanged{data.name}(float f) {{}}");
|
|
}
|
|
else if (typeStr == nameof(Toggle))
|
|
{
|
|
sb.AppendLine($"private void OnValueChanged{data.name}(bool b) {{}}");
|
|
}
|
|
else if (typeStr == nameof(TMP_Dropdown) || typeStr == nameof(Dropdown))
|
|
{
|
|
sb.AppendLine($"private void OnValueChanged{data.name}(int i) {{}}");
|
|
}
|
|
else if (typeStr == nameof(ScrollRect))
|
|
{
|
|
sb.AppendLine($"private void OnValueChanged{data.name}(Vector2 v) {{}}");
|
|
}
|
|
}
|
|
|
|
return sb.ToString();
|
|
}
|
|
|
|
static string ReplaceDisposeRemoveListener(IReadOnlyList<GameObjectBindingData> AllData) // 定义
|
|
{
|
|
StringBuilder sb = new StringBuilder();
|
|
foreach (var data in AllData)
|
|
{
|
|
var typeStr = CheckType(data);
|
|
if (typeStr == nameof(Button))
|
|
{
|
|
sb.AppendLine($"{data.name}.onClick.RemoveListener(OnClick{data.name});");
|
|
}
|
|
else if (typeStr == nameof(Slider) || typeStr == nameof(Toggle) ||
|
|
typeStr == nameof(TMP_Dropdown) || typeStr == nameof(Dropdown) ||
|
|
typeStr == nameof(ScrollRect))
|
|
{
|
|
sb.AppendLine($"{data.name}.onValueChanged.RemoveListener(OnValueChanged{data.name});");
|
|
}
|
|
}
|
|
|
|
return sb.ToString();
|
|
}
|
|
|
|
static string ReplaceDisposeIsNull(IReadOnlyList<GameObjectBindingData> AllData) // 定义
|
|
{
|
|
StringBuilder sb = new StringBuilder();
|
|
foreach (var data in AllData)
|
|
{
|
|
var typeStr = CheckType(data);
|
|
sb.AppendLine($"{data.name} = null;");
|
|
}
|
|
|
|
return sb.ToString();
|
|
}
|
|
|
|
static string CheckType(GameObjectBindingData data)
|
|
{
|
|
if (data.go.TryGetComponent(out Button button))
|
|
{
|
|
return nameof(Button);
|
|
}
|
|
else if (data.go.TryGetComponent(out TMP_InputField inputField_TMP))
|
|
{
|
|
return nameof(TMP_InputField);
|
|
}
|
|
else if (data.go.TryGetComponent(out InputField inputField))
|
|
{
|
|
return nameof(InputField);
|
|
}
|
|
else if (data.go.TryGetComponent(out Slider slider))
|
|
{
|
|
return nameof(Slider);
|
|
}
|
|
else if (data.go.TryGetComponent(out Toggle toggle))
|
|
{
|
|
return nameof(Toggle);
|
|
}
|
|
else if (data.go.TryGetComponent(out TMP_Text tmpText))
|
|
{
|
|
return nameof(TMP_Text);
|
|
}
|
|
else if (data.go.TryGetComponent(out Text text))
|
|
{
|
|
return nameof(Text);
|
|
}
|
|
else if (data.go.TryGetComponent(out TMP_Dropdown tmpDropdown))
|
|
{
|
|
return nameof(TMP_Dropdown);
|
|
}
|
|
else if (data.go.TryGetComponent(out Dropdown dropdown))
|
|
{
|
|
return nameof(Dropdown);
|
|
}
|
|
else if (data.go.TryGetComponent(out ScrollRect scrollRect))
|
|
{
|
|
return nameof(ScrollRect);
|
|
}
|
|
else if (data.go.TryGetComponent(out Image image))
|
|
{
|
|
return nameof(Image);
|
|
}
|
|
else if (data.go.TryGetComponent(out RawImage rawImage))
|
|
{
|
|
return nameof(RawImage);
|
|
}
|
|
else if (data.go.TryGetComponent(out GameObject go))
|
|
{
|
|
return nameof(GameObject);
|
|
}
|
|
|
|
return String.Empty;
|
|
}
|
|
}
|
|
} |