Unity AssetDatabase和Resources资源管理
发表于2018-09-19
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)。
详细的还请去看官方文档,这里只简单概述。