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);
    }
}
相关推荐
qianbo_insist3 小时前
unity 无头模式启动
unity·游戏引擎
郝学胜-神的一滴4 小时前
深入解析Mipmap层级判定原理:从理论到实践
c++·unity·godot·游戏程序·图形渲染·unreal engine
绀目澄清1 天前
unity3d AI Navigation 中文文档
游戏·unity
绀目澄清1 天前
Unity 的AI Navigation 系统详细总结
人工智能·unity·游戏引擎
绀目澄清1 天前
Unity3D AI Navigation 详解:从基础概念到实战应用
unity·游戏引擎
绀目澄清1 天前
Unity3D AI导航系统完全指南:从核心概念到动画耦合
人工智能·unity
__water1 天前
RHK《模型贴图自由更换位置》
unity·贴图·模型贴图·移动不丢失
JIes__1 天前
Unity(二)——3D数学
unity·游戏引擎
淡海水1 天前
【节点】[RandomRange节点]原理解析与实际应用
unity·游戏引擎·shadergraph·图形·randomrange