Tz2/Assets/Editor/QuestionConfigEditor.cs

250 lines
9.4 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 System.Collections.Generic;
using System.IO;
using Newtonsoft.Json;
public class QuestionConfigEditor : EditorWindow
{
private QuestionConfigData configData;
private Vector2 scrollPosition;
private const string CONFIG_PATH = "Assets/Resources/QuestionConfigData.json";
private List<bool> foldouts = new List<bool>();
[MenuItem("Tools/题目配置编辑器")]
public static void ShowWindow()
{
GetWindow<QuestionConfigEditor>("题目配置编辑器");
}
private void OnEnable()
{
LoadConfigData();
SyncFoldouts();
}
private void LoadConfigData()
{
if (!Directory.Exists("Assets/Resources"))
{
Directory.CreateDirectory("Assets/Resources");
}
if (File.Exists(CONFIG_PATH))
{
string jsonContent = File.ReadAllText(CONFIG_PATH);
configData = JsonConvert.DeserializeObject<QuestionConfigData>(jsonContent);
}
if (configData == null)
{
configData = new QuestionConfigData();
SaveConfigData();
}
}
private void SaveConfigData()
{
string jsonContent = JsonConvert.SerializeObject(configData, Formatting.Indented);
File.WriteAllText(CONFIG_PATH, jsonContent);
AssetDatabase.Refresh();
}
private void SyncFoldouts()
{
while (foldouts.Count < configData.configs.Count)
foldouts.Add(false);
while (foldouts.Count > configData.configs.Count)
foldouts.RemoveAt(foldouts.Count - 1);
}
// 获取对象的Hierarchy路径
public static string GetHierarchyPath(Transform trans)
{
string path = trans.name;
while (trans.parent != null)
{
trans = trans.parent;
path = trans.name + "/" + path;
}
return path;
}
// 通过路径查找对象
public static GameObject FindByHierarchyPath(string path)
{
return GameObject.Find(path);
}
private void OnGUI()
{
if (configData == null)
{
EditorGUILayout.HelpBox("未找到配置文件,请先创建配置文件。", MessageType.Error);
if (GUILayout.Button("创建配置文件"))
{
LoadConfigData();
}
return;
}
EditorGUILayout.BeginVertical();
scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);
SyncFoldouts();
for (int i = 0; i < configData.configs.Count; i++)
{
var config = configData.configs[i];
if (foldouts.Count <= i) foldouts.Add(false);
// 根据配置类型显示不同的标题和颜色
string configTypeText = config.configType == ConfigType. ? "大类" : "题目";
string displayName = $"{configTypeText}{config.questionName}";
// 使用不同的样式区分大类和小类
var foldoutStyle = config.configType == ConfigType. ?
EditorStyles.foldoutHeader : EditorStyles.foldout;
foldouts[i] = EditorGUILayout.Foldout(foldouts[i], displayName, true, foldoutStyle);
if (foldouts[i])
{
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
// 配置类型选择
EditorGUILayout.BeginHorizontal();
config.configType = (ConfigType)EditorGUILayout.EnumPopup("配置类型", config.configType);
if (GUILayout.Button("删除", GUILayout.Width(80)))
{
configData.configs.RemoveAt(i);
foldouts.RemoveAt(i);
i--;
EditorGUILayout.EndHorizontal();
EditorGUILayout.EndVertical();
continue;
}
EditorGUILayout.EndHorizontal();
// 名称输入
string nameLabel = config.configType == ConfigType. ? "大类名称" : "题目名称";
config.questionName = EditorGUILayout.TextField(nameLabel, config.questionName);
// 按钮-界面对象成对列表
EditorGUILayout.LabelField("按钮-界面对象列表", EditorStyles.boldLabel);
for (int j = 0; j < config.pairs.Count; j++)
{
var pair = config.pairs[j];
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField($"按钮-界面对象 {j + 1}", EditorStyles.boldLabel);
if (GUILayout.Button("删除", GUILayout.Width(60)))
{
config.pairs.RemoveAt(j);
j--;
EditorGUILayout.EndHorizontal();
EditorGUILayout.EndVertical();
continue;
}
EditorGUILayout.EndHorizontal();
// 按钮对象
GameObject menuObj = string.IsNullOrEmpty(pair.menuButtonPath) ? null : FindByHierarchyPath(pair.menuButtonPath);
GameObject newMenuObj = (GameObject)EditorGUILayout.ObjectField("按钮对象", menuObj, typeof(GameObject), true);
if (newMenuObj != menuObj && newMenuObj != null)
{
pair.menuButtonPath = GetHierarchyPath(newMenuObj.transform);
}
// 界面对象
GameObject panelObj = string.IsNullOrEmpty(pair.panelObjectPath) ? null : FindByHierarchyPath(pair.panelObjectPath);
GameObject newPanelObj = (GameObject)EditorGUILayout.ObjectField("界面对象", panelObj, typeof(GameObject), true);
if (newPanelObj != panelObj && newPanelObj != null)
{
pair.panelObjectPath = GetHierarchyPath(newPanelObj.transform);
}
pair.shouldActivate = EditorGUILayout.Toggle("激活界面", pair.shouldActivate);
// 多选脚本
if (newPanelObj != null)
{
var scripts = newPanelObj.GetComponents<MonoBehaviour>();
EditorGUILayout.LabelField("要启动的脚本(可多选)", EditorStyles.boldLabel);
// 从配置中获取已选择的脚本列表
List<string> selectedScripts = new List<string>();
if (!string.IsNullOrEmpty(pair.scriptTypeName))
{
selectedScripts.AddRange(pair.scriptTypeName.Split(','));
}
foreach (var script in scripts)
{
var type = script.GetType();
if (type.Namespace != null && type.Namespace.StartsWith("UnityEngine"))
continue;
if (type.Module.ScopeName == "UnityEngine.dll")
continue;
bool selected = selectedScripts.Contains(type.Name);
bool newSelected = EditorGUILayout.ToggleLeft(type.Name, selected);
if (newSelected && !selected)
{
selectedScripts.Add(type.Name);
}
else if (!newSelected && selected)
{
selectedScripts.Remove(type.Name);
}
}
// 保存多选到配置
pair.scriptTypeName = string.Join(",", selectedScripts);
}
else
{
EditorGUILayout.HelpBox("请先选择界面对象", MessageType.Info);
}
EditorGUILayout.EndVertical();
}
if (GUILayout.Button("添加按钮-界面对象"))
{
config.pairs.Add(new ButtonPanelPair());
}
EditorGUILayout.EndVertical();
EditorGUILayout.Space();
}
}
EditorGUILayout.EndScrollView();
// 添加按钮区域
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("添加新题目"))
{
var newConfig = new QuestionConfig();
newConfig.configType = ConfigType.;
newConfig.questionName = "新题目";
configData.configs.Add(newConfig);
foldouts.Add(true);
}
if (GUILayout.Button("添加新大类"))
{
var newConfig = new QuestionConfig();
newConfig.configType = ConfigType.;
newConfig.questionName = "新大类";
configData.configs.Add(newConfig);
foldouts.Add(true);
}
EditorGUILayout.EndHorizontal();
if (GUILayout.Button("保存配置"))
{
SaveConfigData();
Debug.Log("配置已保存!");
}
EditorGUILayout.EndVertical();
}
}