注意
:考慮到編輯器擴展的內容比較多,我將編輯器擴展的內容分開,并全部整合放在【unity游戲開發——編輯器擴展】專欄里,感興趣的小伙伴可以前往逐一查看學習。
文章目錄
- 前言
- 一、AssetDatabase常用API
- 1、創建資源
- 1.1 API
- 1.2 示例
- 2、創建文件夾
- 2.1 API
- 2.2 示例
- 3、拷貝資源
- 3.1 API
- 3.2 示例
- 4、移動資源
- 4.1 API
- 4.2 示例
- 5、刪除資源
- 5.1 API
- 5.2 示例
- 6、批量刪除資源
- 6.1 API
- 6.2 示例
- 7、獲取資源路徑
- 7.1 API
- 7.2 示例
- 8、根據路徑加載資源
- 8.1 API
- 8.2 示例
- 9、刷新項目資源
- 9.1 API
- 9.2 示例
- 10、返回資源所屬的AB包名
- 10.1 API
- 10.2 示例
- 二、最終代碼
- 專欄推薦
- 完結
前言
AssetDatabase公共類是 Unity 引擎中的一個編輯器類,用于在編輯器環境中管理和操作項目中的資源(Assets)。它提供了一系列靜態方法,使得開發者能夠在編輯器腳本中進行資源的創建、拷貝、移動、刪除等操作。
官方文檔:AssetDatabase
一、AssetDatabase常用API
1、創建資源
1.1 API
我們可以通過代碼動態創建一些資源
AssetDatabase.CreateAsset(資源,路徑);
注意:
- 路徑從
Assets/...
開始 - 不能在
StreamingAssets
中創建資源, - 不能創建預設體
- 只能創建資源相關,例如材質球等
- 路徑需要寫后綴
1.2 示例
using UnityEditor;
using UnityEngine;public class TestAssetDatabaseEditorWindow : EditorWindow
{[MenuItem("編輯器拓展/自定義窗口拓展/AssetDatabase窗口拓展")]private static void OpenWindow(){TestAssetDatabaseEditorWindow win = EditorWindow.GetWindow<TestAssetDatabaseEditorWindow>();win.Show();}private void OnGUI(){// 創建資源按鈕if (GUILayout.Button("創建資源")){// 創建一個材質,使用URP的Lit著色器Material mat = new Material(Shader.Find("Universal Render Pipeline/Lit"));// 將材質保存為Assets/Resources/TestURPLitMaterial.matAssetDatabase.CreateAsset(mat, "Assets/Resources/TestURPLitMaterial.mat");}}
}
效果
2、創建文件夾
2.1 API
AssetDatabase.CreateFolder(父文件夾路徑,新文件夾名)
注意:
- 父文件夾路徑從
Assets/...
開始
2.2 示例
using UnityEditor;
using UnityEngine;public class TestAssetDatabaseEditorWindow : EditorWindow
{[MenuItem("編輯器拓展/自定義窗口拓展/AssetDatabase窗口拓展")]private static void OpenWindow(){TestAssetDatabaseEditorWindow win = EditorWindow.GetWindow<TestAssetDatabaseEditorWindow>();win.Show();}private void OnGUI(){// 創建文件夾按鈕if (GUILayout.Button("創建文件夾")){// 在Assets/Resources下創建一個名為MyTestFolder的文件夾AssetDatabase.CreateFolder("Assets/Resources", "MyTestFolder");}}
}
效果
3、拷貝資源
3.1 API
AssetDatabase.CopyAsset(源資源路徑,目標路徑)
注意:
- 需要寫后綴名
- 路徑從
Assets/...
開始
3.2 示例
using UnityEditor;
using UnityEngine;public class TestAssetDatabaseEditorWindow : EditorWindow
{[MenuItem("編輯器拓展/自定義窗口拓展/AssetDatabase窗口拓展")]private static void OpenWindow(){TestAssetDatabaseEditorWindow win = EditorWindow.GetWindow<TestAssetDatabaseEditorWindow>();win.Show();}private void OnGUI(){// 拷貝資源按鈕if (GUILayout.Button("拷貝資源")){// 將Assets/Resources/TestURPLitMaterial.mat拷貝到Assets/Resources/MyTestFolder/TestURPLitMaterialCopy.matAssetDatabase.CopyAsset("Assets/Resources/TestURPLitMaterial.mat", "Assets/Resources/MyTestFolder/TestURPLitMaterialCopy.mat");}}
}
效果
4、移動資源
4.1 API
AssetDatabase.MoveAsset(老路徑, 新路徑);
注意:
- 路徑從
Assets/...
開始
4.2 示例
using UnityEditor;
using UnityEngine;public class TestAssetDatabaseEditorWindow : EditorWindow
{[MenuItem("編輯器拓展/自定義窗口拓展/AssetDatabase窗口拓展")]private static void OpenWindow(){TestAssetDatabaseEditorWindow win = EditorWindow.GetWindow<TestAssetDatabaseEditorWindow>();win.Show();}private void OnGUI(){// 移動資源按鈕if (GUILayout.Button("移動資源")){// 將Assets/Resources/MyTestFolder/TestURPLitMaterialCopy.mat移動到Assets/Resources/TestURPLitMaterialCopy.matAssetDatabase.MoveAsset("Assets/Resources/MyTestFolder/TestURPLitMaterialCopy.mat","Assets/Resources/TestURPLitMaterialCopy.mat");}}
}
5、刪除資源
5.1 API
AssetDatabase.DeleteAsset(資源路徑)
注意:
- 路徑從
Assets/...
開始
5.2 示例
using UnityEditor;
using UnityEngine;public class TestAssetDatabaseEditorWindow : EditorWindow
{[MenuItem("編輯器拓展/自定義窗口拓展/AssetDatabase窗口拓展")]private static void OpenWindow(){TestAssetDatabaseEditorWindow win = EditorWindow.GetWindow<TestAssetDatabaseEditorWindow>();win.Show();}private void OnGUI(){// 刪除資源按鈕if (GUILayout.Button("刪除資源")){// Assets/Resources/TestURPLitMaterialCopy.matAssetDatabase.DeleteAsset("Assets/Resources/TestURPLitMaterialCopy.mat");}}
}
效果
6、批量刪除資源
6.1 API
AssetDatabase.DeleteAssets(string[] 路徑們, List<string> 用于存儲刪除失敗的路徑)
注意:
- 路徑從
Assets/...
開始
6.2 示例
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;public class TestAssetDatabaseEditorWindow : EditorWindow
{[MenuItem("編輯器拓展/自定義窗口拓展/AssetDatabase窗口拓展")]private static void OpenWindow(){TestAssetDatabaseEditorWindow win = EditorWindow.GetWindow<TestAssetDatabaseEditorWindow>();win.Show();}private void OnGUI(){// 批量刪除資源按鈕if (GUILayout.Button("批量刪除資源")){// 創建一個列表,用于存儲刪除失敗的資源List<string> failList = new List<string>();// 批量刪除Assets/Resources/TestURPLitMaterial.mat和Assets/Resources/TestURPLitMaterial2.matAssetDatabase.DeleteAssets(new string[] { "Assets/Resources/TestURPLitMaterial.mat", "Assets/Resources/TestURPLitMaterial2.mat" }, failList);// 遍歷刪除失敗的資源列表,并輸出到控制臺for (int i = 0; i < failList.Count; i++){Debug.Log(failList[i]);}}}
}
效果
7、獲取資源路徑
7.1 API
AssetDatabase.GetAssetPath(資源)
注意:
- 可以配合
Selection
選中資源一起使用
7.2 示例
using UnityEditor;
using UnityEngine;public class TestAssetDatabaseEditorWindow : EditorWindow
{[MenuItem("編輯器拓展/自定義窗口拓展/AssetDatabase窗口拓展")]private static void OpenWindow(){TestAssetDatabaseEditorWindow win = EditorWindow.GetWindow<TestAssetDatabaseEditorWindow>();win.Show();}private void OnGUI(){// 獲取資源路徑按鈕if (GUILayout.Button("獲取資源路徑")){// 輸出當前選中的資源的路徑Debug.Log(AssetDatabase.GetAssetPath(Selection.activeObject));}}
}
效果
8、根據路徑加載資源
8.1 API
AssetDatabase.LoadAssetAtPath(資源路徑)
注意:
- 路徑從
Assets/...
開始
8.2 示例
using UnityEditor;
using UnityEngine;public class TestAssetDatabaseEditorWindow : EditorWindow
{[MenuItem("編輯器拓展/自定義窗口拓展/AssetDatabase窗口拓展")]private static void OpenWindow(){TestAssetDatabaseEditorWindow win = EditorWindow.GetWindow<TestAssetDatabaseEditorWindow>();win.Show();}private void OnGUI(){// 加載資源按鈕if (GUILayout.Button("加載資源")){// 加載Assets/測試文件.txt,并輸出其名稱TextAsset txt = AssetDatabase.LoadAssetAtPath<TextAsset>("Assets/測試文件.txt");Debug.Log(txt.name);}}
}
效果
9、刷新項目資源
9.1 API
AssetDatabase.Refresh()
是Unity編輯器API中的一個重要方法,用于刷新項目資源數據庫。當你在Unity項目文件夾中添加、刪除或修改資源文件時,這個方法可以確保Unity編輯器能夠識別這些更改。
AssetDatabase.Refresh()
Unity通常會自動在適當時候調用刷新,但有時需要手動觸發。比如當你通過代碼創建或修改了資源文件,需要執行刷新,我們才能在Project窗口中顯示最新的內容,否則每次都需要手動調用ctrl+R
刷新,這個API其實就是幫我們省略手動刷新這一步。
9.2 示例
using System.IO;
using UnityEditor;
using UnityEngine;public class TestAssetDatabaseEditorWindow : EditorWindow
{[MenuItem("編輯器拓展/自定義窗口拓展/AssetDatabase窗口拓展")]private static void OpenWindow(){TestAssetDatabaseEditorWindow win = EditorWindow.GetWindow<TestAssetDatabaseEditorWindow>();win.Show();}private void OnGUI(){// 創建文件并刷新資源按鈕if (GUILayout.Button("創建文件并刷新資源")){// 創建文件時,如果不使用Unity相關API的話,需要調用刷新,才能在Project窗口中顯示File.WriteAllText(Application.dataPath + "/Resources/test2.txt", "內容內容內容");AssetDatabase.Refresh();}}
}
效果
10、返回資源所屬的AB包名
10.1 API
string bundleName = AssetDatabase.GetImplicitAssetBundleName(資源路徑);
注意:
- 路徑從
Assets/...
開始 - 返回該資源隱式關聯的AssetBundle名稱(如果有的話)
- 如果資源沒有被分配到任何AssetBundle,返回空字符串(“”)
10.2 示例
using UnityEditor;
using UnityEngine;public class TestAssetDatabaseEditorWindow : EditorWindow
{[MenuItem("編輯器拓展/自定義窗口拓展/AssetDatabase窗口拓展")]private static void OpenWindow(){TestAssetDatabaseEditorWindow win = EditorWindow.GetWindow<TestAssetDatabaseEditorWindow>();win.Show();}private void OnGUI(){// 返回資源所屬的AB包名按鈕if (GUILayout.Button("返回資源所屬的AB包名")){string assetPath = "Assets/Resources/MyPrefab.prefab";string bundleName = AssetDatabase.GetImplicitAssetBundleName(assetPath);if (!string.IsNullOrEmpty(bundleName)){Debug.Log($"資源 {assetPath} 屬于AssetBundle: {bundleName}");}else{Debug.Log($"資源 {assetPath} 不屬于任何AssetBundle");}}}
}
效果
二、最終代碼
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;public class TestAssetDatabaseEditorWindow : EditorWindow
{[MenuItem("編輯器拓展/自定義窗口拓展/AssetDatabase窗口拓展")]private static void OpenWindow(){TestAssetDatabaseEditorWindow win = EditorWindow.GetWindow<TestAssetDatabaseEditorWindow>();win.Show();}private void OnGUI(){// 創建資源按鈕if (GUILayout.Button("創建資源")){// 創建一個材質,使用URP的Lit著色器Material mat = new Material(Shader.Find("Universal Render Pipeline/Lit"));// 將材質保存為Assets/Resources/TestURPLitMaterial.matAssetDatabase.CreateAsset(mat, "Assets/Resources/TestURPLitMaterial.mat");}// 創建文件夾按鈕if (GUILayout.Button("創建文件夾")){// 在Assets/Resources下創建一個名為MyTestFolder的文件夾AssetDatabase.CreateFolder("Assets/Resources", "MyTestFolder");}// 拷貝資源按鈕if (GUILayout.Button("拷貝資源")){// 將Assets/Resources/TestURPLitMaterial.mat拷貝到Assets/Resources/MyTestFolder/TestURPLitMaterialCopy.matAssetDatabase.CopyAsset("Assets/Resources/TestURPLitMaterial.mat", "Assets/Resources/MyTestFolder/TestURPLitMaterialCopy.mat");}// 移動資源按鈕if (GUILayout.Button("移動資源")){// 將Assets/Resources/MyTestFolder/TestURPLitMaterialCopy.mat移動到Assets/Resources/TestURPLitMaterialCopy.matAssetDatabase.MoveAsset("Assets/Resources/MyTestFolder/TestURPLitMaterialCopy.mat","Assets/Resources/TestURPLitMaterialCopy.mat");}// 刪除資源按鈕if (GUILayout.Button("刪除資源")){// Assets/Resources/TestURPLitMaterialCopy.matAssetDatabase.DeleteAsset("Assets/Resources/TestURPLitMaterialCopy.mat");}// 批量刪除資源按鈕if (GUILayout.Button("批量刪除資源")){// 創建一個列表,用于存儲刪除失敗的資源List<string> failList = new List<string>();// 批量刪除Assets/Resources/TestURPLitMaterial.mat和Assets/Resources/TestURPLitMaterial2.matAssetDatabase.DeleteAssets(new string[] { "Assets/Resources/TestURPLitMaterial.mat", "Assets/Resources/TestURPLitMaterial2.mat" }, failList);// 遍歷刪除失敗的資源列表,并輸出到控制臺for (int i = 0; i < failList.Count; i++){Debug.Log(failList[i]);} }// 獲取資源路徑按鈕if (GUILayout.Button("獲取資源路徑")){// 輸出當前選中的資源的路徑Debug.Log(AssetDatabase.GetAssetPath(Selection.activeObject));}// 加載資源按鈕if (GUILayout.Button("加載資源")){// 加載Assets/測試文件.txt,并輸出其名稱TextAsset txt = AssetDatabase.LoadAssetAtPath<TextAsset>("Assets/測試文件.txt");Debug.Log(txt.name);}// 創建文件并刷新資源按鈕if (GUILayout.Button("創建文件并刷新資源")){// 創建文件時,如果不使用Unity相關API的話,需要調用刷新,才能在Project窗口中顯示File.WriteAllText(Application.dataPath + "/Resources/test2.txt", "內容內容內容");AssetDatabase.Refresh();}// 返回資源所屬的AB包名按鈕if (GUILayout.Button("返回資源所屬的AB包名")){string assetPath = "Assets/Resources/MyPrefab.prefab";string bundleName = AssetDatabase.GetImplicitAssetBundleName(assetPath);if (!string.IsNullOrEmpty(bundleName)){Debug.Log($"資源 {assetPath} 屬于AssetBundle: {bundleName}");}else{Debug.Log($"資源 {assetPath} 不屬于任何AssetBundle");}}}
}
專欄推薦
地址 |
---|
【unity游戲開發入門到精通——C#篇】 |
【unity游戲開發入門到精通——unity通用篇】 |
【unity游戲開發入門到精通——unity3D篇】 |
【unity游戲開發入門到精通——unity2D篇】 |
【unity實戰】 |
【制作100個Unity游戲】 |
【推薦100個unity插件】 |
【實現100個unity特效】 |
【unity框架/工具集開發】 |
【unity游戲開發——模型篇】 |
【unity游戲開發——InputSystem】 |
【unity游戲開發——Animator動畫】 |
【unity游戲開發——UGUI】 |
【unity游戲開發——聯網篇】 |
【unity游戲開發——優化篇】 |
【unity游戲開發——shader篇】 |
【unity游戲開發——編輯器擴展】 |
完結
好了,我是向宇
,博客地址:https://xiangyu.blog.csdn.net,如果學習過程中遇到任何問題,也歡迎你評論私信找我。
贈人玫瑰,手有余香!如果文章內容對你有所幫助,請不要吝嗇你的點贊評論和關注
,你的每一次支持
都是我不斷創作的最大動力。當然如果你發現了文章中存在錯誤
或者有更好的解決方法
,也歡迎評論私信告訴我哦!