示例 · 场景引导 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 均正常加载。