Odin Inspector教程 | (三)自定义编辑器窗口

📂 Unity 开发资源汇总 | 插件 | 模型 | 源码

💓 欢迎访问 Unity 打怪升级大本营

💯 系列教程索引

📄(一)开始使用Odin Inspector
📄(二)使用 Attributes(特性)
📄(三)自定义编辑器窗口
📄(四)创建自定义 Drawers(抽屉)
📄(五)使用自定义特性处理器(Attribute Processors)
📄(六)Value解析器 和 Action解析器

Odin Inspector是Unity的一个插件,让您可以享受拥有强大,自定义和用户友好编辑器的所有工作流程优势,而无需编写任何自定义编辑器代码。

Odin包含许多功能,例如Static Inspector,Project Validation,Odin Editor Windows和开源的Odin Serializer,它允许您在需要多态对象结构时扩展Unity的序列化功能,或者希望在运行时序列化和反序列化数据。

在这里插入图片描述

Odin Inspector and Serializer 最新版 (0积分)免费下载

华丽的分割线


标题1

💯 引言

Unity的编辑器扩展能力是其强大功能之一,而Odin Inspector作为Unity编辑器的一个扩展,提供了更高级的自定义选项,允许开发者创建定制化的编辑器窗口。这些编辑器窗口不仅可以用于优化自己的工作流程,还可以作为工具提供给团队成员或作为插件发布给社区。


标题2

💯 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。


标题3

💯 如何制作 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。


标题4

💯 Odin 下载地址

Odin Inspector and Serializer 最新版 (0积分)免费下载


《Odin Inspector 系列教程》文章索引:
📄(一)开始使用Odin Inspector
📄(二)使用 Attributes(特性)
📄(三)自定义编辑器窗口
📄(四)创建自定义 Drawers(抽屉)
📄(五)使用自定义特性处理器(Attribute Processors)
📄(六)Value解析器 和 Action解析器


TheEnd


跳跃

📂 Unity 开发资源汇总 | 插件 | 模型 | 源码

💓 欢迎访问 Unity 打怪升级大本营

🍉🍉🍉 如果觉得这篇文对你有帮助的话,请点个赞👍、收藏⭐️下吧,非常感谢! 💕💕💕
关注我

博主头像
【博主简介】:10年以上软件开发经验,精通 C语言C++C#Java 等开发语言,开发过大型 Android 项目,现主要自主开发经营 休闲益智类小游戏

【粉丝福利】:博主收藏了大量游戏开发资源和素材。这些资源经过博主多年整理沉淀,现筛选一批精品资源,分享给大家学习研究。

Unity打怪军团 广招天下勇士加入 Unity学习互助小组 需要进群的同学联系我,互3互推也请联系我…
联系我

### 回答1: Odin Inspector是一个强大的Unity3D插件,用于增强Unity编辑器中的开发工作流程。它提供了许多易于使用并高度可定制的特性,可以帮助开发人员更高效地创建、修改和管理Unity中的各种组件和属性。 使用Odin Inspector,开发人员可以轻松定义自己的自定义编辑器窗口和面板,以便更直观地管理和编辑游戏对象的属性和参数。这个插件提供了许多内置的属性修饰符和布局工具,使得在编辑器中创建复杂的、高度定制的UI变得非常容易。 另一个重要的功能是Odin Inspector提供了一个强大的序列化系统,可以使开发人员更好地控制对象的数据和状态。通过它,开发人员可以轻松地序列化和反序列化游戏对象,方便地保存和加载游戏进度。 此外,Odin Inspector还支持自定义属性绘制器(Property Drawers),这使开发人员可以为自己的属性创建独特的外观和交互。这个功能非常有用,因为它让我们可以按照自己的需求和设计标准来呈现和修改数据。 总而言之,Odin Inspector是一个功能强大而又易于使用的插件,它有助于提高Unity游戏开发的效率和质量。通过使用它,开发人员可以更方便地管理和编辑游戏对象的属性,更好地控制对象的数据和状态,以及创建自定义的属性外观和交互。无论是个人开发者还是团队开发者,Odin Inspector都是一个非常有价值和实用的工具。 ### 回答2: Odin Inspector是一款功能强大的Unity编辑器扩展工具,它为开发者提供了一套易用的自定义属性系统,可以快速、灵活地在Unity编辑器界面中创建自定义面板,实现更高效的编辑器工作流程。 Odin Inspector具有许多强大的特性。首先,它提供了丰富多样的自定义属性,开发者可以使用这些属性来控制和限制Inspector面板中的字段和选项的显示方式。例如,可以使用Range属性来定义数值字段的取值范围,使用EnumMask属性来创建一个可多选的枚举字段等等。这样一来,开发者可以针对不同类型的数据设计出更加友好和直观的界面,提高开发效率。 其次,Odin Inspector还支持自定义编辑器面板的设置和布局。开发者可以通过添加组件来自定义编辑器窗口,重组字段的排列顺序,嵌套面板等等。这样,可以根据项目的需求,创建出更适合团队协作和开发流程的编辑器布局,提高工作效率。 另外,Odin Inspector还支持对象的序列化和反序列化操作,可以将Unity场景、Prefab和脚本中的实例数据进行持久化保存,实现数据的跨场景、跨平台、跨工程的传递和共享,方便团队合作和版本管理。 总之,Odin Inspector是一款非常强大和实用的Unity编辑器扩展工具,它可以帮助开发者更好地管理和操作Unity编辑器中的数据和功能,提高开发效率和质量。无论是单人独立开发还是团队协作,Odin Inspector都是一款非常值得尝试和使用的工具。 ### 回答3: Odin Inspector 是一个功能强大的 Unity 游戏开发工具,可用于为游戏开发者提供可视化编辑器,以加速游戏开发过程。Odin Inspector 提供了一系列强大的特性和工具,帮助开发者在 Unity 编辑器中更方便地创建、组织和调试游戏。 Odin Inspector 的主要特点包括: 1. 自定义编辑器Odin Inspector 允许开发者为自定义的 C# 类型创建自定义编辑器,以提供更简洁、直观和高效的界面。这使得开发者可以更轻松地创建各种自定义属性,并自定义属性在 Unity 编辑器中的表现形式,以满足自己的需求。 2. 序列化工具:Odin Inspector 提供了更强大的序列化工具,使得在编写和读取数据时更加灵活和高效。开发者可以自定义序列化过程,实现更精确的控制和优化。 3. 扩展性和可定制性:Odin Inspector 提供了丰富的扩展和自定义选项,使得开发者可以根据自己的项目需求进行定制。开发者可以添加自定义的属性绘制器、编辑器工具、插件等,以增加功能和改进工作流程。 4. 支持网格系统和绘制工具:Odin Inspector 提供了网格系统和各种绘制工具,帮助开发者更快速地创建和编辑游戏场景。开发者可以方便地调整对象的位置、旋转和缩放,并提供了各种网格布局和对齐工具。 总之,Odin Inspector 是一个强大而灵活的 Unity 开发工具,提供了方便的可视化编辑器,让开发者更高效地创建和调试游戏。它的自定义编辑器、序列化工具、扩展性和绘制工具等特性,大大增加了开发者的工作效率和创造力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Unity打怪升级

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值