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("Assets/red.mat");
Debug.Log(mat.color);
}
#endif
}
注意:在编辑器内的使用需要加上一个宏(包括命名空间和代码),否则发布时有可能会报错
加载完资源后,不使用时还需要把它卸载掉。否则内存会使用的越来越高。修改刚才的脚本:
//卸载资源
Resources.UnloadAsset(mat);
Debug.Log(mat.color);
你会发现,还能打印出颜色,因为这里只是告诉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("test/Cube");
//实例化这个gameobject
Instantiate(go);
}
}
运行游戏,点击按钮,就可以在Hierarchy看见加载的cube了
这时候内存中其实有两份cube资源,因为实例化相当于copy。
在Unity中编辑器模式下貌似不能卸载gameobject资源,总会报错。
可以使用 Resources.UnloadAsset(mat); 卸载一些非game object的资源(如material)。
详细的还请去看官方文档,这里只简单概述。
工程文件 http://pan.baidu.com/s/1c1QwpRq 密码 h7eb