资源 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;
}
}
}
最后的笔记
-
在将资产包含到构建中时,Unity 非常聪明。任何未序列化的资产(即在构建中包含的场景中使用)都将从构建中排除。但是,这不适用于 Resources 文件夹中的任何资产。因此,不要过度添加资源到此文件夹
-
正在使用 Resources.Load 或 Resources.LoadAll 加载资产可以在未来使用卸载 Resources.UnloadUnusedAssets 或 Resources.UnloadAsset