From 1693d73aa5e6aff93ed1b555bacd1b07aed1ff72 Mon Sep 17 00:00:00 2001 From: m0_75251201 Date: Tue, 15 Jul 2025 11:58:22 +0800 Subject: [PATCH] =?UTF-8?q?(client)=20feat:=E5=AE=8C=E6=88=90=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E7=9A=84=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Client/Assets/Scripts/Data/Define.cs | 53 +++++++++++-------- Client/Assets/Scripts/Data/DefinePack.cs | 16 ++++-- .../Assets/Scripts/Managers/DefineManager.cs | 36 ++++++++++++- 3 files changed, 77 insertions(+), 28 deletions(-) diff --git a/Client/Assets/Scripts/Data/Define.cs b/Client/Assets/Scripts/Data/Define.cs index 3f85e18..db15281 100644 --- a/Client/Assets/Scripts/Data/Define.cs +++ b/Client/Assets/Scripts/Data/Define.cs @@ -1,4 +1,3 @@ - using System; using System.Collections; using System.Collections.Generic; @@ -12,29 +11,30 @@ namespace Data public abstract class Define { public string defName; - public string label; public string description; + public string label; public string packID; + /// - /// 初始化方法,根据传入的 XML 元素 () 进行处理。 + /// 初始化方法,根据传入的 XML 元素 () 进行处理。 /// /// 包含定义信息的 XML 元素。 /// - /// 返回一个布尔值: - /// - 如果返回 false,表示按照默认方式处理(依次对 XML 进行变量名识别和赋值)。 - /// - 如果返回 true,表示使用自定义方式处理,不进行额外的默认处理。 + /// 返回一个布尔值: + /// - 如果返回 false,表示按照默认方式处理(依次对 XML 进行变量名识别和赋值)。 + /// - 如果返回 true,表示使用自定义方式处理,不进行额外的默认处理。 /// /// - /// - /// 该方法的基类实现会自动识别并处理以下三个变量: - /// - defName - /// - label - /// - description - /// - /// - /// 如果需要覆盖默认行为,可以在派生类中重写此方法,并返回 true - /// 以指示框架跳过默认处理逻辑。 - /// + /// + /// 该方法的基类实现会自动识别并处理以下三个变量: + /// - defName + /// - label + /// - description + /// + /// + /// 如果需要覆盖默认行为,可以在派生类中重写此方法,并返回 true + /// 以指示框架跳过默认处理逻辑。 + /// /// public virtual bool Init(XElement xmlDef) { @@ -59,10 +59,7 @@ namespace Data if (value is IList list && list.Count > 0) // 如果是列表类型 { sb.AppendLine($"{name}:"); - foreach (var item in list) - { - sb.AppendLine($" - {FormatValue(item)}"); - } + foreach (var item in list) sb.AppendLine($" - {FormatValue(item)}"); } else if (value is Define defineObject) // 如果是继承自 Define 的子类 { @@ -89,8 +86,7 @@ namespace Data { var type = obj.GetType(); return type.GetFields(BindingFlags.Public | BindingFlags.Instance) - .Cast() - .Concat(type.GetProperties(BindingFlags.Public | BindingFlags.Instance).Cast()); + .Concat(type.GetProperties(BindingFlags.Public | BindingFlags.Instance).Cast()); } private static object GetValue(MemberInfo member, object obj) @@ -117,4 +113,17 @@ namespace Data } } + public class DefineReference : Define + { + public Define def; + public string className; + public string fieldName; + + public DefineReference(string className, string defName, string fieldName) + { + this.defName = defName; + this.className = className; + this.fieldName = fieldName; + } + } } \ No newline at end of file diff --git a/Client/Assets/Scripts/Data/DefinePack.cs b/Client/Assets/Scripts/Data/DefinePack.cs index 8d84a4d..a97c21f 100644 --- a/Client/Assets/Scripts/Data/DefinePack.cs +++ b/Client/Assets/Scripts/Data/DefinePack.cs @@ -141,15 +141,13 @@ namespace Data var className = element.Name.ToString(); if (string.IsNullOrEmpty(className)) continue; - // Debug.Log("1"); var def = LoadDefineClass(element,element.Name.ToString()); if (def == null) continue; - // Debug.Log("2"); + def.packID = packID; if (!defines.ContainsKey(className)) defines.Add(className, new List()); defines[className].Add(def); - // Debug.Log($"插入{className},{def.defName}"); } } /// @@ -257,7 +255,17 @@ namespace Data { Object value; if (IsFieldTypeInheritedFrom(field, typeof(Define))) - value = LoadDefineClass(element, field.FieldType.Name); + { + if (element.HasElements) + { + value = LoadDefineClass(element, field.FieldType.Name); + } + else + { + value = new DefineReference(field.FieldType.Name, element.Value, field.Name); + + } + } else value = Convert.ChangeType(element.Value, field.FieldType); field.SetValue(define, value); diff --git a/Client/Assets/Scripts/Managers/DefineManager.cs b/Client/Assets/Scripts/Managers/DefineManager.cs index 1ced07d..7af89ce 100644 --- a/Client/Assets/Scripts/Managers/DefineManager.cs +++ b/Client/Assets/Scripts/Managers/DefineManager.cs @@ -1,13 +1,14 @@ +using System; using System.Collections.Generic; using System.IO; using Data; +using UnityEngine; using Utils; namespace Managers { public class DefineManager : Singleton { - private const string coreNamespace = "Data"; private static readonly string[] dataSetFilePath = { "Data", "Mod" }; public Dictionary> defines = new(); @@ -29,7 +30,7 @@ namespace Managers var pack = new DefinePack(); if (pack.LoadPack(folder)) packs.Add(pack.packID, pack); } - + List> defineRefs = new(); foreach (var pack in packs) { foreach (var define in pack.Value.defines) @@ -41,6 +42,37 @@ namespace Managers foreach (var def in defList) { defines[typeName][def.defName] = def; + if (def is DefineReference reference) + { + defineRefs.Add(new(def,reference)); + } + } + } + } + + foreach (var defineRef in defineRefs) + { + var define = defineRef.Item1; + var reference = defineRef.Item2; + var referenceDef=FindDefine(reference.className,define.defName); + + var property = define.GetType().GetProperty(reference.fieldName); + if (property != null && property.CanWrite) + { + property.SetValue(define, referenceDef); + } + else + { + // 如果是字段而不是属性 + var field = define.GetType().GetField(reference.fieldName); + if (field != null) + { + field.SetValue(define, referenceDef); + } + else + { + // 处理找不到成员的情况 + Debug.LogError($"Could not find field or property '{reference.fieldName}' in type {define.GetType().Name}"); } } }