重构反射构建组件,添加材质反射组件

This commit is contained in:
2026-07-25 21:38:19 +08:00
parent f3672df6a7
commit b1636d5932
22 changed files with 1444 additions and 340 deletions
@@ -1,57 +1,36 @@
using System;
using System.Collections.Generic;
using System.Reflection;
namespace XericUI.ReflectionUIGenerator
{
/// <summary>
/// 单个成员的元数据数据结构
/// 记录从反射 + Attribute 标记中提取的所有信息
/// 纯数据描述 — 不持有反射信息(MemberInfo)和实例引用(TargetInstance)
///
/// 数据的实际读写通过 IAvrgValueAccessorFactory 在 BuildMDVM 阶段创建的 IAvrgValueAccessor 完成。
/// 这使得同一个元数据模板可复用于 C# 反射对象、Material Shader 属性等不同数据源。
/// </summary>
public class AvrgMemberMetaData
{
// ============ 反射信息 ============
// ============ 基本标识 ============
/// <summary>字段/属性名</summary>
/// <summary>字段/属性名(或 Shader 属性名如 "_MainTex")</summary>
public string MemberName { get; set; }
/// <summary>反射信息 (FieldInfo 或 PropertyInfo)</summary>
public MemberInfo MemberInfo { get; set; }
/// <summary>值类型</summary>
public Type ValueType { get; set; }
/// <summary>是否为属性 (false 为字段)</summary>
public bool IsProperty { get; set; }
/// <summary>绑定的目标实例 (可选,Step1 时可空)</summary>
public object TargetInstance { get; set; }
// ============ 拆分属性支持 ============
/// <summary>
/// 子属性路径(仅拆分属性有效)
/// 用于从父值中访问子字段/属性,如 "x"、"y"、"width"
/// </summary>
public string PropertyPath { get; set; }
/// <summary>
/// 拆分子元数据列表
/// 由 [XuiavrgSplit] 特性填充,每个子元数据对应一个拆分属性
/// </summary>
public List<AvrgMemberMetaData> SubMetaDataList { get; set; }
// ============ 从 IXuiavrgAttribute 融合的元数据 ============
/// <summary>显示标签</summary>
/// <summary>UI 显示标签</summary>
public string LabelName { get; set; }
/// <summary>单位文本</summary>
/// <summary>单位文本(如 "m/s")</summary>
public string UnitLabelName { get; set; }
/// <summary>格式化字符串(如 "{0:F2}")</summary>
public string FormatText { get; set; }
/// <summary>值类型</summary>
public Type ValueType { get; set; }
// ============ UI 映射 ============
/// <summary>功能标记</summary>
public XuiavrgFieldTag Tag { get; set; } = XuiavrgFieldTag.None;
@@ -67,21 +46,12 @@ namespace XericUI.ReflectionUIGenerator
/// <summary>是否在 UI 中隐藏</summary>
public bool Hide { get; set; }
/// <summary>值变更时触发的反射调用方法名</summary>
public string OnTriggerCall { get; set; }
// ============ 默认值与验证 ============
/// <summary>
/// 类的初始默认值(由类字段初始化器决定)
/// 例如 public float speed = 10f; → DefaultValue = 10f
/// </summary>
/// <summary>默认值(用于 UI 初始化和回退参考)</summary>
public object DefaultValue { get; set; }
// ============ 属性检查 (由 [PropertyCheck] 填充) ============
/// <summary>
/// 判断依据标识
/// 默认使用 ValueType.FullName 与 AvrgValueRangeConfig 中的条目匹配
/// </summary>
/// <summary>属性检查依据标识(默认使用 ValueType.FullName)</summary>
public string PropertyCheckKey { get; set; }
/// <summary>是否必填</summary>
@@ -99,47 +69,46 @@ namespace XericUI.ReflectionUIGenerator
/// <summary>是否启用无效值状态检查</summary>
public bool ValidateInvalid { get; set; }
// ============ 原始 Attribute 引用 ============
/// <summary>Shader Range 属性下限(null 表示非 Range 属性)</summary>
public float? RangeMin { get; set; }
/// <summary>Shader Range 属性上限(null 表示非 Range 属性)</summary>
public float? RangeMax { get; set; }
// ============ 拆分属性支持 ============
/// <summary>
/// 收集到的所有 IXuiavrgAttribute 列表
/// 保留原始引用,供扩展和自定义处理使用
/// 子属性路径(仅拆分属性有效)
/// 用于从父值中访问子字段/属性,如 "x"、"y"、"width"
/// </summary>
public string PropertyPath { get; set; }
/// <summary>
/// 拆分子元数据列表
/// 由 [XuiavrgSplit] 特性填充
/// </summary>
public List<AvrgMemberMetaData> SubMetaDataList { get; set; }
// ============ 预设选项 (Dropdown/ToggleGroup) ============
/// <summary>预设选项列表</summary>
public IReadOnlyList<string> PresetOptions { get; set; }
/// <summary>预设选项合并模式</summary>
public PresetOptionsMergeMode OptionsMergeMode { get; set; }
// ============ 扩展 ============
/// <summary>收集到的所有 IXuiavrgAttribute 列表</summary>
public List<IXuiavrgAttribute> Attributes { get; set; } = new List<IXuiavrgAttribute>();
/// <summary>
/// 从绑定目标获取值
/// </summary>
public object GetValue()
{
if (TargetInstance == null) return null;
switch (MemberInfo)
{
case PropertyInfo pi:
return pi.GetValue(TargetInstance);
case FieldInfo fi:
return fi.GetValue(TargetInstance);
default:
return null;
}
}
// ============ ★ 核心变更 — 值访问器工厂 ============
/// <summary>
/// 设置值到绑定目标
/// 值访问器工厂
/// 在元数据提取阶段设置(持有 MemberInfo 或 Shader 属性信息)
/// 在 BuildMDVM 阶段调用 CreateAccessor(targetInstance) 创建真正的读写通道
/// </summary>
public void SetValue(object value)
{
if (TargetInstance == null) return;
switch (MemberInfo)
{
case PropertyInfo pi:
if (pi.CanWrite)
pi.SetValue(TargetInstance, value);
break;
case FieldInfo fi:
fi.SetValue(TargetInstance, value);
break;
}
}
public IAvrgValueAccessorFactory AccessorFactory { get; set; }
}
}