#if UNITY_EDITOR using System; using System.Collections.Generic; using System.Linq; using UnityEditor; using UnityEngine; using SLSFramework.UModAssistance; using Continentis.MainGame.Character; using Continentis.Mods; namespace Continentis.MainGame.Card { [CustomEditor(typeof(CardData))] public partial class CardDataEditor : DataEditor { // 存储我们需要自定义绘制的属性的引用 private SerializedProperty modNameProp; private SerializedProperty categoryNameProp; private SerializedProperty classNameProp; private SerializedProperty displayNameProp; private SerializedProperty cardRarityProp; private SerializedProperty cardTypeProp; private SerializedProperty keywordsProp; private SerializedProperty cardSpriteProp; private SerializedProperty cardLayoutTagsProp; private SerializedProperty functionTextProp; private SerializedProperty cardDescriptionProp; private SerializedProperty intentionIconKeysProp; private SerializedProperty intentionValueNamesProp; private SerializedProperty intentionTextOverrideProp; private SerializedProperty baseWeightProp; private SerializedProperty variableAttributesProp; private SerializedProperty originalAttributesProp; private SerializedProperty runtimeCurrentAttributesProp; private SerializedProperty upgradeNodeProp; private SerializedProperty prefabsProp; private SerializedProperty derivativeCardsProp; private SerializedProperty derivativeCharactersProp; protected override void OnEnable() { base.OnEnable(); // 在启用时,根据我们修改后的字段名找到对应的SerializedProperty modNameProp = serializedObject.FindProperty("modName"); classNameProp = serializedObject.FindProperty("className"); categoryNameProp = serializedObject.FindProperty("categoryName"); displayNameProp = serializedObject.FindProperty("displayName"); cardRarityProp = serializedObject.FindProperty("cardRarity"); cardTypeProp = serializedObject.FindProperty("cardType"); keywordsProp = serializedObject.FindProperty("keywords"); cardSpriteProp = serializedObject.FindProperty("cardSprite"); cardLayoutTagsProp = serializedObject.FindProperty("cardLayoutTags"); functionTextProp = serializedObject.FindProperty("functionText"); cardDescriptionProp = serializedObject.FindProperty("cardDescription"); intentionIconKeysProp = serializedObject.FindProperty("intentionIconKeys"); intentionValueNamesProp = serializedObject.FindProperty("intentionValueNames"); intentionTextOverrideProp = serializedObject.FindProperty("intentionTextOverride"); baseWeightProp = serializedObject.FindProperty("baseWeight"); variableAttributesProp = serializedObject.FindProperty("variableAttributes"); originalAttributesProp = serializedObject.FindProperty("originalAttributes"); runtimeCurrentAttributesProp = serializedObject.FindProperty("runtimeCurrentAttributes"); upgradeNodeProp = serializedObject.FindProperty("upgradeNode"); prefabsProp = serializedObject.FindProperty("prefabRefs"); derivativeCardsProp = serializedObject.FindProperty("derivativeCardDataRefs"); derivativeCharactersProp = serializedObject.FindProperty("derivativeCharacterDataRefs"); } public override void OnInspectorGUI() { serializedObject.Update(); // --- 绘制自定义的Type选择器 --- // 我们把它从所有自动绘制的属性中分离出来,放在最前面或最后面,让布局更清晰 EditorGUILayout.Space(); // 增加一点间距 EditorGUILayout.LabelField("Fundamental", EditorStyles.boldLabel); DrawSearchableTypeSelector( classNameProp, // 1. 存储类名的字符串属性 "Card Logic Class", // 2. 显示的标签 typeof(CardLogicBase), // 3. 要搜索的基类 (outType) => // 4. 【关键】当用户选择后执行的回调 { string className = outType.Name; string modName = outType.Namespace!.Replace("Continentis.Mods.", "").Split('.')[0]; string categoryName = outType.Namespace!.Replace("Continentis.Mods." + modName + ".Cards", ""); if (!string.IsNullOrEmpty(categoryName)) { categoryName = outType.Namespace!.Replace("Continentis.Mods." + modName + ".Cards", "").Substring(1); // 去掉开头的点 } string displayName = "Card_" + modName + "_" + className + "_DisplayName"; string functionTextName = "Card_" + modName + "_" + className + "_FunctionText"; classNameProp.stringValue = className; modNameProp.stringValue = modName; categoryNameProp.stringValue = categoryName; displayNameProp.stringValue = displayName; functionTextProp.stringValue = functionTextName; Debug.Log(outType.FullName); Debug.Log($"modName: {modName}, categoryName: {categoryName}, className: {className}, displayName: {displayName}, functionText: {functionTextName}"); serializedObject.ApplyModifiedProperties(); }, "Continentis.Mods", // 5. 你的 namespacePrefix "Cards" // 6. 你的 namespaceToRemove (注意:根据你的代码,这里不应包含".") ); EditorGUI.BeginDisabledGroup(true); EditorGUILayout.PropertyField(modNameProp); EditorGUILayout.PropertyField(categoryNameProp); EditorGUILayout.PropertyField(classNameProp); EditorGUILayout.PropertyField(displayNameProp); EditorGUI.EndDisabledGroup(); EditorGUILayout.PropertyField(cardRarityProp); EditorGUILayout.PropertyField(cardTypeProp); DrawListWithEditRefSelector(keywordsProp, "CardKeywords"); EditorGUILayout.PropertyField(cardSpriteProp); EditorGUILayout.PropertyField(cardLayoutTagsProp, true); EditorGUILayout.PropertyField(functionTextProp); EditorGUILayout.PropertyField(cardDescriptionProp); EditorGUILayout.Space(); EditorGUILayout.LabelField("Attributes", EditorStyles.boldLabel); DrawListWithEditRefSelector(intentionIconKeysProp, "IntentionIconKeys"); DrawListWithLocalSelector(intentionValueNamesProp, "variableAttributes"); EditorGUILayout.PropertyField(intentionTextOverrideProp); EditorGUILayout.PropertyField(baseWeightProp); EditorGUILayout.PropertyField(variableAttributesProp, true); EditorGUILayout.PropertyField(originalAttributesProp, true); EditorGUILayout.PropertyField(runtimeCurrentAttributesProp, true); EditorGUILayout.Space(); EditorGUILayout.LabelField("Upgrade", EditorStyles.boldLabel); EditorGUILayout.PropertyField(upgradeNodeProp); // --- 绘制自定义的引用列表 --- EditorGUILayout.Space(); EditorGUILayout.LabelField("References", EditorStyles.boldLabel); DrawCharacterListGUI(prefabsProp); DrawCharacterListGUI(derivativeCardsProp); DrawCharacterListGUI(derivativeCharactersProp); HandleObjectPicker(); serializedObject.ApplyModifiedProperties(); } } } #endif