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

窗口系统 AbsUISystem

面向写界面的人:窗口 / 成员重写、嵌入 UI、热键注册、组件查找、焦点导航、动画钩子、UI 层表与模态窗口的用法篇。

命名空间 HYC.Framework.UI。架构与层级见 ECS UI 总览,组件绑定见 组件绑定。

一个完整窗口

using HYC.Framework.UI;

public partial class BagWindow : BaseWindowSystem<BagBinder>   // 泛型参数 = 生成的绑定类
{
    // Addressables 预制体 key(必填,abstract)
    public override string PrefabKey => "UI/BagWindow.prefab";

    // 可选:需要加itively 加载的 UI 场景
    public override string SceneKey => "Scene_UIBag";

    // 可选:层内排序(默认 0,升序)
    public override int Order => 10;

    // 可选:是否参与焦点(BaseWindowSystem 默认 true)
    public override bool Focusable => true;

    // 视图加载完成后调用(异步!)
    public override void OnViewOpen(params object[] args)
    {
        base.OnViewOpen();
        Binder.CloseButton.onClick.AddListener(OnClose);   // Binder 在这里才可用
    }

    public override void OnViewUpdate() { /* 每帧 */ }

    public override void OnViewClose()
    {
        UnregisterHotkey(mHotkey);
        base.OnViewClose();
    }
}
UIManager.OpenWindow<BagWindow>(1001, "equip");   // params 会透传到 OnViewOpen(args)
UIManager.Close<BagWindow>();
bool open = UIManager.IsOpen<BagWindow>();

热键注册

private HotkeyHandle mHotkey;

public override void OnViewOpen()
{
    // 最简单:动作名 + 回调
    mHotkey = RegisterHotkey(HotkeyActionNames.UI_UGUI_Cancel, ctx => UIManager.Close<BagWindow>());

    // 带长按(< 0.1 会被钳到 0.1,NaN 也变 0.1)
    RegisterHotkey("Game/UseItem", OnUse, holdTime: 0.5f);

    // 带 UI 提示元素(会在 parent 下生成按键提示 UI)
    RegisterHotkey("Game/UseItem", someHotkeyElement, OnUse, priority: 10);

    // 自定义样式 + 文本
    RegisterHotkey("Game/UseItem", OnUse, Binder.HotkeyRoot, "使用", HotkeyElementStyle.UI, 5);
}

UI 层表

层集合是数据:FrameworkSettings.uiLayers,在 HYC Framework/Settings/Project Settings → UI/层级 增删改名、拖动排序,点「保存并生成」产出 Assets/HYC/Generated/UI/UILayer.g.cs(层常量 + 每层 Open 糖,刻意不用 enum 防环)。

坑

  • 别在 OnCreate 里碰 View——此时预制体还没实例化。
  • OnViewClose 一定要 base.OnViewClose()——否则热键不注销、Part 不关、Enable/Disable 不配对。
  • Binder 是懒构造的:首次访问才 new T() + Reset(View)。不要在 OnViewOpen 之前访问 Binder(会绑到 null View 上)。
  • CanvasGroup 不会自动创建——需要淡入淡出就自己在预制体上放一个,并在 OnViewOpen 里赋给 CanvasGroup 属性。
  • UISystemType.Single 只对 HUDNotice 路径生效。
  • 类必须 partial:框架会给每个 SystemBase 子类生成同名 partial(不写会 CS0101)。