Unity的资源管理模式,包括在编辑器管理(使用AssetDatabase)和在运行时管理(使用Resources和AssetBundle)
unity常用的资源大概有3类:
1:纯资源(material,texture,shader,audio ……)这些资源不能直接拖到场景里使用。
2:预置(prefab),这种资源需要实例化之后才能使用
3:scene也是一种资源
还有一些平时不太关注的:脚本对象,文本文件,unity自己内置的资源(像新建粒子时的默认材质之类的),这些也是资源。
Unity管理这些资源分为两种:
1:在编辑器内管理,使用 assetdatabase 加载卸载资源
2:运行时管理,简单化使用 resource,复杂化使用asset bundle
在编辑器内加载卸载资源,并不能在游戏发布时使用,它只能在编辑器内使用。但是,它加载速度快,效率高,适合在测试时使用。
AssetDatabase
注意:在编辑器内的使用需要加上一个宏(包括命名空间和代码),否则发布时有可能会报错
加载完资源后,不使用时还需要把它卸载掉。否则内存会使用的越来越高。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor; // 这个文件在手机上没有,需要使用条件编译
public class TestCreateAsset : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
#if UNITY_EDITOR
//加载资源 "Assets/Materials/TestMat.mat" 资源路径+名字(名字要带后缀)
Material ma = AssetDatabase.LoadAssetAtPath("Assets/Materials/TestMat.mat", typeof(Material)) as Material;
// 使用资源
Debug.Log(ma.name);
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.GetComponent<MeshRenderer>().material = ma;
// 卸载资源:注意,卸载方法是在Resources类中
Resources.UnloadAsset(ma);
// 调用GC来清理垃圾,资源不是立刻就被清掉的
Debug.Log(ma); //调用Resources.UnloadAsset()来清理资源时,只是标记该资源需要被GC回收,但不是立刻就被回收的,下一行的Debug.Log依然能看到该资源的引用不是Null。 cg未清除还会打印出
Material ma2 = Object.Instantiate<Material>(ma); //克隆出实例
// 创建资源 //若该材质已出现则会用最新创造的替换掉 无法直接创建一个资源,可以先加载一个现有的资源作为模版,或者先New一个模板出来。
AssetDatabase.CreateAsset(ma2, "Assets/Materials/new.mat");
// 刷新编辑器,使刚创建的资源立刻被导入,才能接下来立刻使用上该资源
AssetDatabase.Refresh();
// 使用资源
Debug.Log(ma2.name);
Debug.Log(ma2.color);
GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
sphere.GetComponent<MeshRenderer>().material = ma2;
ma2.color = Color.black; //运行中修改 并在运行后保存
GameObject cylinder = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
cylinder.GetComponent<MeshRenderer>().material = ma2;
// 通知编辑器有资源被修改了
EditorUtility.SetDirty(ma2);
// 保存所有修改
AssetDatabase.SaveAssets();
Debug.Log(ma2.color);
#endif
}
}
修改后的颜色前后打印一致 但是使用该材质的小球材质会变