Unity 中的 Resources 详解

Resources 是 Unity 内置的资源加载系统,核心作用:不用拖面板,代码里动态加载图片、预设体、音频、文本等资源,是 Unity 最常用的动态资源方案。

一、核心规则(必须先看)

复制代码
1. 文件夹名字必须叫 Resources
   项目里新建文件夹,命名严格为 Resources(大小写敏感)
   可以多个 Resources 文件夹,Unity 会自动合并查找
2.资源放在里面,才能被代码加载
3.打包后 Resources 里的资源会全部打包,不管有没有用到
4.加载路径写法
  不用写后缀(.png/.prefab 都删掉)
  子文件夹直接写路径:"UI/ButtonIcon"

二、常用 API

  1. 加载单个资源(最常用)
cpp 复制代码
T 资源变量 = Resources.Load<T>("资源路径");
复制代码
T = 资源类型(GameObject, Sprite, AudioClip, Texture2D 等)
  1. 加载文件夹下所有资源
cpp 复制代码
Object[] 数组 = Resources.LoadAll("文件夹路径");
  1. 卸载未使用的资源(优化内存)
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 异步加载

  1. 同步加载(简单,会卡一下)
cpp 复制代码
GameObject obj = Resources.Load<GameObject>("Player");
  1. 异步加载(不卡顿,推荐大资源
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()
相关推荐
nnsix15 分钟前
Unity API 兼容的 .NET Standard 2.1 和 .NET Framework 区别
unity·游戏引擎·.net
mxwin23 分钟前
Unity Shader 制作半透明物体 使用多Pass提前写入深度的方式 避免穿模
unity·游戏引擎
nnsix2 小时前
Unity HybridCLR 笔记
笔记·unity·游戏引擎
nnsix3 小时前
Unity Addressables 笔记
unity·游戏引擎
RReality4 小时前
【Unity Shader URP】视差贴图 实战教程
ui·平面·unity·游戏引擎·图形渲染·贴图
小清兔18 小时前
Addressable的设置打包流程
笔记·游戏·unity·c#
3D霸霸21 小时前
Sourcetree 拉取新工程
数据仓库·unity
程序员正茂1 天前
Unity3d中RawImage显示视频画面偏白的解决方法
unity·视频·rawimage
mxwin1 天前
Unity SetPassCall和DrawCall的区别是什么
unity·游戏引擎·shader
电子云与长程纠缠1 天前
UE5 GameFeature创建与使用
开发语言·学习·ue5·游戏引擎