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