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}");
}
}
}