unity常用的资源大概有3类: 1:纯资源(material,texture,shader,audio ……)这些资源不能直接拖到场景里使用。 2:预置(prefab),这种资源需要实例化之后才能使用 3:scene也是一种资源 还有一些平时不太关注的:脚本对象,文本文件,unity自己内置的资源(像新建粒子时的默认材质之类的),这些也是资源。 Unity管理这些资源分为两种: 1:在编辑器内管理,使用 assetdatabase 加载卸载资源 2:运行时管理,简单化使用 resource,复杂化使用asset bundle 在编辑器内加载卸载资源,并不能在游戏发布时使用,它只能在编辑器内使用。但是,它加载速度快,效率高,适合在测试时使用。
注意:在编辑器内的使用需要加上一个宏(包括命名空间和代码),否则发布时有可能会报错 加载完资源后,不使用时还需要把它卸载掉。否则内存会使用的越来越高。
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 } }修改后的颜色前后打印一致 但是使用该材质的小球材质会变
