Unity加载资源--Resources

发布于:2024-07-02 ⋅ 阅读:(26) ⋅ 点赞:(0)

Unity加载资源–Resources

0. Unity中的Resources.Load方法使用总结

在Unity中我们最开始使用资源是通过public公开变量的方式在外部进行赋值或者拖拽的方式指定预制体,图片,音频等资源.

但是这样很麻烦,一不小心就忽略空指针异常, 如果项目更新,就需要重新拖拽. 如果是测试的话,使用拖拽的方式还是可以的. 如果是项目的话还是要通过代码的方式来加载资源.

关于小型项目的话就可以使用Unity自带的Resource相关的函数来加载资源. 前提是我们得知道或者要加载的资源应该存放在哪个文件中.

Unity加载资源的文件夹需要自己创建名字为Resources. 名字不能错, 可以有多个Resources文件夹.Resouces文件夹下可以有多个文件夹, 也就是可以按照类型或者自己的喜好来分类存储,比如:Model 模型, Texture 贴图 Audio 音频等具有含义的文件夹.

使用Resources.Load相关的API进行加载资源.

Resources.Load是Unity中一种简单且常用的资源加载方式,主要适用于小型项目或快速原型制作。以下是关于Resources.Load加载资源的内容总结:

1. 基本用法

  • Resources.Load方法可以从项目的Resources文件夹中加载资源。
  • Resources.Load<T> 方法是加载指定类型的资源
  • 调用时需要指定资源的路径和名称,路径可以是子文件夹。

2. 加载不同类型的资源

  • 预制体:如Resources.Load("Cube"),加载名为“Cube”的预制体。
  • 音频剪辑:如Resources.Load("Music/BGM"),加载名为“BGM”的音乐文件,不用填写后缀名
  • 文本文件:通过泛型方法加载,如Resources.Load<TextAsset>("Documents/ReadMe"),加载“ReadMe”文本文件。
  • 图片:如Resources.Load<Texture>("Pictures/Picture"),加载名为“Picture”的图片。

3. 加载机制

  • Resources.Load在运行时加载资源,资源会被打包进游戏文件中。
  • 加载的资源不是实例化的,需要使用Instantiate方法来实例化预制体。

4. 注意事项

  • Resources文件夹中的资源在构建游戏时会被直接打包,不适用于大型或频繁更新的资源。
  • 使用Resources.Load加载的资源无法通过AssetBundle进行版本控制或更新。
  • 加载的资源路径和名称必须正确,否则会返回null。

5. 替代方案

  • 对于大型项目,建议使用AssetBundles或Addressables进行资源管理,它们提供更灵活的资源加载方式,支持资源的更新和版本控制。
    总结来说,Resources.Load是Unity中一种基础的资源加载方法,适用于小型项目或开发过程中的快速原型制作。但对于大型或需要高效资源管理的项目,应考虑使用更高级的资源管理系统。

6.以下是测试代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LoadResource : MonoBehaviour
{
    AudioSource audioSource;
    Texture texture;
    // Start is called before the first frame update
    void Start()
    {
        // 加载Resources文件夹下的预制体
        GameObject go = Resources.Load("Cube") as GameObject;
        Instantiate(go);

        // 加载其他文件夹下的Resources下的预制体
        GameObject goSphere = Resources.Load("Sphere") as GameObject;
        Instantiate(goSphere);

        // 加载音频文件
        
        AudioClip audioClip = Resources.Load("Music/BGM") as AudioClip;
        audioSource = this.gameObject.AddComponent<AudioSource>();

        audioSource.clip = audioClip;

        // 使用泛型加载文本
        TextAsset textAsset = Resources.Load<TextAsset>("Documents/ReadMe");
        string textString = textAsset.text;
        Debug.Log(textString);

        // 使用泛型加载图片
        texture  = Resources.Load<Texture>("Pictures/Picture");

    }

    // Update is called once per frame
    void Update()
    {
        // 空格键破播放和暂停
        if (Input.GetKeyDown(KeyCode.Space))
        {
            if (audioSource.isPlaying)
            {
                audioSource.Pause();
            }
            else
            {   
                audioSource.Play();
            }
        }
    }

    //测试加载的图片
    void OnGUI()
    {
        if(texture != null)
        {
             GUI.DrawTexture(new Rect(0,0,Screen.width, Screen.height)), texture);
        }
    }
}