資源 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