【Unity编辑器】使用AssetDatabase创建、删、改、加载资源

AssetDatabase是Unity编辑器环境下的一种API,主要用于在代码中对项目中的资源进行管理和操作。注意:AssetDatabase的这些方法只能在Unity编辑器环境下运行,不能在构建后的游戏中使用。在游戏运行时,你需要使用其他资源加载方法,如Resources.Load、AssetBundle加载或者Addressables等。

以下是一些常用的AssetDatabase方法及其使用示例:

创建新资产

cs 复制代码
using UnityEngine;
using UnityEditor;

public class CreateNewAssetExample : Editor
{
    [MenuItem("Assets/Create/New Asset")]
    static void CreateNewAsset()
    {
        // 创建一个新的ScriptableObject类型资产
        ScriptableObject newAsset = CreateInstance<ScriptableObject>();
        // 设置资产的名称
        newAsset.name = "NewAsset";
        // 选择保存新资产的路径
        string path = "Assets/MyAssets/NewAsset.asset";
        // 使用AssetDatabase.CreateAsset方法创建新资产
        AssetDatabase.CreateAsset(newAsset, path);
        // 让Unity刷新资源数据库,使新资产在项目窗口中可见
        AssetDatabase.SaveAssets();
        AssetDatabase.Refresh();
    }
}

2.创建新文件夹

cs 复制代码
using UnityEngine;
using UnityEditor;

public class CreateNewFolderExample : Editor
{
    [MenuItem("Assets/Create/New Folder")]
    static void CreateNewFolder()
    {
        // 指定新文件夹的路径
        string folderPath = "Assets/MyFolders/NewFolder";
        // 使用AssetDatabase.CreateFolder方法创建新文件夹
        AssetDatabase.CreateFolder("Assets/MyFolders", "NewFolder");
        // 刷新资源数据库
        AssetDatabase.SaveAssets();
        AssetDatabase.Refresh();
    }
}

3.删除指定资产或文件夹

cs 复制代码
using UnityEngine;
using UnityEditor;

public class DeleteAssetExample : Editor
{
    [MenuItem("Assets/Delete Selected Asset")]
    static void DeleteSelectedAsset()
    {
        // 获取当前选中的资产的路径
        string assetPath = AssetDatabase.GetAssetPath(Selection.activeObject);
        // 使用AssetDatabase.DeleteAsset方法删除资产
        if (!string.IsNullOrEmpty(assetPath) && AssetDatabase.Contains(Selection.activeObject))
        {
            AssetDatabase.DeleteAsset(assetPath);
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
        }
    }
}

4.一次性删除多个资产或文件夹

cs 复制代码
using UnityEngine;
using UnityEditor;

public class DeleteMultipleAssetsExample : Editor
{
    [MenuItem("Assets/Delete Multiple Assets")]
    static void DeleteMultipleAssets()
    {
        // 获取所有选中的资产的路径
        string[] assetPaths = Selection.assetGUIDs.Select(AssetDatabase.GUIDToAssetPath).ToArray();
        // 使用AssetDatabase.DeleteAssets方法删除所有选中的资产
        AssetDatabase.DeleteAssets(assetPaths);
        AssetDatabase.SaveAssets();
        AssetDatabase.Refresh();
    }
}

5.获取资产存储路径的文件夹路径名

cs 复制代码
using UnityEngine;

public class GetAssetPathExample : MonoBehaviour
{
    void Start()
    {
        // 获取某个资产的路径
        string assetPath = AssetDatabase.GetAssetPath(someGameObject);
        // 获取该资产所在的文件夹路径
        string folderPath = Path.GetDirectoryName(assetPath);
        Debug.Log("Asset folder path: " + folderPath);
    }
}

AssetDatabase 如何获取Assets 目录下的一个游戏物体?

在Unity中,你可以使用AssetDatabase.LoadAssetAtPath方法来获取Assets目录下的一个游戏物体(如GameObject)。这个方法需要一个表示资源路径的字符串作为参数,并返回该路径下指定类型的资源。

注意:

在Unity编辑器环境下,我们通常不需要将使用AssetDatabase的代码放在诸如void Start()这样的 MonoBehaviour 生命周期方法中,因为这些方法主要是在运行游戏时调用的。

对于使用AssetDatabase的代码,更常见的做法是将其放在自定义的Editor脚本中的静态方法中,或者在执行特定编辑器操作(如菜单命令、Inspector窗口中的按钮点击等)时调用。这样可以确保这些代码只在Unity编辑器环境下运行,而不会在构建和运行游戏时被执行。

以下是一个修改后的示例,将使用AssetDatabase的代码放在一个自定义的Editor菜单命令中:

以下是一个示例,它加载Assets目录下"Models/FooModel.prefab"的游戏物体:

cs 复制代码
using UnityEngine;
using UnityEditor;

public class GetGameObjectFromAssets : Editor
{
    [MenuItem("Assets/Load GameObject")]
    static void LoadGameObject()
    {
        // 获取选中的资源路径
        string assetPath = AssetDatabase.GetAssetPath(Selection.activeObject);

        // 检查选中的是否为GameObject
        if (assetPath.EndsWith(".prefab") || assetPath.EndsWith(".unity"))
        {
            // 使用AssetDatabase.LoadAssetAtPath加载游戏物体
            GameObject loadedGameObject = AssetDatabase.LoadAssetAtPath<GameObject>(assetPath);

        
    }
}

在这个例子中,当你在Unity编辑器的项目窗口中右键点击一个GameObject或Prefab并选择"Load GameObject"菜单命令时,将会执行加载和显示信息的操作。这种方式更适合在编辑器环境下使用AssetDatabase进行资源操作。

相关推荐
CaracalTiger7 小时前
OpenClaw-VSCode:在 VS Code 中通过 WebSocket 远程管理 OpenClaw 网关的完整方案
运维·ide·人工智能·vscode·websocket·开源·编辑器
Zik----9 小时前
简单的Unity漫游场景搭建
unity·游戏引擎
Web极客码9 小时前
WordPress从经典编辑器升级到古腾堡编辑器
运维·编辑器·wordpress
江湖有缘9 小时前
Docker部署music-tag-web音乐标签编辑器
前端·docker·编辑器
在路上看风景19 小时前
4.5 顶点和片元
unity
LYOBOYI1231 天前
vscode界面美化
ide·vscode·编辑器
浔川python社1 天前
关于浔川代码编辑器 v5.0 网页版上线时间的通知
编辑器
在路上看风景1 天前
31. Unity 异步加载的底层细节
unity
天人合一peng1 天前
Unity中做表头时像work中整个调整宽窄
unity
浔川python社1 天前
浔川代码编辑器 v5.0 上线时间公布
编辑器