Aesir Modules 特性一览¶
UI 框架¶
核心类型¶
| 类型 | 说明 |
|---|---|
UIModule |
UI 管理器单例(Manager of Managers):面板注册、显示、隐藏、预热与注册表维护;提供静态快捷 API 全局调用 |
UIRoot |
UI 根节点:构建四层 Canvas(Background / Normal / Popup / Top)+ UICamera + EventSystem,Canvas 统一配置经 UICanvasConfigSO |
IUIPanel |
面板契约:生命周期 Initialize → Show(payload) → Hide → DestroyPanel;属性 Layer / DestroyOnHide / IsOpen |
AesirBasePanel |
面板基类:虚方法 OnInit / OnShow / OnHide / OnClose,便捷方法 HideSelf() |
AesirBasePanelView<T> |
MVP 模式面板视图基类:继承 AesirBasePanel 并按 Context 类型绑定,经 Context 访问 Model / Service |
AesirBasePanelViewController<T> |
MVC 模式面板控制器基类:继承 AesirBasePanel 并按 Context 类型绑定,可执行 Command / Query |
IUIAssetLoader / ResourcesUILoader |
可插拔资源加载契约(同步语义)与默认实现 |
UICanvasConfigSO |
Canvas 统一配置资产(层序基准 100/200/300/400 每次初始化强制覆盖) |
UILayer |
层级枚举:Background / Normal / Popup / Top |
面板生命周期¶
- 面板以停用状态实例化,按 挂层 →
Initialize→Show顺序驱动 DestroyOnHide = false时隐藏仅 SetActive(false) 缓存复用;true时隐藏即销毁(受控销毁走OnHide→OnClose)OnClose仅受控销毁路径调用;场景卸载 / 外部 Destroy 只触发OnDestroy—— 事件解绑放OnDestroy- 注册以实例实际类型为键:重复 Show 报错拒绝、基类类型 Hide / Get 警告提示(键语义诊断)
Prewarm<T>()逐帧预实例化,PrewarmAll()分摊首次打开的实例化卡顿AesirBasePanel.OnDestroy静态反清理UIModule注册表,防止域内残留
Binder 组件绑定(Odin 可选)¶
BinderAssistant / BinderTag 将 UI 元素自动绑定到面板脚本:
BinderTag挂在子物体上做标记;BinderAssistant挂在面板根,「构建绑定单元」按标记增量维护绑定列表- 两种生成模式:同一脚本增量(只替换
*.cs内「绑定字段(自动生成)」region,region 外归开发者)与 Partial 分部类(手写 partial + 自动维护文件,Rider 用户推荐) - 生成脚本基类可下拉选择:
MonoBehaviour、Aesir 面板家族(AesirBasePanel/AesirBasePanelView<T>/AesirBasePanelViewController<T>)或用户以[BinderBaseType]标记的类 - 编译完成后自动挂载组件并执行一次绑定;配套 EditMode 测试
Input System 适配(可选)¶
独立程序集;启用 Input System 包时自动以 InputSystemUIInputModule 替换 UIRoot 的默认输入模块。
事件模块¶
双轨订阅事件系统:[AesirListener] 特性静态订阅 + AddListener<T> 动态 Lambda 订阅,共存于同一分发流程,按 4 档优先级(First / High / Medium / Last)稳定排序执行(同档按注册顺序);分发基于注册表快照迭代并支持重入发布(回调内可安全同步发布事件)。静态绑定经表达式树编译委托优化反射开销(分发热路径零反射、零字符串分配、零装箱)。内置订阅者过滤器(精确投递)、死引用自动清理与可选分发耗时告警;支持 SO 资产化(AesirEventArgsSO + UnityEventOnAesirEvent 桥接),非程序员可在 Inspector 配置事件。详见事件模块。
// 1. 定义事件参数(数据载体)
public class OnPlayerScored : AesirEventArgs
{
public int points;
public string playerName;
}
// 2. Attribute 订阅
public class ScoreUI : MonoBehaviour
{
void OnEnable() => EventModule.AddListener(this);
void OnDisable() => EventModule.RemoveListener(this);
[AesirListener]
private void OnPlayerScored(OnPlayerScored e) { /* ... */ }
}
// 3. Script 订阅(返回 AutoRemoveListenerHandle)
_handle = EventModule.AddListener<OnPlayerScored>(this, e => Debug.Log(e.points));
_handle.Dispose();
// 4. 发布
new OnPlayerScored { points = 10, playerName = "Player1" }.Invoke(this);
核心类型:AesirEventArgs(参数基类,支持 WithFilter 链式过滤器)、AesirListenerAttribute(AllowMultiple)、EventModule(单例)、ISubscriberFilter(过滤器策略接口)、AesirEventArgsSO / UnityEventOnAesirEvent(SO 资产化)、BindingInfo 家族、SubscriberPriority。
// 订阅者过滤器:只有 Tag 为 "Enemy" 且在爆炸范围内的订阅者收到
new OnExplosion()
.WithFilter(new InsideCollider2D())
.WithFilter(new WithTag("Enemy"))
.Invoke(this);
音频模块¶
AudioModule 单例的公开 API 全为静态成员,零配置调用即用 —— 2D 音频极简门面:
- SFX — 固定数量独占音源轮询(默认 8):无每播实例化开销,每次播放局部音量 / 音调独立,
pitchJitter抖动防机械感 - BGM — 专用循环源:同曲在播幂等返回;切换支持协程淡入淡出(
unscaledDeltaTime,slow motion 不变调) - 音量与静音 — Master / BGM / SFX 三通道乘法链,设置即时生效并经 PlayerPrefs 持久化
- 暂停 —
PauseAll/ResumeAll一对
AudioModule.PlaySfx(clickClip, pitchJitter: 0.1f); // SFX 一击即走
AudioModule.PlayBgm(sceneB, fadeSeconds: 1.5f); // 切歌淡入淡出
AudioModule.SfxVolume = 0.5f; // 设置即生效、即持久化
详见音频模块。
场景模块¶
SceneModule(MonoBehaviour 单例,预放置优先)负责场景加载、叠加追踪与卸载回收:
- 场景加载 —
LoadSceneSingle/LoadSceneAdditive纯叠加追踪,路径或SceneAssetWrapper双重重载,完成 / 失败 / 进度回调齐全(onProgress已按 Unity 激活上限 0.9 归一化) - 激活场景切换 —
SetActiveScene决定多场景叠加工作流的光照设置来源与 Instantiate 默认落点 - 场景事件广播 —
SceneLoadedEvent/SceneUnloadedEvent(MiniEvent,句柄自动清理) SceneAssetWrapper— 可序列化场景引用:GUID 锚点自愈、状态机校验、TryGet安全读取家族、专用异常族;安装 Addressables 时自动扩展地址查询能力(Inspector 面板效果需 Odin)- 编辑器配套 —
Tools → Aesir → Modules → Scene Editor Settings设置窗口;BootstrapSceneHelper搜集注册 Bootstrapper 场景(默认关闭,运行时只持引用不做自动流转)
脚本文档生成模块(需 Odin)¶
- Script Doc Generator — 反射分析 C# 类型生成结构化 API 文档:全离线、增量生成(保留
## Additional Notes之后的手写内容)、支持命名空间子目录与四种来源粒度(单类型 / 多类型 / 单程序集 / 多程序集),Markdown 输出可直接用于 AI 知识库。入口Tools → Aesir → Modules → Script Doc Generator - Summary 工具 — 在 XML
<summary>注释与[Summary]特性之间同步(特性为权威内容源):Sync 双向对齐 / Replace 收敛为特性 / Remove 移除(带确认),批量单次刷新。入口 Project 右键Assets → Script Doc Generator → Process Summary - 自定义特性 —
[Summary](运行时可经GetSummary()读取)、[ReferenceLinkURL](为类型附加文档链接)