AssetDatabase 是 Unity 引擎中的一个编辑器类,用于在编辑器环境中管理和操作项目中的资源(Assets)。
它提供一系列静态方法,使得开发者能够在编辑器脚本中进行资源的创建、拷贝、移动、删除等操作。
在编辑器相关处都可以使用 AssetDatabase,但它属于编辑器功能,无法被打包出去,只能在 Unity 编辑器中使用。
AssetDatabase 可以在任何编辑器功能开发时使用,但为了讲解方便,这里通过一个自定义窗口来进行讲解。
using UnityEditor;
using UnityEngine;
public class Lesson42Window : EditorWindow
{
[MenuItem("Unity 编辑器拓展/Lesson42/AssetDatabase 知识讲解")]
public static void Open() {
Lesson42Window win = GetWindow<Lesson42Window>();
win.Show();
}
private void OnGUI() { }
}
public static extern void CreateAsset(UnityEngine.Object asset, string path);
// 示例:
private void OnGUI() {
if (GUILayout.Button("创建资源")) {
var mat = new Material(Shader.Find("Legacy Shaders/Specular"));
AssetDatabase.CreateAsset(mat, "Assets/Resources/MyMaterial.mat");
}
}
public static extern string CreateFolder(string parentFolder, string newFolderName);
// 示例:
private void OnGUI() {
if (GUILayout.Button("创建文件夹")) {
AssetDatabase.CreateFolder("Assets/Resources", "MyFolder");
}
}
public static extern bool CopyAsset(string path, string newPath);
// 示例:
private void OnGUI() {
if (GUILayout.Button("拷贝资源")) {
AssetDatabase.CopyAsset("Assets/Resources/MyMaterial.mat", "Assets/Resources/newMaterial.mat");
}
}
public static extern bool DeleteAsset(string path);
public static bool DeleteAssets(string[] paths, List<string> outFailedPaths);
// 示例:
private void OnGUI() {
if (GUILayout.Button("删除资源")) {
AssetDatabase.DeleteAsset("Assets/Resources/newMaterial2.mat");
}
}
public static extern string GetAssetPath(UnityEngine.Object assetObject);
// 示例:
private void OnGUI() {
if (GUILayout.Button("获取资源路径")) {
Debug.Log(AssetDatabase.GetAssetPath(Selection.activeObject));
}
}
public static T LoadAssetAtPath<T>(string assetPath) where T : UnityEngine.Object;
public static extern UnityEngine.Object[] LoadAllAssetsAtPath(string assetPath);
// 示例:
private void OnGUI() {
if (GUILayout.Button("加载资源")) {
var mat = AssetDatabase.LoadAssetAtPath<Material>("Assets/Resources/newMaterial.mat");
Debug.Log(mat.name);
}
}
路径从 Assets/… 开始。
路径需要写后缀。
LoadAllAssetsAtPath 一般可以用来加载图集资源,返回值为 Object 数据。
如果是图集,第一个为图集本身,之后的便是图集中的所有 Sprite。
public static void Refresh();
public static extern string GetImplicitAssetBundleName(string assetPath);
更多内容:https://docs.unity3d.com/ScriptReference/AssetDatabase.html
PrefabUtility 是 Unity 编辑器中的一个公共类,提供一些用于处理 Prefab(预制体或称预设体)的方法。
主要功能包括:实例化预制体、创建预制体、修改预制体等等。
using UnityEditor;
using UnityEngine;
public class Lesson44Window : EditorWindow
{
[MenuItem("Unity 编辑器拓展/Lesson44/PrefabUtility 知识讲解")]
public static void Open() {
Lesson44Window win = GetWindow<Lesson44Window>();
win.Show();
}
private void OnGUI() { }
}
public static GameObject SaveAsPrefabAsset(GameObject instanceRoot, string assetPath);
// 示例:
private void OnGUI() {
if (GUILayout.Button("动态创建预设体")) {
GameObject obj = new GameObject();
obj.AddComponent<Rigidbody>();
obj.AddComponent<BoxCollider>();
PrefabUtility.SaveAsPrefabAsset(obj, "Assets/Resources/TestObj.prefab");
DestroyImmediate(obj); // 立即删除 obj
}
}
public static GameObject LoadPrefabContents(string assetPath);
public static void UnloadPrefabContents(GameObject contentsRoot);
// 示例:
private void OnGUI() {
if (GUILayout.Button("加载预制体对象")) {
GameObject testObj = PrefabUtility.LoadPrefabContents("Assets/Resources/TestObj.prefab");
testObj.AddComponent<MeshRenderer>();
PrefabUtility.SaveAsPrefabAsset(testObj, "Assets/Resources/TestObj.prefab"); // 需要新建预制体保存
PrefabUtility.UnloadPrefabContents(testObj);
}
}
public static GameObject SavePrefabAsset(GameObject asset);
public static GameObject SavePrefabAsset(GameObject asset, out bool savedSuccessfully);
// 示例:
private void OnGUI() {
if (GUILayout.Button("修改已有预设体")) {
GameObject testObj = AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Resources/TestObj.prefab");
testObj.AddComponent<BoxCollider>();
PrefabUtility.SavePrefabAsset(testObj);
}
}
public static UnityEngine.Object InstantiatePrefab(UnityEngine.Object assetComponentOrGameObject);
// 示例:
private void OnGUI() {
if (GUILayout.Button("实例化预设体")) {
GameObject testObj = AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Resources/TestObj.prefab");
PrefabUtility.InstantiatePrefab(testObj);
}
}
更多内容:https://docs.unity3d.com/2022.3/Documentation/ScriptReference/PrefabUtility.html
EditorApplication 是 Unity 编辑器中的一个公共类,主要提供和编辑器本身相关的一些功能。
例如,编辑器事件监听(播放、暂停等)、生命周期判断(是否运行中、暂停中、编译中)、编辑器进入播放模式、退出播放模式等等。
using UnityEditor;
using UnityEngine;
public class Lesson45Window : EditorWindow
{
[MenuItem("Unity 编辑器拓展/Lesson45/EditorApplication 知识讲解")]
public static void Open() {
Lesson45Window win = GetWindow<Lesson45Window>();
win.Show();
}
private void OnEnable() {
// 添加监听事件
EditorApplication.update += ...;
}
private void OnDestroy() {
// 移除监听事件
EditorApplication.update -= ...;
}
}
监听编辑器事件
管理编辑器生命周期相关
获取 Unity 应用程序路径相关
常用方法
更多内容:
EditorApplication:https://docs.unity3d.com/2022.3/Documentation/ScriptReference/EditorApplication.html
EditorSceneManager:https://docs.unity3d.com/2022.3/Documentation/ScriptReference/SceneManagement.EditorSceneManager.html
CompilationPipeline 是 Unity 编辑器中的一个公共类,用于处理代码编译相关的操作和事件,通常使用它得知代码是否编译结束。
比如动态生成脚本时,需要在编译结束后才能使用新的脚本。
using UnityEditor;
using UnityEditor.Compilation;
using UnityEngine;
public class Lesson46Window : EditorWindow
{
[MenuItem("Unity 编辑器拓展/Lesson46/CompilationPipeline 知识讲解")]
public static void Open() {
Lesson46Window win = GetWindow<Lesson46Window>();
win.Show();
}
private void OnEnable() {
CompilationPipeline.assemblyCompilationFinished += CompilationPipeline_assemblyCompilationFinished;
CompilationPipeline.compilationFinished += CompilationPipeline_compilationFinished;
}
private void CompilationPipeline_compilationFinished(object obj) {
Debug.Log("所有程序集编译结束");
}
private void CompilationPipeline_assemblyCompilationFinished(string arg1, CompilerMessage[] arg2) {
Debug.Log("程序集名:" + arg1);
}
private void OnDestroy() {
CompilationPipeline.assemblyCompilationFinished -= CompilationPipeline_assemblyCompilationFinished;
}
}
更多内容:https://docs.unity3d.com/ScriptReference/Compilation.CompilationPipeline.html
AssetPostprocessor(资源后处理器)主要用于处理资源导入时的通用逻辑,可以通过继承该类并实现其中的一些回调方法来自定义处理资源。
一般会进行以下处理:
常用属性:
常用回调方法:
注意:如果只想对某种资源中的某些内容进行处理,可以自己加命名规则。
更多内容:https://docs.unity3d.com/ScriptReference/AssetPostprocessor.html
using UnityEditor;
using UnityEngine;
public class Lesson47 : AssetPostprocessor
{
void OnPreprocessTexture() { }
void OnPostprocessTexture(Texture2D texture) {
Debug.Log("纹理后处理回调" + texture.name);
// 设置压缩格式
EditorUtility.CompressTexture(texture, TextureFormat.ETC_RGB4, TextureCompressionQuality.Fast);
}
void OnPreprocessModel() { }
void OnPostprocessModel(GameObject obj) { }
void OnPreprocessAudio() { }
void OnPostprocessAudio(AudioClip clip) { }
}
AssetImporter(资源导入器)是特定资源类型的资源导入程序的基类,用于配置和管理资源的导入设置。
一般不会直接使用该类,而是通过使用继承它的子类来设置导入资源的相关信息。
当我们导入一个资源时,在 Inspector 窗口中进行的相关设置都是通过继承该类的子类实现的。
分类:
使用示例:
using UnityEditor;
using UnityEngine;
public class Lesson47 : AssetPostprocessor
{
void OnPreprocessTexture() {
Debug.Log("纹理设置回调" + assetPath);
// 进行导入设置
TextureImporter importer = (TextureImporter) assetImporter; // TextureImporter
importer.textureType = TextureImporterType.Sprite;
importer.mipmapEnabled = false;
}
void OnPostprocessTexture(Texture2D texture) { }
void OnPreprocessModel() {
TextureImporter importer = (ModelImporter) assetImporter; // ModelImporter
}
void OnPostprocessModel(GameObject obj) { }
void OnPreprocessAudio() {
TextureImporter importer = (AudioImporter) assetImporter; // AudioImporter
}
void OnPostprocessAudio(AudioClip clip) { }
}
更多内容:
- TextureImporter:https://docs.unity3d.com/ScriptReference/TextureImporter.html
- ModelImporter:https://docs.unity3d.com/ScriptReference/ModelImporter.html
- AudioImporter:https://docs.unity3d.com/ScriptReference/AudioImporter.html
- VideoClipImporter:https://docs.unity3d.com/ScriptReference/VideoClipImporter.html
- ScriptedImporter:https://docs.unity3d.com/ScriptReference/AssetImporters.ScriptedImporter.html