Unity使用AssetDatabase编辑器资源管理

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
    }
}

修改后的颜色前后打印一致 但是使用该材质的小球材质会变
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值