using System.IO;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
using MuHua;
namespace MuHuaEditor {
///
/// 装备 - 编辑窗口
///
public class EquipmentWindow : ModuleUIEditorWindow {
public VisualTreeAsset ButtonTemplate = default;
private EquipmentType currentEquipmentType;
private UIEquipmentEnum equipmentType;
private UIEquipmentEnum weaponType;
private UIEquipmentEnum armorType;
private UIEquipmentEnum accessoryType;
private UIEquipmentList equipmentList;
public VisualElement VEEquipmentType => Q("EquipmentType");
public VisualElement VEEquipmentExtendType => Q("EquipmentExtendType");
public VisualElement EquipmentList => Q("EquipmentList");
[MenuItem("Window/UI Toolkit/EquipmentWindow")]
public static void ShowWindow() {
EquipmentWindow wnd = GetWindow();
wnd.titleContent = new GUIContent("EquipmentWindow");
}
public override void Initial() {
equipmentType = new UIEquipmentEnum(VEEquipmentType, ButtonTemplate, SettingsEquipmentType);
weaponType = new UIEquipmentEnum(VEEquipmentExtendType, ButtonTemplate, (value) => SettingsEquipmentType(value.ToString()));
armorType = new UIEquipmentEnum(VEEquipmentExtendType, ButtonTemplate, (value) => SettingsEquipmentType(value.ToString()));
accessoryType = new UIEquipmentEnum(VEEquipmentExtendType, ButtonTemplate, (value) => SettingsEquipmentType(value.ToString()));
equipmentList = new UIEquipmentList(EquipmentList, rootVisualElement, ButtonTemplate, (value) => Debug.Log(value));
AddControl(equipmentList);
equipmentType.Initial();
}
public override void OnDestroy() {
base.OnDestroy();
equipmentType.Release();
weaponType.Release();
armorType.Release();
accessoryType.Release();
}
/// 设置装备类型
private void SettingsEquipmentType(EquipmentType type) {
currentEquipmentType = type;
if (type == EquipmentType.武器) { weaponType.Initial(); }
if (type == EquipmentType.护甲) { armorType.Initial(); }
if (type == EquipmentType.饰品) { accessoryType.Initial(); }
}
/// 设置装备类型
private void SettingsEquipmentType(string type) {
string path = $"Assets/AssetsEquipment/ScriptableObject/{currentEquipmentType}/{type}";
EnsureDirectoryExists(path);
List equipments = FindConstAssets(path);
equipmentList.Initial(equipments);
}
#region 编辑器工具
/// 查找指定文件夹下的所有 T 类型的 ScriptableObject 资源
public static List FindConstAssets(string folderPath) where T : ScriptableObject {
List result = new List();
string filter = $"t:{typeof(T).Name}";
string[] guids = AssetDatabase.FindAssets(filter, new[] { folderPath });
foreach (string guid in guids) {
string assetPath = AssetDatabase.GUIDToAssetPath(guid);
T asset = AssetDatabase.LoadAssetAtPath(assetPath);
if (asset != null) { result.Add(asset); }
}
return result;
}
/// 确保目录存在
public static void EnsureDirectoryExists(string path) {
if (!Directory.Exists(path)) { Directory.CreateDirectory(path); }
}
#endregion
private void CreateConstWeapon() {
// 创建一个新的 ConstWeapon 资源
var asset = ScriptableObject.CreateInstance();
string path = EditorUtility.SaveFilePanelInProject(
"保存 ConstWeapon",
"NewConstWeapon.asset",
"asset",
"请选择保存 ConstWeapon 的路径"
);
if (!string.IsNullOrEmpty(path)) {
AssetDatabase.CreateAsset(asset, path);
AssetDatabase.SaveAssets();
EditorUtility.FocusProjectWindow();
Selection.activeObject = asset;
}
}
}
}