◆ 持续开发中 · 当前为非稳定版本,如需抢先体验请通过 GitHub Issues 联系作者

组件绑定 UI Binder

把预制体上的节点 / 组件在开发期登记下来,生成强类型 Binder 类,窗口代码里用 Binder.CloseButton 直接访问——告别 transform.Find("...") 字符串。

运行时协议在 HYC.Framework.UI;生成类命名空间默认取项目设置的 CodeOutputPackageName。

三步接入

1. 预制体上挂 ComponentBinderTable    Add Component → HYC Framework/UI/UI 元素绑定
   逐条登记 Name / Target / Component / Desc
2. 生成                           菜单 HYC Framework/UI/Generate UI Binders
3. 窗口里用                        Binder.CloseButton.onClick.AddListener(...)

生成产物(节选)

// <auto-generated>
// 此文件由 HYC Framework 代码生成器自动生成,请勿手工修改——任何改动都会在下次生成时被覆盖。
// This file is auto-generated by the HYC Framework code generator. DO NOT EDIT.
// </auto-generated>
// ComponentBinder
// Prefab: Assets/UI/BagWindow.prefab
// Hierarchy: /BagWindow

namespace Game.UI
{
    public class BagBinder : HYC.Framework.UI.IComponentBinder
    {
        private HYC.Framework.UI.ComponentBinderTable m_table;

        public BagBinder(HYC.Framework.UI.ComponentBinderTable component) { m_table = component; }
        public BagBinder(UnityEngine.GameObject gameObject) { m_table = gameObject.GetComponent<...>(); }
        public void Reset(UnityEngine.GameObject gameObject) { m_table = gameObject.GetComponent<...>(); }

        private UnityEngine.Component GetComponentAt(int index) => m_table != null ? m_table.GetComponentAt(index) : null;
        public UnityEngine.GameObject gameObject => m_table != null ? m_table.gameObject : null;

        /// <summary> 关闭按钮 </summary>
        public UnityEngine.UI.Button CloseButton => GetComponentAt(0) as UnityEngine.UI.Button;
    }
}

嵌套 Binder(列表项)也是这样生成的:

// 字段
private UI.BagItemBinder m_Item__;
// 构造
m_Item__ = new UI.BagItemBinder(m_table != null ? m_table.GetComponentAt(2) : null);
// 属性
public UI.BagItemBinder Item => m_Item__;

运行时路径解析工具

using HYC.Framework.UI;

// 按路径取组件(path 为空则取 root 自身)
var btn = BinderEngine.Get<Button>(root, "Panel/Left/Close");

// 约定式:下划线转斜杠
var icon = BinderEngine.FindBySeralized<Image>(root, "Panel_Left_Icon");
// 等价于 Get<Image>(root, "Panel/Left/Icon")

// 直接实例化并绑定一个 Binder
var binder = BinderEngine.Bind<BagBinder>(rootGameObject);

坑

  • 默认类名取 GameObject 名——中文 / 空格节点名会生成失败(Invalid class name)。给绑表所在节点起个英文名字,或开 CustomClassName。
  • 每次 GenerateAll 会清空输出目录里所有带标记的文件:CleanFolder 按首行 // ComponentBinder 判断,不要把手写代码放进这个目录。
  • 输出目录是每工程设置(ProjectSettings/ComponentBinder.asset,无框架默认值)——建议指向 Assets/HYC/Generated/UI/Binders/,与配置 / 属性 / 天赋 / BT 产物归在一处。
  • ComponentBinderTable 会随预制体进包,条目多会增加序列化体积,按需登记。
  • 属性不缓存,高频访问(每帧)的组件建议自己在 OnViewOpen 里缓存到字段。
  • Require<T> 目前只是 Get<T> 的别名,不会报错(名字有误导性,别指望它抛异常)。