(client) feat:完成定义的链接

This commit is contained in:
m0_75251201
2025-07-15 11:58:22 +08:00
parent a8bcb403ed
commit 27cf9d2f41
3 changed files with 77 additions and 28 deletions

View File

@ -1,4 +1,3 @@
using System;
using System.Collections;
using System.Collections.Generic;
@ -12,9 +11,10 @@ namespace Data
public abstract class Define
{
public string defName;
public string label;
public string description;
public string label;
public string packID;
/// <summary>
/// 初始化方法,根据传入的 XML 元素 (<paramref name="xmlDef" />) 进行处理。
/// </summary>
@ -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,7 +86,6 @@ namespace Data
{
var type = obj.GetType();
return type.GetFields(BindingFlags.Public | BindingFlags.Instance)
.Cast<MemberInfo>()
.Concat(type.GetProperties(BindingFlags.Public | BindingFlags.Instance).Cast<MemberInfo>());
}
@ -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;
}
}
}

View File

@ -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<Define>());
defines[className].Add(def);
// Debug.Log($"插入{className},{def.defName}");
}
}
/// <summary>
@ -257,7 +255,17 @@ namespace Data
{
Object value;
if (IsFieldTypeInheritedFrom(field, typeof(Define)))
{
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);

View File

@ -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<DefineManager>
{
private const string coreNamespace = "Data";
private static readonly string[] dataSetFilePath = { "Data", "Mod" };
public Dictionary<string, Dictionary<string, Define>> defines = new();
@ -29,7 +30,7 @@ namespace Managers
var pack = new DefinePack();
if (pack.LoadPack(folder)) packs.Add(pack.packID, pack);
}
List<Tuple<Define,DefineReference>> 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}");
}
}
}