跳到主要内容

资源注册表

AssetRegistry 是 PlayCanvas 管理资源的核心系统,维护应用中所有可用资源的集合,并提供查找、加载和管理方法。

访问注册表​

通过应用对象访问资源注册表:

const assets = this.app.assets;

查找资源​

按 ID 查找​

每个资源都有唯一的数字 ID,这是引用资源最可靠的方式:

const asset = this.app.assets.get(123456);

按名称查找​

按名称查找资源,返回首个匹配项:

const asset = this.app.assets.find('My Texture');

查找指定名称的全部资源:

const assets = this.app.assets.findAll('Enemy');

按标签查找​

可为资源添加标签,便于分组。查找带有指定标签的全部资源:

const levelAssets = this.app.assets.findByTag('level-1');

将多个标签放入数组,查找同时具备这些标签的资源,即 AND 逻辑:

// Assets tagged with BOTH 'level-1' AND 'enemy'
const enemies = this.app.assets.findByTag(['level-1', 'enemy']);

将多个标签作为独立参数传入,查找具备任意一个标签的资源,即 OR 逻辑:

// Assets tagged with 'level-1' OR 'level-2'
const assets = this.app.assets.findByTag('level-1', 'level-2');

资源事件​

资源添加、移除或加载时,注册表会发出事件:

注册表事件​

// Asset added to registry
this.app.assets.on('add', (asset) => {
console.log('Asset added:', asset.name);
});

// Asset removed from registry
this.app.assets.on('remove', (asset) => {
console.log('Asset removed:', asset.name);
});

// Asset loaded
this.app.assets.on('load', (asset) => {
console.log('Asset loaded:', asset.name);
});

// Asset failed to load
this.app.assets.on('error', (err, asset) => {
console.error('Failed to load:', asset.name, err);
});

单个资源事件​

也可以监听特定资源的事件:

const asset = this.app.assets.find('My Texture');

// Called when the asset's resource is ready
asset.on('load', (asset) => {
console.log('Texture loaded:', asset.resource);
});

// Called if loading fails
asset.on('error', (err, asset) => {
console.error('Failed:', err);
});

// Called when the asset is removed from the registry
asset.on('remove', (asset) => {
console.log('Asset removed');
});

// Called when any property changes
asset.on('change', (asset, property, newValue, oldValue) => {
console.log(`${property} changed from ${oldValue} to ${newValue}`);
});

使用 ready()​

ready() 可以方便地在资源加载完成时执行代码。如果资源已经加载,回调会立即执行:

const asset = this.app.assets.find('My Texture');

asset.ready((asset) => {
// Asset is guaranteed to be loaded here
const texture = asset.resource;
material.diffuseMap = texture;
});

// Make sure to trigger loading if not already loaded
this.app.assets.load(asset);

运行时添加资源​

可以在运行时创建新资源并添加到注册表:

const asset = new pc.Asset('New Texture', 'texture', {
url: 'path/to/texture.png'
});

this.app.assets.add(asset);
this.app.assets.load(asset);

另请参阅​