Unity AssetDatabase和Resources资源管理

发表于2018-09-19
评论0 8.3k浏览
Unity常用的资源大概有3类:
1:纯资源(material,texture,shader,audio ……)这些资源不能直接拖到场景里使用。
2:预置(prefab),这种资源需要实例化之后才能使用
3:scene也是一种资源
还有一些平时不太关注的:脚本对象,文本文件,unity自己内置的资源(像新建粒子时的默认材质之类的),这些也是资源。

Unity管理这些资源分为两种:
1:在编辑器内管理,使用 assetdatabase 加载卸载资源
2:运行时管理,简单化使用 resource,复杂化使用asset bundle

在编辑器内加载卸载资源,并不能在游戏发布时使用,它只能在编辑器内使用。但是,它加载速度快,效率高,适合在测试时使用。这里我们用加载一个材质作为例子。

文件夹下新建一个材质,shader选择 这个,然后随便选择一个颜色

在界面上添加一个Button,新建一个脚本LoadingRec给他添加上然后监听里面的方法:
#if UNITY_EDITOR
using UnityEditor;
#endif
using System.Collections;
public class LoadingRec : MonoBehaviour {
#if UNITY_EDITOR
    public void Loading()
    {
        //加载材质
        //加载单个资源的两种写法,指明路径和资源名
        //Material mat2 = AssetDatabase.LoadAssetAtPath("Assets/Color", typeof(Material)) as Material;
        Material mat = AssetDatabase.LoadAssetAtPath<Material>("Assets/red.mat");
        Debug.Log(mat.color);
    }
#endif
}

然后运行时,点击按钮就能打印出刚才材质颜色了:

注意:在编辑器内的使用需要加上一个宏(包括命名空间和代码),否则发布时有可能会报错


加载完资源后,不使用时还需要把它卸载掉。否则内存会使用的越来越高。修改刚才的脚本:
//卸载资源
        Resources.UnloadAsset(mat);
        Debug.Log(mat.color);
方法内添加这点代码。

这时候再点击卸载按钮,打印log:

你会发现,还能打印出颜色,因为这里只是告诉unity要卸载资源,但真正的卸载取决于unity的垃圾回收机制,不一定会立马卸载掉。而且,这里的卸载,如果场景中有引用这个资源的物体,卸载时也会卸载掉。

修改一个资源,注释掉刚才的代码,添加以下代码:
//把颜色设为黑色
        mat.color = Color.black;
        //告诉编辑器这个物体已经被修改过了,已经脏了
        EditorUtility.SetDirty(mat);
        //保存已经改动过的资源
        AssetDatabase.SaveAssets();
        Debug.Log(mat.color);

现在运行程序,点击按钮:

就会发现打印的颜色不一样了。但是只有结束运行后,编辑器界面上才会显示改变后的材质。

在运行时管理资源,简单的方法就是使用Resources接口。这种方式控制资源的管理效率高,资源需要放在Resources文件夹下。这就说明unity在打包时只会打包Resources文件夹下的资源到终端上。 加载这个文件夹下的资源不需要扩展名。最好不要建立多个Resources文件夹,否则Unity可能会不知道要加载哪一个。

新建一个Resources 文件夹在Asset下,在Resources里面在新建一个文件夹test,在test下在新建一个Cube的Prefab,还有一个脚本ResourcesLoad。场景上新建一个button,添加此脚本,监听里面的方法:
using UnityEngine;
using System.Collections;
public class ResourcesLoad : MonoBehaviour
{
    public void RecLoad ()
    {
        //加载prefab
        GameObject go = Resources.Load<GameObject>("test/Cube");
        //实例化这个gameobject
        Instantiate(go);
    }
}

运行游戏,点击按钮,就可以在Hierarchy看见加载的cube了

这时候内存中其实有两份cube资源,因为实例化相当于copy。
在Unity中编辑器模式下貌似不能卸载gameobject资源,总会报错。

可以使用 Resources.UnloadAsset(mat); 卸载一些非game object的资源(如material)。
详细的还请去看官方文档,这里只简单概述。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引