Appearance
资源加载相关
基础概念
一句话:在游戏运行时,用 C# 把 Prefab、图片、音频、配置、场景等资源加载进内存,使用它们,最后释放它们。
你先记住 4 个词:
Asset:项目里的资源文件,比如Enemy.prefab、Icon.png、BGM.mp3。Instance:运行时生成出来的对象,比如场景里的一个敌人。Key / Path:找到资源的名字或路径。Handle:异步加载返回的“凭证”,Addressables 里很重要,用完要释放。
最基础:Inspector 直接引用
固定资源优先用这个,新手最该先掌握。
c
using UnityEngine;
public class Spawner : MonoBehaviour
{
[SerializeField] private GameObject enemyPrefab;
public void Spawn()
{
Instantiate(enemyPrefab, transform.position, Quaternion.identity);
}
}这里 enemyPrefab 是资源引用,Instantiate 才是真的生成一个场景对象。
Resources.Load
适合原型、小项目、少量启动资源。资源必须放在 Resources 文件夹下。
c
using UnityEngine;
public class ResourceSpawn : MonoBehaviour
{
void Start()
{
GameObject prefab = Resources.Load<GameObject>("Enemies/Slime");
if (prefab == null)
{
Debug.LogError("资源没找到");
return;
}
Instantiate(prefab);
}
}注意路径不要写扩展名: Assets/Resources/Enemies/Slime.prefab 代码里写:"Enemies/Slime"
Addressables
中大型项目更推荐它,适合远程资源、热更新、DLC、活动资源、皮肤、关卡包。
c
using System.Collections;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
public class AddressableSpawn : MonoBehaviour
{
private AsyncOperationHandle<GameObject> handle;
IEnumerator Start()
{
handle = Addressables.LoadAssetAsync<GameObject>("Enemy/Slime");
yield return handle;
if (handle.Status == AsyncOperationStatus.Succeeded)
{
Instantiate(handle.Result);
}
else
{
Debug.LogError("加载失败");
}
}
private void OnDestroy()
{
if (handle.IsValid())
{
Addressables.Release(handle);
}
}
}最容易混的点
LoadAsset 只是拿到资源模板。 Instantiate 才是在场景里创建对象。 Destroy(obj) 只是销毁场景里的实例。 Addressables.Release(handle) 才是释放 Addressables 的资源引用。
学习顺序
先学 Inspector 引用 + Instantiate。 再学 Resources.Load。 再学 Resources.LoadAsync 和协程。 最后学 Addressables.LoadAssetAsync、InstantiateAsync、Release、缓存管理。
参考链接Unity Resources 系统介绍Unity Resources.LoadUnity Resources.LoadAsyncUnity Addressables 加载资源Unity Addressables 异步句柄Unity Addressables 内存管理Unity SceneManager.LoadSceneAsync