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

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
@@ -0,0 +1,39 @@
using System;
namespace XericUI.ReflectionUIGenerator
{
/// <summary>
/// 为 Dropdown UI 提供预设选项
///
/// 使用示例:
/// [XuiavrgFieldDropdownValue("选项A", "选项B", "选项C", MergeMode = PresetOptionsMergeMode.Union)]
/// public string quality = "选项A";
///
/// </summary>
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
public class XuiavrgFieldDropdownValueAttribute : Attribute, IXuiavrgAttribute
{
/// <summary>预设选项数组</summary>
public readonly string[] Options;
/// <summary>与已有选项(如 enum 名)的合并模式</summary>
public PresetOptionsMergeMode MergeMode { get; set; } = PresetOptionsMergeMode.Replace;
public XuiavrgFieldDropdownValueAttribute(params string[] options)
{
Options = options ?? Array.Empty<string>();
}
public void BindMetaData(AvrgMemberMetaData metaData)
{
if (metaData == null) return;
metaData.PresetOptions = Options;
metaData.OptionsMergeMode = MergeMode;
// 自动设置 Tag 为 Dropdown
if (metaData.Tag == XuiavrgFieldTag.None)
metaData.Tag = XuiavrgFieldTag.Dropdown;
}
}
}
@@ -0,0 +1,39 @@
using System;
namespace XericUI.ReflectionUIGenerator
{
/// <summary>
/// 为 ToggleGroup UI 提供预设选项
///
/// 使用示例:
/// [XuiavrgFieldToggleGroupValue("低", "中", "高", MergeMode = PresetOptionsMergeMode.Replace)]
/// public string detailLevel = "中";
///
/// </summary>
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
public class XuiavrgFieldToggleGroupValueAttribute : Attribute, IXuiavrgAttribute
{
/// <summary>预设选项数组</summary>
public readonly string[] Options;
/// <summary>与已有选项(如 enum 名)的合并模式</summary>
public PresetOptionsMergeMode MergeMode { get; set; } = PresetOptionsMergeMode.Replace;
public XuiavrgFieldToggleGroupValueAttribute(params string[] options)
{
Options = options ?? Array.Empty<string>();
}
public void BindMetaData(AvrgMemberMetaData metaData)
{
if (metaData == null) return;
metaData.PresetOptions = Options;
metaData.OptionsMergeMode = MergeMode;
// 自动设置 Tag 为 ToggleGroup
if (metaData.Tag == XuiavrgFieldTag.None)
metaData.Tag = XuiavrgFieldTag.ToggleGroup;
}
}
}
@@ -8,12 +8,11 @@ namespace XericUI.ReflectionUIGenerator
/// 将一个复合类型(如 Vector2)拆分为多个子属性,分别绑定到不同的 UI 元素
///
/// 使用示例:
/// [XuiavrgFieldEntryGroup("speed")]
/// [XuiavrgSplit("x", "最小")]
/// [XuiavrgSplit("y", "最大")]
/// public Vector2 speedRange = new Vector2(0, 100);
///
/// 上述代码创建一个 "speed" 编组的 Entry,内部包含两个子绑定:
/// 上述代码创建一个编组 Entry,内部包含两个子元数据:
/// speedRange.x 绑定到 UI 的"最小"输入,speedRange.y 绑定到"最大"输入
/// 子绑定通过 XUIAvrgMDValue.BindingSlots 与预制体上的 UI 组件匹配
/// </summary>
@@ -39,13 +38,12 @@ namespace XericUI.ReflectionUIGenerator
public void BindMetaData(AvrgMemberMetaData metaData)
{
// 创建子元数据
// 创建子元数据 — 纯元数据,不持有实例
var subMetaData = new AvrgMemberMetaData
{
MemberName = $"{metaData.MemberName}.{PropertyPath}",
PropertyPath = PropertyPath,
LabelName = DisplayLabel ?? PropertyPath,
TargetInstance = null, // 由运行时闭包解析
Hide = metaData.Hide,
Required = metaData.Required,
FieldOrder = metaData.FieldOrder,
@@ -74,7 +72,6 @@ namespace XericUI.ReflectionUIGenerator
if (parentType == null || string.IsNullOrEmpty(propertyPath))
return null;
// 仅支持单层路径
if (propertyPath.Contains('/'))
return null;