Resource Loading
Learn how to use resource loading.
Method List
- LoadSceneAsync() Asynchronously load a scene
- LoadAssetSync() Synchronously load an asset object
- LoadAssetAsync() Asynchronously load an asset object
- LoadSubAssetsSync() Synchronously load sub-asset objects
- LoadSubAssetsAsync() Asynchronously load sub-asset objects
- LoadAllAssetsSync() Synchronously load all asset objects in a package
- LoadAllAssetsAsync() Asynchronously load all asset objects in a package
- LoadRawFileSync() Synchronously get a raw file
- LoadRawFileAsync() Asynchronously get a raw file
Common Convention
Location is the address of the resource and also the unique identifier for loading resource objects.
- When addressable mode is not enabled, location represents the complete path of the resource object.
// Example with an audio file in the project: "Assets/GameRes/Audio/bgMusic.mp3"
package.LoadAssetAsync<AudioClip>("Assets/GameRes/Audio/bgMusic");
- When addressable mode is enabled, location represents the addressable address of the resource object.
// 以工程内的音频文件为例:"Assets/GameRes/Audio/bgMusic.mp3"
// 需要在资源配置界面启用可寻址功能(Enable Addressable)。
// 配置界面的可寻址规则为AddressByFileName,那么资源定位地址填写文件名称:"bgMusic"
package.LoadAssetAsync<AudioClip>("bgMusic");
Matching Loading Paths
// 不带扩展名的模糊匹配
package.LoadAssetAsync<AudioClip>("Assets/GameRes/Audio/bgMusic");
// 带扩展名的精准匹配
package.LoadAssetAsync<AudioClip>("Assets/GameRes/Audio/bgMusic.mp3");
Asynchronous Loading Example
// 委托加载方式
void Start()
{
AssetOperationHandle handle = package.LoadAssetAsync<AudioClip>("Assets/GameRes/Audio/bgMusic.mp3");
handle.Completed += Handle_Completed;
}
void Handle_Completed(AssetOperationHandle handle)
{
AudioClip audioClip = handle.AssetObject as AudioClip;
}
// 协程加载方式
IEnumerator Start()
{
AssetOperationHandle handle = package.LoadAssetAsync<AudioClip>("Assets/GameRes/Audio/bgMusic.mp3");
yield return handle;
AudioClip audioClip = handle.AssetObject as AudioClip;
}
// Task加载方式
async void Start()
{
AssetOperationHandle handle = package.LoadAssetAsync<AudioClip>("Assets/GameRes/Audio/bgMusic.mp3");
await handle.Task;
AudioClip audioClip = handle.AssetObject as AudioClip;
}
Resource Unloading Example
IEnumerator Start()
{
AssetOperationHandle handle = package.LoadAssetAsync<AudioClip>("Assets/GameRes/Audio/bgMusic.mp3");
yield return handle;
...
handle.Release();
}
Resource Release Example
You can call the resource release method after switching scenes or set a timer interval to release resources.
Note: Only when the resource release method is called, the resource object will be removed from memory.
private void UnloadAssets()
{
var package = YooAssets.GetAssetsPackage("DefaultPackage");
package.UnloadUnusedAssets();
}
Prefab Loading Example
IEnumerator Start()
{
AssetOperationHandle handle = package.LoadAssetAsync<GameObject>("Assets/GameRes/Panel/login.prefab");
yield return handle;
GameObject go = handle.InstantiateSync();
Debug.Log($"Prefab name is {go.name}");
}
Sub-object Loading Example
For example, if you have an atlas created with TexturePacker and you need to access the sprite objects in the atlas, you can use the sub-object loading interface.
IEnumerator Start()
{
SubAssetsOperationHandle handle = package.LoadSubAssetsAsync<Sprite>(location);
yield return handle;
var sprite = handle.GetSubAssetObject<Sprite>("spriteName");
Debug.Log($"Sprite name is {sprite.name}");
}
Loading All Objects in a Package Example
For example, if we have all the configuration files packed into one package, and we want to load and parse all the configuration files at once.
IEnumerator Start()
{
AllAssetsOperationHandle handle = package.LoadAllAssetsAsync<UnityEngine.TextAsset>(location);
yield return handle;
foreach(var assetObj in handle.AllAssetObjects)
{
UnityEngine.TextAsset textAsset = assetObj as UnityEngine.TextAsset;
}
}
Asynchronous Scene Loading Example
Note: When loading a new main scene, the previously loaded main scene and additional scenes will be automatically unloaded.
IEnumerator Start()
{
string location = "Assets/GameRes/Scene/Login";
var sceneMode = UnityEngine.SceneManagement.LoadSceneMode.Single;
bool suspendLoad = false;
SceneOperationHandle handle = package.LoadSceneAsync(location, sceneMode, suspendLoad);
yield return handle;
Debug.Log($"Scene name is {handle.Scene.name}");
}
Raw File Loading Example
For example, the initialization file for Wwise.
IEnumerator Start()
{
string location = "Assets/GameRes/wwise/init.bnk";
RawFileOperationHandle handle = package.LoadRawFileAsync(location);
yield return handle;
byte[] fileData = handle.GetRawFileData();
string fileText = handle.GetRawFileText();
string filePath = handle.GetRawFilePath();
}
Configuration File Loading Example
// 自定义的配置文件
public class MyGameConfig: ScriptableObject
{
...
}
IEnumerator Start()
{
string location = "Assets/GameRes/config/gameConfig.asset";
AssetOperationHandle handle = package.LoadAssetFileAsync(location);
yield return handle;
MyGameConfig gameCOnfig = handle.AssetObject as MyGameConfig;
}
Get Resource Information List
Get a list of resource information using resource tags.
void GetAssetInfosByTag(string tag)
{
AssetInfo[] assetInfos = package.GetAssetInfos(tag);
foreach (var assetInfo in assetInfos)
{
Debug.Log(assetInfo.AssetPath);
}
}