💯 系列教程索引
📄(一)开始使用Odin Inspector
📄(二)使用 Attributes(特性)
📄(三)自定义编辑器窗口
📄(四)创建自定义 Drawers(抽屉)
📄(五)使用自定义特性处理器(Attribute Processors)
📄(六)Value解析器 和 Action解析器
Odin Inspector是Unity的一个插件,让您可以享受拥有强大,自定义和用户友好编辑器的所有工作流程优势,而无需编写任何自定义编辑器代码。
Odin包含许多功能,例如Static Inspector,Project Validation,Odin Editor Windows和开源的Odin Serializer,它允许您在需要多态对象结构时扩展Unity的序列化功能,或者希望在运行时序列化和反序列化数据。
💯 引言
Unity的编辑器扩展能力是其强大功能之一,而Odin Inspector作为Unity编辑器的一个扩展,提供了更高级的自定义选项,允许开发者创建定制化的编辑器窗口。这些编辑器窗口不仅可以用于优化自己的工作流程,还可以作为工具提供给团队成员或作为插件发布给社区。
💯 Odin编辑器窗口
无论是获取项目概览、处理大型数据集,还是创建自定义工具,制作编辑器窗口都可以大大简化和简化项目的生产工作流程。但是,随着项目的变化,保持它们的维护和相关性可能会很痛苦。
这就是 Odin Editor Windows 的用武之地。只需从单个类继承,您就可以访问整个强大的 Odin 绘图系统。您不再需要担心窗口的绘制方式,而是可以专注于真正重要的事情:它们应该提供的功能。
运作方式
通过简单地从 OdinEditorWindow 而不是 EditorWindow 继承,您可以获得在窗口中呈现字段、属性和方法的能力,而无需编写任何自定义编辑器 GUI 代码,就像使用 Odin 自定义检查器一样。
public class MyCustomEditorWindow : OdinEditorWindow
{
[MenuItem("My Game/My Editor")]
private static void OpenWindow()
{
GetWindow<MyCustomEditorWindow>().Show();
}
public string Hello;
}
使用 Attributes 来设计编辑器
使用 Attributes 设计编辑器窗口,就好像它是 MonoBehaviour 或 ScriptableObject 一样,使用 Odin 和 Unity 提供的所有 Attributes。
public class MyCustomEditorWindow : OdinEditorWindow
{
[MenuItem("My Game/My Editor")]
private static void OpenWindow()
{
GetWindow<MyCustomEditorWindow>().Show();
}
[EnumToggleButtons, BoxGroup("Settings")]
public ScaleMode ScaleMode;
[FolderPath(RequireExistingPath = true), BoxGroup("Settings")]
public string OutputPath;
[HorizontalGroup(0.5f)]
public List<Texture> InputTextures;
[HorizontalGroup, InlineEditor(InlineEditorModes.LargePreview)]
public Texture Preview;
[Button(ButtonSizes.Gigantic), GUIColor(0, 1, 0)]
public void PerformSomeAction()
{
}
}
在编辑器窗口中渲染对象
可以重写 GetTarget 方法,并为其提供任何类型的任何实例进行呈现。它不需要是可序列化的,甚至不需要是 Unity 对象 - 您可以自由地进行完全控制。
public class MyCustomEditorWindow : OdinEditorWindow
{
[MenuItem("My Game/My Editor")]
private static void OpenWindow()
{
GetWindow<MyCustomEditorWindow>().Show();
}
protected override void Initialize()
{
this.WindowPadding = Vector4.zero;
}
protected override object GetTarget()
{
return Selection.activeObject;
}
}
使用 OdinMenuEditorWindow 保持井然有序
继承自 OdinMenuEditorWindow 而不是 OdinEditorWindow,并轻松为您的项目数据构建功能强大、组织良好的编辑器概述。
public class MyCustomEditorWindow : OdinMenuEditorWindow
{
[MenuItem("My Game/My Editor")]
private static void OpenWindow()
{
GetWindow<MyCustomEditorWindow>().Show();
}
protected override OdinMenuTree BuildMenuTree()
{
var tree = new OdinMenuTree();
tree.Selection.SupportsMultiSelect = false;
tree.Add("Settings", GeneralDrawerConfig.Instance);
tree.Add("Utilities", new TextureUtilityEditor());
tree.AddAllAssetsAtPath("Odin Settings", "Assets/Plugins/Sirenix", typeof(ScriptableObject), true, true);
return tree;
}
}
public class TextureUtilityEditor
{
[BoxGroup("Tool"), HideLabel, EnumToggleButtons]
public Tool Tool;
public List<Texture> Textures;
[Button(ButtonSizes.Large), HideIf("Tool", Tool.Rotate)]
public void SomeAction() { }
[Button(ButtonSizes.Large), ShowIf("Tool", Tool.Rotate)]
public void SomeOtherAction() { }
}
自定义 OdinMenuTrees
OdinMenuTrees 非常强大和灵活。在这里,我们展示了如何轻松自定义菜单树的外观。
public class MyCustomEditorWindow : OdinMenuEditorWindow
{
[MenuItem("My Game/My Editor")]
private static void OpenWindow()
{
GetWindow<MyCustomEditorWindow>().Show();
}
protected override OdinMenuTree BuildMenuTree()
{
var tree = new OdinMenuTree();
tree.DefaultMenuStyle = OdinMenuStyle.TreeViewStyle;
tree.Add("Menu Style", tree.DefaultMenuStyle);
var allAssets = AssetDatabase.GetAllAssetPaths()
.Where(x => x.StartsWith("Assets/"))
.OrderBy(x => x);
foreach (var path in allAssets)
{
tree.AddAssetAtPath(path.Substring("Assets/".Length), path);
}
tree.EnumerateTree().AddThumbnailIcons();
return tree;
}
}
提示:如果您希望将自定义编辑器 IMGUI 代码与 Odin 绘制的编辑器混合在一起,则可以使用 OnInspectorGUI Attribute。
不应在 OdinEditorWindows 中重写 OnGUI 方法。相反,如果要注入自定义 GUI 代码,则要覆盖任一 DrawEditors 方法,或者您可以在自定义 GUI 方法上使用 OnInspectorGUI 属性。
如果出于某种原因必须重写 OnGUI 方法,请确保调用 base。OnGUI() 中。没有这个,奥丁的魔法都不起作用,你就是 基本上只剩下一个普通的 EditorWindow。
💯 如何制作 OdinEditorWindow
通过继承 OdinEditorWindow 而不是 EditorWindow,您可以采用与创建检查器完全相同的方式制作 Unity 编辑器窗口: 仅使用属性。
提示:如果您希望将自定义编辑器 IMGUI 代码与 Odin 绘制的编辑器混合在一起,则可以使用 OnInspectorGUI
Attribute。
public class SomeWindow : OdinEditorWindow
{
[MenuItem("My Game/My Window")]
private static void OpenWindow()
{
GetWindow<SomeWindow>().Show();
}
[PropertyOrder(-10)]
[HorizontalGroup]
[Button(ButtonSizes.Large)]
public void SomeButton1() { }
[HorizontalGroup]
[Button(ButtonSizes.Large)]
public void SomeButton2() { }
[HorizontalGroup]
[Button(ButtonSizes.Large)]
public void SomeButton3() { }
[HorizontalGroup]
[Button(ButtonSizes.Large), GUIColor(0, 1, 0)]
public void SomeButton4() { }
[HorizontalGroup]
[Button(ButtonSizes.Large), GUIColor(1, 0.5f, 0)]
public void SomeButton5() { }
[TableList]
public List<SomeType> SomeTableData;
}
public class SomeType
{
[TableColumnWidth(50)]
public bool Toggle;
[AssetsOnly]
public GameObject SomePrefab;
public string Message;
[TableColumnWidth(160)]
[HorizontalGroup("Actions")]
public void Test1() { }
[HorizontalGroup("Actions")]
public void Test2() { }
}
不应在 OdinEditorWindows 中重写 OnGUI 方法。相反,如果要注入自定义 GUI 代码,则要覆盖任一 DrawEditors 方法,或者您可以在自定义 GUI 方法上使用 OnInspectorGUI Attribute 。
如果出于某种原因必须重写 OnGUI 方法,请确保调用 base。OnGUI() 中。没有这个,Odin的魔法都不起作用,你就是 基本上只剩下一个普通的 EditorWindow。
💯 Odin 下载地址
《Odin Inspector 系列教程》文章索引:
📄(一)开始使用Odin Inspector
📄(二)使用 Attributes(特性)
📄(三)自定义编辑器窗口
📄(四)创建自定义 Drawers(抽屉)
📄(五)使用自定义特性处理器(Attribute Processors)
📄(六)Value解析器 和 Action解析器
🍉🍉🍉 如果觉得这篇文对你有帮助的话,请点个赞👍、收藏⭐️下吧,非常感谢! 💕💕💕
【博主简介】:10年以上软件开发经验,精通C语言
、C++
、C#
、Java
等开发语言,开发过大型 Android 项目,现主要自主开发经营 休闲益智类小游戏。
【粉丝福利】:博主收藏了大量游戏开发资源和素材。这些资源经过博主多年整理沉淀,现筛选一批精品资源,分享给大家学习研究。
Unity打怪军团 广招天下勇士加入 Unity学习互助小组 需要进群的同学联系我,互3互推也请联系我…