(client) feat:完成定义的链接
This commit is contained in:
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@ -12,29 +11,30 @@ namespace Data
|
|||||||
public abstract class Define
|
public abstract class Define
|
||||||
{
|
{
|
||||||
public string defName;
|
public string defName;
|
||||||
public string label;
|
|
||||||
public string description;
|
public string description;
|
||||||
|
public string label;
|
||||||
public string packID;
|
public string packID;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 初始化方法,根据传入的 XML 元素 (<paramref name="xmlDef"/>) 进行处理。
|
/// 初始化方法,根据传入的 XML 元素 (<paramref name="xmlDef" />) 进行处理。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="xmlDef">包含定义信息的 XML 元素。</param>
|
/// <param name="xmlDef">包含定义信息的 XML 元素。</param>
|
||||||
/// <returns>
|
/// <returns>
|
||||||
/// 返回一个布尔值:
|
/// 返回一个布尔值:
|
||||||
/// - 如果返回 <c>false</c>,表示按照默认方式处理(依次对 XML 进行变量名识别和赋值)。
|
/// - 如果返回 <c>false</c>,表示按照默认方式处理(依次对 XML 进行变量名识别和赋值)。
|
||||||
/// - 如果返回 <c>true</c>,表示使用自定义方式处理,不进行额外的默认处理。
|
/// - 如果返回 <c>true</c>,表示使用自定义方式处理,不进行额外的默认处理。
|
||||||
/// </returns>
|
/// </returns>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// <para>
|
/// <para>
|
||||||
/// 该方法的基类实现会自动识别并处理以下三个变量:
|
/// 该方法的基类实现会自动识别并处理以下三个变量:
|
||||||
/// - <c>defName</c>
|
/// - <c>defName</c>
|
||||||
/// - <c>label</c>
|
/// - <c>label</c>
|
||||||
/// - <c>description</c>
|
/// - <c>description</c>
|
||||||
/// </para>
|
/// </para>
|
||||||
/// <para>
|
/// <para>
|
||||||
/// 如果需要覆盖默认行为,可以在派生类中重写此方法,并返回 <c>true</c>
|
/// 如果需要覆盖默认行为,可以在派生类中重写此方法,并返回 <c>true</c>
|
||||||
/// 以指示框架跳过默认处理逻辑。
|
/// 以指示框架跳过默认处理逻辑。
|
||||||
/// </para>
|
/// </para>
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public virtual bool Init(XElement xmlDef)
|
public virtual bool Init(XElement xmlDef)
|
||||||
{
|
{
|
||||||
@ -59,10 +59,7 @@ namespace Data
|
|||||||
if (value is IList list && list.Count > 0) // 如果是列表类型
|
if (value is IList list && list.Count > 0) // 如果是列表类型
|
||||||
{
|
{
|
||||||
sb.AppendLine($"{name}:");
|
sb.AppendLine($"{name}:");
|
||||||
foreach (var item in list)
|
foreach (var item in list) sb.AppendLine($" - {FormatValue(item)}");
|
||||||
{
|
|
||||||
sb.AppendLine($" - {FormatValue(item)}");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (value is Define defineObject) // 如果是继承自 Define 的子类
|
else if (value is Define defineObject) // 如果是继承自 Define 的子类
|
||||||
{
|
{
|
||||||
@ -89,8 +86,7 @@ namespace Data
|
|||||||
{
|
{
|
||||||
var type = obj.GetType();
|
var type = obj.GetType();
|
||||||
return type.GetFields(BindingFlags.Public | BindingFlags.Instance)
|
return type.GetFields(BindingFlags.Public | BindingFlags.Instance)
|
||||||
.Cast<MemberInfo>()
|
.Concat(type.GetProperties(BindingFlags.Public | BindingFlags.Instance).Cast<MemberInfo>());
|
||||||
.Concat(type.GetProperties(BindingFlags.Public | BindingFlags.Instance).Cast<MemberInfo>());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static object GetValue(MemberInfo member, object obj)
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@ -141,15 +141,13 @@ namespace Data
|
|||||||
var className = element.Name.ToString();
|
var className = element.Name.ToString();
|
||||||
if (string.IsNullOrEmpty(className))
|
if (string.IsNullOrEmpty(className))
|
||||||
continue;
|
continue;
|
||||||
// Debug.Log("1");
|
|
||||||
var def = LoadDefineClass(element,element.Name.ToString());
|
var def = LoadDefineClass(element,element.Name.ToString());
|
||||||
if (def == null)
|
if (def == null)
|
||||||
continue;
|
continue;
|
||||||
// Debug.Log("2");
|
def.packID = packID;
|
||||||
if (!defines.ContainsKey(className))
|
if (!defines.ContainsKey(className))
|
||||||
defines.Add(className, new List<Define>());
|
defines.Add(className, new List<Define>());
|
||||||
defines[className].Add(def);
|
defines[className].Add(def);
|
||||||
// Debug.Log($"插入{className},{def.defName}");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -257,7 +255,17 @@ namespace Data
|
|||||||
{
|
{
|
||||||
Object value;
|
Object value;
|
||||||
if (IsFieldTypeInheritedFrom(field, typeof(Define)))
|
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
|
else
|
||||||
value = Convert.ChangeType(element.Value, field.FieldType);
|
value = Convert.ChangeType(element.Value, field.FieldType);
|
||||||
field.SetValue(define, value);
|
field.SetValue(define, value);
|
||||||
|
@ -1,13 +1,14 @@
|
|||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using Data;
|
using Data;
|
||||||
|
using UnityEngine;
|
||||||
using Utils;
|
using Utils;
|
||||||
|
|
||||||
namespace Managers
|
namespace Managers
|
||||||
{
|
{
|
||||||
public class DefineManager : Singleton<DefineManager>
|
public class DefineManager : Singleton<DefineManager>
|
||||||
{
|
{
|
||||||
private const string coreNamespace = "Data";
|
|
||||||
private static readonly string[] dataSetFilePath = { "Data", "Mod" };
|
private static readonly string[] dataSetFilePath = { "Data", "Mod" };
|
||||||
|
|
||||||
public Dictionary<string, Dictionary<string, Define>> defines = new();
|
public Dictionary<string, Dictionary<string, Define>> defines = new();
|
||||||
@ -29,7 +30,7 @@ namespace Managers
|
|||||||
var pack = new DefinePack();
|
var pack = new DefinePack();
|
||||||
if (pack.LoadPack(folder)) packs.Add(pack.packID, pack);
|
if (pack.LoadPack(folder)) packs.Add(pack.packID, pack);
|
||||||
}
|
}
|
||||||
|
List<Tuple<Define,DefineReference>> defineRefs = new();
|
||||||
foreach (var pack in packs)
|
foreach (var pack in packs)
|
||||||
{
|
{
|
||||||
foreach (var define in pack.Value.defines)
|
foreach (var define in pack.Value.defines)
|
||||||
@ -41,6 +42,37 @@ namespace Managers
|
|||||||
foreach (var def in defList)
|
foreach (var def in defList)
|
||||||
{
|
{
|
||||||
defines[typeName][def.defName] = def;
|
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}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user