本章提供运行时公开 API 的导航。它不是源码签名的机械复制,而是说明每组 API 的职责、所有权和常见调用位置。完整行为以当前版本源码为准。
| 模块 | 主要命名空间 | 程序集 |
|---|---|---|
| Core | IFramework |
IFramework |
| Services | IFramework |
IFramework |
| UI | IFramework.UI |
IFramework |
| Editor | IFramework、IFramework.UI |
Editor 程序集 |
业务程序集引用 IFramework 后,通常只需要:
using IFramework;
using IFramework.UI;Game 是框架运行时入口,也是服务容器。业务通常继承它并挂到场景对象上。
| 成员 | 用途 |
|---|---|
protected abstract void Startup() |
注册、进入服务并启动业务;由框架 Awake 调用 |
protected virtual void OnQuit() |
Game 退出前的业务清理扩展点 |
Quit() |
幂等退出;随后逆序退出服务并释放绑定 |
Use<T>(service, string) |
按接口类型和可选名称注册服务 |
GetService<T>(string) |
查找服务;不存在时返回 null |
GetServices<T>() |
获取同一接口下的所有实例 |
EnterService<T>(string) |
进入已经注册的服务 |
Current |
当前 Launcher 持有的 Game |
BindUpdate/UnBindUpdate |
绑定或解绑每帧更新 |
BindFixedUpdate/UnBindFixedUpdate |
绑定或解绑固定帧更新 |
BindLateUpdate/UnBindLateUpdate |
绑定或解绑 LateUpdate |
BindOnApplicationFocus |
监听应用焦点变化 |
BindOnApplicationPause |
监听暂停变化 |
BindDisable |
监听 Launcher 禁用 |
绑定使用委托身份解绑。不要用两个内容相同但实例不同的匿名委托进行绑定和解绑。
private void OnFrame() { }
private void OnEnable() => Game.BindUpdate(OnFrame);
private void OnDisable() => Game.UnBindUpdate(OnFrame);Launcher 在运行时初始化阶段自动建立,并把 Unity PlayerLoop 转换成静态事件。一般由 Game 的静态方法间接使用,不需要业务手动创建。
| API | 说明 |
|---|---|
GetService(Type, string) |
按运行时类型和名称查找 |
GetService<T>(string) |
泛型查找 |
GetRequiredService<T>(string) |
必需服务查找 |
EnterService<T>(string) |
进入已经注册的服务 |
在 IServiceProvider 基础上增加注册能力。大多数 UseXxx 扩展都返回 IServiceCollection,因此可以链式配置。
自定义服务推荐继承 ServiceBase:
public sealed class InventoryService : ServiceBase
{
protected override void OnUse(IServiceCollection services)
{
// 注册时建立覆盖整个服务生命周期的资源。
}
protected override void OnEnter(IServiceCollection services)
{
// 全部依赖注册后开始运行。
}
protected override void OnQuit(IServiceCollection services)
{
// 解绑事件、释放池或外部句柄
}
}注册实例不等于进入服务。约定顺序是先完成全部 UseXxx,再执行 EnterXxx 或 EnterService<T>。
GetRequiredService<T>(name) 支持命名查询。它在缺失时记录错误并返回 null,不会像部分 DI 容器一样抛出异常。
| API | 说明 |
|---|---|
new AsyncTask() |
创建手动控制的任务 |
AsyncTask.CreateFromPool() |
保留的兼容入口;当前返回独立任务对象 |
SetResult() |
成功完成 |
AsyncTask<T>.SetResult(T) |
带结果完成 |
IsCompleted |
是否已经结束 |
IsCanceled |
是否因框架取消异常结束 |
Exception |
当前异常 |
任务只能完成一次。完成后的重复 SetResult 或 SetException 不会改变第一次完成结果。
| API | 结果 |
|---|---|
WhenAll(tasks) |
所有任务完成后结束 |
WhenAny(tasks) |
任意任务完成后结束 |
WhenAny<T>(tasks) |
返回最先完成任务的结果 |
Sequence(calls) |
按顺序调用任务工厂 |
把真正的工作包装为 Func<AsyncTask> 传给 Sequence。若提前创建所有任务,它们可能在进入序列前已经开始执行。
| API | 说明 |
|---|---|
NextFrame(token) |
下一次框架 Update 完成 |
Delay(seconds, token) |
等待秒数;使用框架更新时间源 |
Repeat(interval, count, action, token) |
按间隔重复;count == -1 为无限 |
While(condition, interval, token) |
条件为真时持续等待 |
Util(condition, interval, token) |
等待条件变为真 |
边界语义:
Delay的负数和零会立即完成;NaN会产生参数异常。Repeat(..., 0, ...)不调用回调并立即完成。Repeat的有效次数是-1或大于等于0。- 已取消 Token 优先产生取消结果。
这是 IFramework 自有类型,不是 System.Threading.CancellationTokenSource。
| API | 说明 |
|---|---|
Token |
获取轻量 Token |
Cancel() |
通知已注册任务取消 |
Dispose() |
释放注册集合 |
token.IsCancellationRequested |
查询取消状态 |
token.Register(task) |
任务随 Token 取消 |
框架异步系统面向 Unity 主线程调度,不应把它当作线程同步原语。
| API | 说明 |
|---|---|
Subscribe(string, Action<IEventArgs>) |
订阅同步消息 |
Subscribe<T>(IEventHandler) |
订阅类型消息 |
Subscribe(string, Func<T, AsyncTask>) |
订阅异步处理器 |
Publish(string, args) |
同步发布 |
Publish<T>(args) |
以类型名发布 |
PublishAsync(...) |
等待异步处理器 |
Wait(message, token) |
等待一次通知 |
Wait<T>(...) |
等待并取得事件参数 |
Notify(message) |
唤醒无参数等待者 |
Notify(message, arg) |
唤醒带参数等待者 |
Subscribe 返回 IDisposable,它就是订阅所有权。调用方必须在生命周期结束时释放。
| 成员 | 说明 |
|---|---|
Get() |
取出对象;池空时调用 Create() |
Set(T) |
归还对象;成功返回 true |
Clear() |
清空池内对象 |
count |
当前缓存数量 |
CreateNew() |
子类创建对象的扩展点 |
OnGet(T) |
取出后回调 |
OnSet(T) |
入池前验证/重置;返回 false 拒绝入池 |
OnClear(T) |
清理单个缓存项 |
重复归还同一实例会被拒绝。引用类型的 null 也不会进入池。
约束为 class, new()。类型实现 IPoolObject 后,可通过 OnGet 和 OnSet 重置状态。
| API | 说明 |
|---|---|
Get<T>() / Set<T>(value) |
按编译期类型使用静态对象池 |
SetByRealType(value) |
按对象真实运行时类型归还 |
GetArray<T>(length) |
获取精确长度数组 |
Set<T>(array) |
归还数组 |
CreateDisposable<T>() |
取得随 Dispose 自动归还的值包装 |
CreateDisposableArray<T>(length) |
取得数组包装 |
数组池按精确长度匹配。引用类型或包含引用字段的数组在归还时会清空元素,避免延长对象生命周期。
| API | 说明 |
|---|---|
UseValues() |
注册 Value 服务 |
Values() |
取得 Value 服务 |
Register(Type, value, name) |
注册值 |
Get(Type, name) |
读取值 |
Register<T>(value, name) |
泛型注册 |
Register<T>(factory) |
注册按需创建工厂 |
Get<T>(name) |
泛型读取 |
Inject(object) |
给标记成员注入 |
注入目标实现 IInjectAble,字段使用 [Inject]。当前 InjectAttribute 只允许标记字段,不支持属性;名称为空时按类型匹配,使用命名值时注册端和注入端必须一致。
| API | 说明 |
|---|---|
UseMvc(models, ctrls) |
注册模型和控制器集合 |
EnterMvc() |
注入并进入 MVC 服务 |
Mvc() |
获取 MVC 服务 |
GetModel<T>() |
读取模型 |
GetCtrl<T>() |
读取控制器 |
Mvc() 按 IMvcService 查询,与 UseMvc 的注册类型一致。
| API | 说明 |
|---|---|
UseState(states) |
注册状态集合 |
EnterState<T>() |
进入状态服务并切到初始状态 |
State() |
获取状态服务 |
SwitchState<T>() |
切换状态 |
FindState<T>() |
查找状态实例 |
GetCurrentState() |
当前状态 |
状态实例实现 IGameState,负责自己的进入、更新和退出行为。不要在同一次状态切换回调中递归触发无边界切换。
| API | 说明 |
|---|---|
UsePref(converter, loader) |
注册序列化转换器与存储加载器 |
Pref() |
获取服务 |
Load<T>(key) |
加载对象 |
Save<T>(key, value) |
保存对象 |
PrefContext<T> |
把 key 与值绑定为上下文 |
IPrefConverter 负责对象与存储格式转换,IPrefLoader 负责实际读写。密钥、版本迁移和原子写入由具体实现负责。
| API | 说明 |
|---|---|
UseGameObjectPool(asset) |
注册池和资源适配器 |
GameObjectPool() |
获取服务 |
Prepare(key) |
准备指定 key 的资源和内部池 |
Get<T>(key) |
获取 GameObjectView 实例 |
Set(view) |
归还实现 IPoolAbleGameObjectView 的 View |
Clear(path) |
清理指定资源池 |
ClearAll() |
清理全部缓存 |
IGameObjectPoolAsset 隔离资源加载和销毁。池化对象可实现 IPoolAbleGameObjectView 接收取出/归还回调。
| API | 说明 |
|---|---|
UseRedTree() |
注册红点树 |
RedTree() |
获取服务 |
CreateRedDot<T>(path, init) |
创建逻辑节点 |
CreateRedActiveDot(path, gameObject) |
创建控制 GameObject 激活状态的节点 |
FreshDots() |
批量刷新脏节点 |
路径表示层级关系。修改叶子状态后应在合适的批处理边界执行刷新。
| API | 说明 |
|---|---|
UseUndo(name) |
注册命名 Undo 服务 |
Undo(name) |
获取服务 |
Subscribe<T>(init, redo) |
从静态池取得记录、初始化并写入历史 |
Subscribe(record, redo) |
直接写入记录;可控制是否立即 Redo |
Undo() |
撤销 |
Redo() |
重做 |
Undo 记录可实现池重置协议。记录内容必须包含恢复前后状态所需的全部信息,不能依赖后来会变化的临时引用。
| API | 说明 |
|---|---|
game.UseUI(layerData, collection, bridge, delegate, canvas, name) |
注册 UI 服务 |
game.UI(name) |
获取命名 UI 服务 |
Show(path) |
显示面板;必要时加载 |
Hide(path) / Close(path) |
发起隐藏/关闭;实际操作延迟到下一帧 |
HideAsync(path) / CloseAsync(path) |
等待 View 完成过渡 |
GetIsPanelOpen(path) |
是否已经加载该面板 |
FindPanel(path) |
获取已加载 UIPanel |
GetVisibleList() |
获取当前可见 path 列表 |
LoadPanelAsync 和 DestroyPanel 负责资源边界,其余回调用于记录请求、显示状态、层顶变化、全屏数量和生命周期。适配器不应在回调里再次无条件调用同一 UI 操作,否则容易递归。
Bridge 把字符串 path 映射到具体 View:
Subscribe/UnSubscribe建立或移除映射。OnLoad/OnShow/OnHide/OnClose转发生命周期。OnBecameVisible/OnBecameInvisible表示因层级遮挡造成的可见性变化。OnHideAsync/OnCloseAsync把等待操作交给 View。
UIView 默认会立即完成异步隐藏/关闭 operation。自定义 View 覆盖动画方法后,必须在所有结束分支完成传入的 operation,否则调用方会一直等待。
用于一个面板内大量重复 Item。创建池时传入 Prefab、父节点和 View 工厂;使用结束必须释放池或回收所有活动项。
| 类型 | 用途 |
|---|---|
UnityEventHelper |
绑定 UnityEvent,并把解绑挂到对象生命周期 |
Empty4Raycast |
无渲染射线接收区域 |
PolygonRaycastImage |
多边形射线命中 |
ImagePolygonMeshEffect |
减少透明区域网格开销 |
UIPanel.AdaptNotchScreen |
安全区/异形屏适配 |
| API | 说明 |
|---|---|
Log.L |
普通日志 |
Log.W |
警告 |
Log.E |
错误 |
Log.Exception |
异常 |
Log.A |
条件断言 |
Log.logger |
替换日志适配器 |
发行构建是否输出日志由项目配置与日志实现共同决定。高频循环不要构造仅用于关闭日志的字符串。
Singleton<T> 提供纯 C# 单例,MonoSingleton<T> 提供 MonoBehaviour 单例。二者都代表全局所有权,应明确初始化、场景切换和销毁行为,避免用单例隐藏模块依赖。