窗口系统 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)。