预加载资源
预加载资源可让资产在场景启动时就被下载,从而在玩家第一次交互时即可立即使用。
在某些情况下,资源会被添加到场景中,但不会立即使用。例如,音频文件可能只会在玩家按下按钮时播放。在这种情况下,玩家第一次按下按钮时,音频可能会晚几秒播放,因为文件只有在需要时才会下载。
为避免此问题,请使用 AssetLoad 组件,确保这些资源在需要之前已下载并可供使用。
import { AssetLoad } from "@dcl/sdk/ecs"
AssetLoad.create(engine.RootEntity, {
assets: [
"assets/scene/bundle1/explosionSound.mp3",
"assets/scene/bundle1/explosion.glb",
],
})列在 AssetLoad 组件中的资源会被下载并加入内存,确保场景需要加载它们时可立即使用。
一些重要注意事项:
你可以将
AssetLoad组件放在任何实体上(不仅仅是 RootEntity),并且可以根据需要在多个实体上使用它。这对于处理场景中不同层级或区域的独立加载状态很有帮助。该
AssetLoad组件用于将资源添加到内存中,而不是移除它们。将资源从AssetLoad.create中移除不会释放内存。如果某个资源在场景加载时会立即使用(例如,放置在场景中的 GLB 模型,或持续播放的背景音效),则无需使用
AssetLoad组件,因为它已经在下载中了。向
AssetLoad.create添加资源时请注意,只预加载在场景启动时不需要的资源,以避免不必要的性能开销。你只能预加载作为场景文件一部分上传的资源。此功能无法用于预加载来自外部 URL 的图片
响应加载状态
如果你的场景能够对每个资源何时完成下载做出响应,那么预加载资源会更有用。例如,你可能希望一直显示加载界面,直到所有资源都准备就绪,向玩家显示进度,或者优雅地处理某个下载失败的资源。
要跟踪这一点,请使用 assetLoadLoadingStateSystem。调用其 registerAssetLoadLoadingStateEntity 方法,并传入持有 AssetLoad 组件的实体以及一个回调函数。每当该实体某个资源的加载状态发生变化时,回调函数都会运行。
回调函数会接收一个包含以下属性的对象:
asset:状态发生变化的资源路径。这与您在AssetLoad组件。currentState来自LoadingState枚举中的值,用于描述该资源的新状态。
该 LoadingState 枚举可以包含以下值:
LoadingState.LOADING:资源正在下载中。LoadingState.FINISHED:资源已成功下载并可供使用。LoadingState.FINISHED_WITH_ERROR:找到了该资源,但在下载时发生了错误。LoadingState.NOT_FOUND:在提供的路径下未找到任何资源。LoadingState.UNKNOWN:资源状态未知。
以下示例使用加载状态,根据资源预加载的进度来改变实体的颜色:
最后更新于