资源 101

介绍

Unity 有一些特别命名的文件夹,允许各种用途。其中一个文件夹称为资源

‘Resources’文件夹是 Unity 中运行时加载资产的两种方式之一(另一种是 AssetBundles(Unity Docs))

Resources 文件夹可以驻留在 Assets 文件夹中的任何位置,你可以拥有多个名为 Resources 的文件夹。所有’Resources’文件夹的内容在编译期间合并。

从 Resources 文件夹加载资产的主要方法是使用 Resources.Load 函数。此函数采用字符串参数,该参数允许你指定文件对于 Resources 文件夹的路径。请注意,加载资源时无需指定文件扩展名

public class ResourcesSample : MonoBehaviour {  
    
    void Start () {
        //The following line will load a TextAsset named 'foobar' which was previously place under 'Assets/Resources/Stackoverflow/foobar.txt'
        //Note the absence of the '.txt' extension! This is important!

        var text = Resources.Load<TextAsset>("Stackoverflow/foobar").text;
        Debug.Log(string.Format("The text file had this in it :: {0}", text));
    }
}

也可以从 Resources 加载由多个对象组成的对象。例如,这样的对象是具有烘焙纹理的 3D 模型,或者是多个精灵。

//This example will load a multiple sprite texture from Resources named "A_Multiple_Sprite"
var sprites = Resources.LoadAll("A_Multiple_Sprite") as Sprite[];

把它们放在一起

这是我的一个帮助类,我用它来加载任何游戏的所有声音。你可以将其附加到场景中的任何 GameObject,它将从“Resources / Sounds”文件夹加载指定的音频文件

public class SoundManager : MonoBehaviour {
    
    void Start () {

        //An array of all sounds you want to load
        var filesToLoad = new string[] { "Foo", "Bar" };

        //Loop over the array, attach an Audio source for each sound clip and assign the 
        //clip property.
        foreach(var file in filesToLoad) {
            var soundClip = Resources.Load<AudioClip>("Sounds/" + file);
            var audioSource = gameObject.AddComponent<AudioSource>();
            audioSource.clip = soundClip;
        }
    }
}

最后的笔记

  1. 在将资产包含到构建中时,Unity 非常聪明。任何未序列化的资产(即在构建中包含的场景中使用)都将从构建中排除。但是,这不适用于 Resources 文件夹中的任何资产。因此,不要过度添加资源到此文件夹

  2. 正在使用 Resources.Load 或 Resources.LoadAll 加载资产可以在未来使用卸载 Resources.UnloadUnusedAssetsResources.UnloadAsset