3.4 KiB
3.4 KiB
场景加载器(SceneLoader)
脚本入口: eve.SceneLoader()
把 3D 资产(glTF / OBJ / FBX,经 Assimp)解码成 scene 声明式场景树并挂载:
每个 aiNode 对应一个 SceneNode(GameObject),网格节点自动链接
Renderable3D(材质/贴图/PBR 参数),光照/相机/动画按选项导入。支持
热重载(diff 只改变化的部分)与异步解码。
基本用法
loader <- eve.SceneLoader();
local host = loader.load("models/room.glb");
if (host != null) {
print("nodes=" + loader.nodeCount("models/room.glb") +
" lights=" + loader.lightCount("models/room.glb") +
" cameras=" + loader.cameraCount("models/room.glb") + "\n");
}
目标导向指南
场景热重载
编辑器里改模型/材质后调用 loader.reload(path):重新解码 → diff →
只增删改变化节点,未变化对象不重传 GPU。返回统一 Result;成功且 value 为 true 表示有更新,成功且 value 为 false 表示无变化。
大场景异步加载
if (loader.pendingAsyncCount() == 0) loader.loadAsync("models/big.glb"); // 后台解码
// 主线程每帧轮询:
loader.pollAsync(); // 就绪后挂载(GPU 上传在主线程)
失败时 reload() 返回结构化 Result;成功后可用 warningCount(path) / warning(path, i) 检查缺失 normals、UV 等非致命问题。
导入 preset 与生产命名
loadPreset(path, "quality|balanced|mobile|raw") 和 loadAsyncPreset(...) 提供可重复的导入设置。默认 quality/balanced 保留完整内容;mobile 跳过灯光、相机和动画;raw 关闭会改写顶点布局的后处理。
Name_LOD0、Name_LOD1:自动标为 LOD,初始只显示 LOD0;setLod(path, level)切换。SOCKET_Weapon:标为model-socket,用socketCount/socketName枚举,也可通过 scene tag API 找到节点并挂接实体。UCX_、UBX_、USP_、UCP_:标为隐藏的collision几何,不创建 Renderable;物理或编辑器流水线可按 tag 生成碰撞体。
API 快查
SceneLoader(模块)
getName():模块名("SceneLoader")。load(path)→SceneHost(null 表示失败);默认自动链接 Renderable3D。host(path)→ 已挂载的SceneHost。reload(path)→ Result:热重载并 diff 应用;解码失败通过 Result 状态和诊断返回。unload(path):卸载并销毁链接的 Renderable3D。nodeCount(path)/loaded(path)。- 异步:
loadAsync(path)、loadAsyncPreset(path, preset)、pollAsync()、pendingAsyncCount()、prewarm(path)/clearPrewarm()/prewarmed(path)。 - preset/LOD/socket/collision:
loadPreset()、setLod()、socketCount()、socketName()、collisionCount()、collisionName()。 - 诊断:
warningCount()、warning();失败操作通过结构化 Result 返回诊断。 - 内容统计:
lightCount(path)、cameraCount(path)、animationCount(path)。 - 内容对象:
light(path, i)、camera(path, i)、skeleton(path)、clip(path, i)。
生命周期
- 返回的
SceneHost归 scene 模块管理,卸载/热重载后旧句柄失效。 - 异步加载的 GPU 上传必须发生在主线程,所以用
pollAsync()而非在 worker 里挂载。 - 材质贴图按路径缓存并跨网格共享;
unload会释放该路径的 GPU 资源。