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

示例 · 场景引导 Scene

把 Attr / Config / BT / Loc 串成一条链,演示「各系统该在什么时机、按什么顺序喂饱」——以及跨端数据加载契约。

文件:HYCSimpleSceneBootstrap.cs(普通 MonoBehaviour,挂在任意场景 GameObject 上)

心智模型

  • 更新阶梯顺序:Root → A0(引导) → A1(数据) → A2(场景) → A3(玩法) → B9(UI 最后)。
  • 引导期(A1)要把数据喂饱:本地化 Reload、配置表 Register、行为树 BTBlobLoader.LoadAll() 都应在任何玩法/UI 读它们之前完成。
  • 表现期(B9):UIManager 在帧末清消息,UI 最后处理,避免读到半截状态。

端到端步骤

// 游戏自己的引导 MonoBehaviour / ICustomBootstrap 里(全平台同一套代码,零 #if)
private async void Start()
{
    var ok = await new FrameworkBootstrap().InitializeAsync("World");
    // InitializeAsync = await StreamingAssets.PreloadAsync() → 建 World 装系统 → 补加载引导期数据
    // PC / iOS 上 PreloadAsync 是 no-op;WebGL / Android 上先把 blob HTTP 进内存缓存。
}
⚠
为什么不能用同步的 Initialize / 自写 ICustomBootstrap:XxxBlobSystem / LocalizationBlobSystem 都在 System.OnCreate(建 World 时)读 StreamingAssets,而 WebGL / Android 的预取必须在此之前完成。ICustomBootstrap 由 Entities 扫描自动触发、不是 async,等不了预取。

数据阶段(A1)顺序

// 1) 本地化:真实项目由 FrameworkBootstrap.InitializeAsync → EnsureBootDataLoaded 自动加载;
//    要换目录热更时才手动 LocalizationManager.Reload(目录)
// 2) 行为树:BTBlobLoader.LoadAll() —— 内部已走 StreamingAssets 抽象,跨端无需平台代码
// 3) 配置:生成的 XxxBlobSystem 会自动 Register(低层 ConfigRegistry.Register,宿主禁手写)

给 AI 的雷区

  • 顺序错 = 读到空:玩法在 Reload 前调 GetText 会拿到 未找到Key;在 LoadAll 前给实体挂 RunningBT 会让 BTInterpreterSystem 把 RunState.Result 置 Failed(树未注册)。数据阶段先跑完。
  • 示例系统默认不自动运行:HYCSimple*DemoSystem 全部标了 [DisableAutoCreation],这是刻意设计。唯一入口是 HYCSimpleSceneBootstrap:把它挂到空场景的 GameObject 上,由它 GetOrCreateSystemManaged<T>().Update() 手动驱动。
  • 🔴 System.IO 不得碰 StreamingAssets(跨端第一红线):读字节/文本用 StreamingAssets.ReadBytes / ReadText;判存在用 StreamingAssets.Exists;列目录用 StreamingAssets.GetKeysUnder。唯一允许写 System.IO + streamingAssetsPath 的地方:StreamingAssets 类自己和 PC-only 的编辑器工具。

Scene Content 示例(场景内容物)

本目录另含场景内容物系统的最小闭环演示:

  • HYCSimpleSpawnPoint —— 标记组件(B 来源):实现 ISceneContentMarker,挂在关卡 prefab 上即被 SceneContentAuthoring 自动发现,导出时写进 Blob。
  • HYCSimpleSceneContentSpawner —— 运行期生成注入点:实现 ISceneContentSpawner,按 contentTypeId 决定生成什么。
  • Editor/DemoResolver.cs —— 编辑器期解析器:按 prefab 名派生 id,[InitializeOnLoadMethod] 自注册。
✕
解析器类型在框架 Editor 程序集,运行时 asmdef 引用不了它——这是编译期硬约束,#if UNITY_EDITOR 包在运行时 asmdef 里照样 CS0234。所以解析器必须放样例自己的 Editor asmdef(Scene/Editor/HYCSimple.Scene.Editor.asmdef)。另外:挂了 SceneContentMarker 的 prefab 走框架内置兜底解析,无需注册即可导出。

验证清单

  • Console 打出「场景引导完成:Loc 已加载,BT 加载 N 棵,当前语言=cn,示例文本=开始游戏」。
  • 顺序验证:把 BTBlobLoader.LoadAll() 移到挂 RunningBT 之后,应见到树未注册的 Failed 日志(确认顺序敏感)。
  • 跨端回归(出 WebGL / Android 包必做):引导入口换成 await FrameworkBootstrap.InitializeAsync("World") 后出包,确认 Loc / BT / Config 均正常加载。