1.5 AssetDataBase

1.AssetDataBase简介

2.AssetDataBase常用方法


1.AssetDataBase简介

csharp 复制代码
AssetDataBase用于在编辑器模式下管理项目中的资源文件(如预制体, 贴图, 脚本等), 它仅

能在编辑器代码中使用(需放在Editor文件夹下), 运行时无法调用

2.AssetDataBase常用方法

csharp 复制代码
1).资源路径和GUID相互转化

GUID是Unity中资源的唯一标识(不受路基修改影响)

a.AssetDatabase.AssetPathToGUID(string assetPath)

用途: 将资源的工程相对路径(如"Assets/Textures/Icon.png")转化为对应的GUID字符串

using UnityEditor;
using UnityEngine;

public class AssetDatabaseDemo : EditorWindow
{
    [MenuItem("Tools/PathToGUID")]
    static void ConvertPathToGUID()
    {
        string assetPath = "Assets/Textures/Icon.png";
        string guid = AssetDatabase.AssetPathToGUID(assetPath);
        Debug.Log($"资源{assetPath}的GUID:{guid}");
    }
}
csharp 复制代码
2).AssetDatabase.GUIDToAssetPath(string guid)

用途: 将GUID转回资源的工程相对路径

[MenuItem("Tools/GUIDToPath")]
static void ConvertGUIDToPath()
{
    string guid = "1234567890abcdef1234567890abcdef"; // 替换为实际GUID
    string assetPath = AssetDatabase.GUIDToAssetPath(guid);
    Debug.Log($"GUID{guid}对应的路径:{assetPath}");
}

csharp 复制代码
2).编辑器模式下加载资源

a.AssetDatabase.LoadAssetAtPath<T>(string assetPath) where T : Object

用途: 根据资源路径加载指定类型的资源(如预制体, 贴图, 材质, ScriptableObject等)

注: 路径必须是完整的工程相对路径, 且后缀名要正确(如.prefab, .png)
csharp 复制代码
[MenuItem("Tools/LoadAsset")]
static void LoadAssetExample()
{
    // 加载预制体
    string prefabPath = "Assets/Prefabs/Player.prefab";
    GameObject playerPrefab = AssetDatabase.LoadAssetAtPath<GameObject>(prefabPath);
    if (playerPrefab != null)
    {
        Debug.Log("成功加载预制体:" + playerPrefab.name);
    }

    // 加载贴图
    string texturePath = "Assets/Textures/Background.png";
    Texture2D bgTexture = AssetDatabase.LoadAssetAtPath<Texture2D>(texturePath);
    if (bgTexture != null)
    {
        Debug.Log("成功加载贴图,尺寸:" + bgTexture.width + "x" + bgTexture.height);
    }
}

csharp 复制代码
3).资源的创建/保存/删除

a.AssetDatabase.CreateAsset(Object asset, string path)

- asset参数表示"你想要持久化保存到Unity项目中的Unity对象实例", 支持的类型

ScriptableObject及其所有自定义子类

// 先定义一个ScriptableObject类
[CreateAssetMenu(fileName = "NewConfig", menuName = "MyGame/Config")]
public class GameConfig : ScriptableObject
{
    public int maxLevel = 100;
    public float moveSpeed = 5f;
}

// 编辑器方法创建该资源
[MenuItem("Tools/CreateGameConfig")]
static void CreateGameConfig()
{
    GameConfig config = ScriptableObject.CreateInstance<GameConfig>();
    // 资源保存路径(必须以Assets开头,带正确后缀.asset)
    string savePath = "Assets/Configs/GameConfig.asset";
    AssetDatabase.CreateAsset(config, savePath);
    AssetDatabase.SaveAssets(); // 保存所有未提交的资源更改
    AssetDatabase.Refresh(); // 刷新数据库,让Unity显示新资源
    Debug.Log("成功创建配置文件:" + savePath);
}
csharp 复制代码
b.AssetDatabase.DeleteAsset(string assetPath)

用途: 删除指定路径的资源文件(编辑器内删除,会放入回收站)

[MenuItem("Tools/DeleteAsset")]
static void DeleteAssetExample()
{
    string assetPath = "Assets/Configs/GameConfig.asset";
    if (AssetDatabase.DeleteAsset(assetPath))
    {
        Debug.Log("成功删除资源:" + assetPath);
        AssetDatabase.Refresh();
    }
    else
    {
        Debug.LogError("删除资源失败:" + assetPath);
    }
}
csharp 复制代码
c.AssetDatabase.SaveAssets()

用途: 将内存里临时的修改真正写到硬盘文件里, 不调用的话, 你的资源修改只会停留在内存

中, 关闭unity 就会消失

当我们通过代码做这些操作时, Unity并不会立刻把修改写到硬盘的资源文件里, 这些修改只存

在于内存中

- 用AssetDatabase.CreateAsset创建了新的ScriptableObject资源

- 修改了已有ScriptableObject资源的字段值(比如改了maxHP、moveSpeed)

