(client) fix:修复定义链接不正确赋值的问题
This commit is contained in:
@ -1,6 +1,8 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using Data;
|
||||
using UnityEngine;
|
||||
using Utils;
|
||||
@ -30,52 +32,53 @@ namespace Managers
|
||||
var pack = new DefinePack();
|
||||
if (pack.LoadPack(folder)) packs.Add(pack.packID, pack);
|
||||
}
|
||||
List<Tuple<Define,DefineReference>> defineRefs = new();
|
||||
|
||||
Dictionary<Type, FieldInfo[]> fieldCache = new();
|
||||
//不优化到循环里面是因为要先建立索引再链接
|
||||
List<Tuple<Define, FieldInfo, Define>> defineCache = new();
|
||||
|
||||
foreach (var pack in packs)
|
||||
{
|
||||
foreach (var define in pack.Value.defines)
|
||||
{
|
||||
var typeName=define.Key;
|
||||
var defList=define.Value;
|
||||
var typeName = define.Key;
|
||||
var defList = define.Value;
|
||||
|
||||
if (!defines.ContainsKey(typeName))
|
||||
defines[typeName] = new Dictionary<string, Define>();
|
||||
|
||||
foreach (var def in defList)
|
||||
{
|
||||
defines[typeName][def.defName] = def;
|
||||
if (def is DefineReference reference)
|
||||
|
||||
// 如果字段信息已经缓存,则直接使用缓存
|
||||
if (!fieldCache.TryGetValue(def.GetType(), out var defineFields))
|
||||
{
|
||||
defineRefs.Add(new(def,reference));
|
||||
// 获取所有字段类型为 Define 或其派生类型的字段
|
||||
defineFields = def.GetType()
|
||||
.GetFields(BindingFlags.Public | BindingFlags.Instance)
|
||||
.Where(field => typeof(Define).IsAssignableFrom(field.FieldType))
|
||||
.ToArray();
|
||||
// 缓存字段信息
|
||||
fieldCache[def.GetType()] = defineFields;
|
||||
}
|
||||
|
||||
foreach (var defineField in defineFields)
|
||||
{
|
||||
var defRef=(Define)defineField.GetValue(def);
|
||||
if (defRef==null || !defRef.isReferene)
|
||||
continue;
|
||||
defineCache.Add(new(def, defineField, defRef));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var defineRef in defineRefs)
|
||||
foreach (var defRef in defineCache)
|
||||
{
|
||||
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}");
|
||||
}
|
||||
}
|
||||
defRef.Item2.SetValue(defRef.Item1, FindDefine(defRef.Item3.description, defRef.Item3.defName));
|
||||
}
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
/// 查找指定定义类型的定义名对应的 Define 对象。
|
||||
|
Reference in New Issue
Block a user