You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断引擎中Entity实体的GLTFShape资源已完全加载?

GLTF模型/实体加载完成时机判定方案

你不需要靠固定时长盲目等待,现有引擎API已经能精准拿到资源加载完成的状态,对应你期望的三种写法都可以实现:

  • 首先修正你原有代码的问题:new GLTFShape()必须传入模型资源路径,否则不会触发任何资源加载逻辑。
  • GLTFShape实例自带原生的loaded属性,是一个和资源加载状态完全绑定的Promise,加载成功时会resolve,加载失败时会reject,状态完全由引擎维护,不存在时机偏差。

1. 模型加载完成回调写法

直接调用loaded.then()传入回调即可,和你期望的OnLoaded逻辑完全一致:

const box = new Entity()
box.getComponent(Transform).position.set(3, 1, 3)
// 替换成你自己的模型路径
const model = new GLTFShape('models/box.glb')
box.addComponent(model)

// 注册加载完成回调
model.loaded.then(() => {
  // 此处模型已经完全加载到缓存,可以正常渲染、交互
  console.log('模型加载完成')
}).catch(err => {
  // 可选:捕获加载失败的异常
  console.error('模型加载失败', err)
})

engine.addEntity(box)

2. await异步等待写法

因为loaded本身就是Promise,直接在async函数里await即可,不需要改造engine原生方法:

async function spawnLoadedEntity() {
  const box = new Entity()
  box.getComponent(Transform).position.set(3, 1, 3)
  const model = new GLTFShape('models/box.glb')
  box.addComponent(model)
  engine.addEntity(box)

  // 等待模型加载完成
  await model.loaded
  // 此处写加载完成后的业务逻辑
}

spawnLoadedEntity()

3. addEntity传入回调的写法

可以自己封装一层工具方法实现你要的调用形式,兼容带GLTF资源的实体和普通无外部资源的实体:

/**
 * 添加实体并在资源加载完成后触发回调
 * @param entity 要添加的实体实例
 * @param onLoaded 加载完成回调
 */
function addEntity(entity: Entity, onLoaded?: () => void) {
  engine.addEntity(entity)
  if (!onLoaded) return

  const gltfComp = entity.getComponentOrNull(GLTFShape)
  if (gltfComp) {
    // 有GLTF资源的实体等模型加载完再触发回调
    gltfComp.loaded.then(onLoaded).catch(() => {})
    return
  }
  // 无外部资源的普通实体,添加后直接触发回调
  onLoaded()
}

// 调用方式和你预期完全一致
addEntity(box, () => {
  console.log('实体及挂载资源全部加载完成')
})

注意:不要使用固定时长的setTimeout做等待,不同用户的网络、设备性能差异极大,固定等待时长要么会提前触发逻辑导致报错,要么会造成不必要的等待延迟,基于原生loaded状态的判断是100%和引擎实际加载进度对齐的,没有误判风险。

内容的提问来源于stack exchange,提问作者Raidel Ross

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 04:57:22