• Resources 资源
    • Resources.Load 加载
    • Resources.LoadAsync 异步加载
    • Resources.UnloadAsset 卸载资源
    • Resources.UnloadUnusedAssets 卸载未使用的资源
    • Resources.FindObjectsOfTypeAll 查找该类型的所有对象

    Resources 资源

    Resources类允许你从指定的路径查找或访问资源。

    在编辑器,Resources.FindObjectsOfTypeAll能用来定位资源和场景对象。

    所有资源必须在项目Assets文件内的任意Resources文件夹中,可以通过Resources.Load访问。允许有多个Resources文件夹,每次加载对象是会自动检查。

    在Unity中通常不需要使用路径名来访问资源,相反你可以通过声明一个成员变量来暴露一个资源的引用,然后在检视面板中指定它。使用这个技巧的时候Unity可以在构建的时候自动计算哪个资源被使用。这从根本上最大限度地减少了实际用于游戏的资源的尺寸。当你放资源在“Resources”文件夹中时,所有在“Resources”文件夹中的资源都将被打包编译包含在游戏中。

    另一个使用路径名的缺点是,缺乏可重用性,因为脚本对于使用的资源具有硬编码要求。另一方面使用暴露在检视面板中的资源引用,是自文档化的,对于使用脚本的用户来说也是立竿见影的。

    然而,有些情况下按照名称比在检视面板中取回一个资源更方便,尤其是当在检视面板中指定引用是不方便的时候。例如你或许想从脚本创建一个游戏物体,为程序生成的网格赋值一个纹理。

    有些已加载的资源,最明显的是纹理,即使在场景没有实例,也最占内存。当资源不再需要时,你可以使用Resources.UnloadUnusedAssets回收内存。

    示例:

    1. using UnityEngine;
    2. using System.Collections;
    3. public class ExampleClass : MonoBehaviour {
    4. void Start() {
    5. var go = GameObject.CreatePrimitive(PrimitiveType.Plane);
    6. var rend = go.GetComponent<Renderer>();
    7. rend.material.mainTexture = Resources.Load("glass") as Texture;
    8. }
    9. }
    静态方法说明
    FindObjectsOfTypeAll返回所有type类型对象的一个列表。
    Load加载储存在Resources文件夹中path处的资源。不能在除主线程以外的线程中调用
    LoadAll加载Resources文件夹中的path文件夹或者文件中的所有资源。
    LoadAsync异步加载Resources文件夹中的资源。
    UnloadAsset从内存卸载指定的资源。
    UnloadUnusedAssets卸载未使用的资源。

    Resources.Load 加载

    加载储存在Resources文件夹中path处的资源。

    注意:路径名使用正斜杠“/”,如果使用反斜杠“\”会不正常运行。

    如果发现,返回所在path处的资源,否则返回null。如果有type参数,只有type类型的物体将被返回。 Path相对于Resources文件夹,忽略扩展名。Resouces文件夹可以在Assets文件夹中的任何位置。

    示例1:

    1. using UnityEngine;
    2. using System.Collections;
    3. public class ExampleClass : MonoBehaviour {
    4. void Start() {
    5. GameObject go = GameObject.CreatePrimitive(PrimitiveType.Plane);
    6. Renderer rend = go.GetComponent<Renderer>();
    7. rend.material.mainTexture = Resources.Load("glass") as Texture;
    8. }
    9. }

    示例2:

    1. using UnityEngine;
    2. using System.Collections;
    3. public class ExampleClass : MonoBehaviour {
    4. void Start() {
    5. // Instantiates a prefab named "enemy" located in any Resources
    6. // folder in your project's Assets folder.
    7. GameObject instance = Instantiate(Resources.Load("enemy", typeof(GameObject))) as GameObject;
    8. }
    9. }

    Resources.LoadAsync 异步加载

    异步加载Resources文件夹中的资源。

    public static ResourceRequest LoadAsync(string path);目标文件夹的路径名。当使用空字符串(即“”)时,该函数将加载资源文件夹的全部内容。


    Resources.UnloadAsset 卸载资源

    这个函数仅用于储存在硬盘上的资源。

    如果场景有任何对象引用该资源,该资源被使用时,Unity会从硬盘重新加载该资源。


    Resources.UnloadUnusedAssets 卸载未使用的资源

    如果对象没有进入到游戏场景,资源被认为没有使用,包括脚本组件,静态变量也被检查。

    这个脚本执行堆栈,然而并不检查,所以只从脚本栈中卸载引用的资源。如果需要的话下次再重新加载,这需要注意资源已经在内存中被修改。在资源垃圾回收被触发之前,确保调用EditorUtility.SetDirty。


    Resources.FindObjectsOfTypeAll 查找该类型的所有对象

    返回一个对象的类型或从type派生的数组。

    这个函数可以返回加载的Unity物体的任意类型,包含游戏对象、预制体、材质、网格、纹理等等。它也会列出内部的东西,因此,请格外小心处理返回的对象的方式。相反Object.FindObjectsOfType这个函数也会列出禁用的对象。

    请注意这个函数非常慢,不推荐在每帧中使用。

    示例1:

    1. using UnityEngine;
    2. using System.Collections;
    3. public class ExampleClass : MonoBehaviour {
    4. void OnGUI() {
    5. GUILayout.Label("All " + Resources.FindObjectsOfTypeAll(typeof(UnityEngine.Object)).Length);
    6. GUILayout.Label("Textures " + Resources.FindObjectsOfTypeAll(typeof(Texture)).Length);
    7. GUILayout.Label("AudioClips " + Resources.FindObjectsOfTypeAll(typeof(AudioClip)).Length);
    8. GUILayout.Label("Meshes " + Resources.FindObjectsOfTypeAll(typeof(Mesh)).Length);
    9. GUILayout.Label("Materials " + Resources.FindObjectsOfTypeAll(typeof(Material)).Length);
    10. GUILayout.Label("GameObjects " + Resources.FindObjectsOfTypeAll(typeof(GameObject)).Length);
    11. GUILayout.Label("Components " + Resources.FindObjectsOfTypeAll(typeof(Component)).Length);
    12. }
    13. }

    示例2:

    1. using UnityEngine;
    2. using System.Collections;
    3. using System.Collections.Generic;
    4. using UnityEditor;
    5. public class ExampleClass : MonoBehaviour {
    6. List<GameObject> GetAllObjectsInScene() {
    7. List<GameObject> objectsInScene = new List<GameObject>();
    8. foreach (GameObject go in Resources.FindObjectsOfTypeAll<GameObject>()) {
    9. if (go.hideFlags == HideFlags.NotEditable || go.hideFlags == HideFlags.HideAndDontSave)
    10. continue;
    11. if (!EditorUtility.IsPersistent(go.transform.root.gameObject))
    12. continue;
    13. objectsInScene.Add(go);
    14. }
    15. return objectsInScene;
    16. }
    17. }