- 对资源做了其他编辑器内的修改(如调整导入设置后未手动保存)
csharp 复制代码
[MenuItem("Tools/TestWithSave")]
static void TestWithSave()
{
    GameConfig config = ScriptableObject.CreateInstance<GameConfig>();
    config.maxLevel = 200;
    AssetDatabase.CreateAsset(config, "Assets/Configs/TestWithSave.asset");
    
    // 关键:把内存中的修改写入硬盘
    AssetDatabase.SaveAssets(); 
    AssetDatabase.Refresh();
    
    // 此时关闭Unity,重新打开后:
    // TestWithSave.asset里的maxLevel依然是200,修改被持久化了
}

csharp 复制代码
4).资源刷新与导入

a.AssetDatabase.Refresh()

用途: 刷新资源数据库, 让Unity识别新增/修改/删除的资源(比如通过代码创建文件后, 必须

调用此方法才能在Project窗口显示)

b.AssetDatabase.ImportAssets(string assetpath)

用途: 手动触发制定资源的重新导入(比如修改了图片的导入设置后, 强制重新导入生效)

[MenuItem("Tools/ReimportTexture")]
static void ReimportTexture()
{
    string texturePath = "Assets/Textures/Icon.png";
    AssetDatabase.ImportAsset(texturePath);
    Debug.Log("重新导入贴图:" + texturePath);
}

csharp 复制代码
5).资源搜索与信息获取

a.AssetDatabase.FindAssets(string filter)

用途: 根据筛选条件搜索资源(支持按名称, 标签, 类型搜索), 返回匹配资源的GUI数组

筛选语法: t:类型名(如t:Prefab、t:Texture2D、t:Material)、关键词(模糊匹配)

[MenuItem("Tools/SearchAssets")]
static void SearchAssetsExample()
{
    // 1. 搜索所有预制体(t:类型 是固定语法)
    string[] prefabGUIDs = AssetDatabase.FindAssets("t:Prefab");
    Debug.Log("找到预制体数量:" + prefabGUIDs.Length);
    foreach (string guid in prefabGUIDs)
    {
        string path = AssetDatabase.GUIDToAssetPath(guid);
        Debug.Log("预制体路径:" + path);
    }

    // 2. 搜索名称包含"Icon"的贴图(t:Texture2D 限定类型,Icon是关键词)
    string[] iconGUIDs = AssetDatabase.FindAssets("Icon t:Texture2D");
    Debug.Log("找到名称含Icon的贴图数量:" + iconGUIDs.Length);
}
csharp 复制代码
b.AssetDatabase.GetAssetPath(Object obj)

用途: 根据资源对象获取其工程相对路径

[MenuItem("Tools/GetSelectedAssetPath")]
static void GetSelectedAssetPath()
{
    // 获取Project窗口选中的第一个资源
    Object selectedObj = Selection.activeObject;
    if (selectedObj != null)
    {
        string path = AssetDatabase.GetAssetPath(selectedObj);
        Debug.Log("选中资源的路径:" + path);
    }
    else
    {
        Debug.LogWarning("请在Project窗口选中一个资源!");
    }
}

csharp 复制代码
6).依赖资源获取

AssetDatabase.GetDependencies(string assetPath)

用途: 获取指定资源的所有依赖资源路径(比如预制体依赖的材质、贴图、脚本等)

[MenuItem("Tools/GetDependencies")]
static void GetAssetDependencies()
{
    string prefabPath = "Assets/Prefabs/Player.prefab";
    string[] dependencies = AssetDatabase.GetDependencies(prefabPath);
    Debug.Log($"资源{prefabPath}的依赖资源数量:{dependencies.Length}");
    foreach (string depPath in dependencies)
    {
        Debug.Log("依赖资源:" + depPath);
    }
}
相关推荐
mxwin4 小时前
Unity Shader 半透明物体为什么不能写入深度缓冲?
unity·游戏引擎·shader
晚枫歌F5 小时前
三层时间轮的实现
网络·unity·游戏引擎
咸鱼永不翻身6 小时前
Lua脚本事件检查工具
unity·lua·工具
leo__5208 小时前
单载波中继系统资源分配算法MATLAB仿真程序
算法·matlab·unity
努力长头发的程序猿9 小时前
Unity使用ScriptableObject序列化资源
unity·游戏引擎
mxwin9 小时前
Unity Shader 手写基于 PBR 的 URP Lit Shader 核心光照计算
unity·游戏引擎·shader
小贺儿开发10 小时前
Unity3D 智能云端数字标牌系统
unity·阿里云·人机交互·视频·oss·广告·互动
魔士于安10 小时前
Unity windows 同步 异步 打开文件文件夹工具
游戏·unity·游戏引擎·贴图·模型
魔士于安11 小时前
unity lowpoly 风格 城市 建筑 道路 交通标志
游戏·unity·游戏引擎·贴图·模型
mxwin11 小时前
Unity GPU Shader 性能优化指南
unity·游戏引擎·shader