Resources 是 Unity 内置的资源加载系统,核心作用:不用拖面板,代码里动态加载图片、预设体、音频、文本等资源,是 Unity 最常用的动态资源方案。
一、核心规则(必须先看)
1. 文件夹名字必须叫 Resources
项目里新建文件夹,命名严格为 Resources(大小写敏感)
可以多个 Resources 文件夹,Unity 会自动合并查找
2.资源放在里面,才能被代码加载
3.打包后 Resources 里的资源会全部打包,不管有没有用到
4.加载路径写法
不用写后缀(.png/.prefab 都删掉)
子文件夹直接写路径:"UI/ButtonIcon"
二、常用 API
- 加载单个资源(最常用)
cpp
T 资源变量 = Resources.Load<T>("资源路径");
T = 资源类型(GameObject, Sprite, AudioClip, Texture2D 等)
- 加载文件夹下所有资源
cpp
Object[] 数组 = Resources.LoadAll("文件夹路径");
- 卸载未使用的资源(优化内存)
cpp
Resources.UnloadUnusedAssets();
三、超简单示例(直接复制用)
示例 1:加载预设体并生成
cpp
using UnityEngine;
public class LoadTest : MonoBehaviour
{
void Start()
{
// 1. 从 Resources 加载预设体
GameObject enemyPrefab = Resources.Load<GameObject>("Enemy");
// 2. 生成物体
Instantiate(enemyPrefab, Vector3.zero, Quaternion.identity);
}
}
资源结构:
cpp
Assets/Resources/Enemy.prefab
示例 2:加载图片(Sprite)
cpp
// 路径:Resources/UI/Icon.png
Sprite sprite = Resources.Load<Sprite>("UI/Icon");
GetComponent<Image>().sprite = sprite;
示例 3:加载音频
cpp
AudioClip clip = Resources.Load<AudioClip>("Audio/BGM");
GetComponent<AudioSource>().PlayOneShot(clip);
四、同步 vs 异步加载
- 同步加载(简单,会卡一下)
cpp
GameObject obj = Resources.Load<GameObject>("Player");
- 异步加载(不卡顿,推荐大资源
cpp
void Start()
{
StartCoroutine(LoadAsync());
}
IEnumerator LoadAsync()
{
ResourceRequest request = Resources.LoadAsync<GameObject>("Player");
// 等待加载完成
yield return request;
// 加载完成后使用
GameObject obj = request.asset as GameObject;
Instantiate(obj);
}
五、重要注意事项(避坑)
路径不要带后缀
❌ 错误:"Icon.png"
✅ 正确:"Icon"
名字写错会返回 null
控制台报 MissingResourceException
打包后无法修改 Resources 资源
想热更资源用 Addressables 或 AssetBundle
尽量不要大量使用 Resources
会增大包体、延长启动时间(所有资源要索引)
卸载技巧
切换场景后 Unity 会自动清 Resources 内存
想手动清:Resources.UnloadUnusedAssets()