Odin Inspector 系列教程 — 初识 OdinWindow「建议收藏」

Odin Inspector 系列教程 — 初识 OdinWindow「建议收藏」笔者以往在使用一些插件的时候经常会看上面这种多炫酷的插件操作界面,常常羡慕不已,如今有了Odin,自己也可以简简单单的实现这些炫酷的效果了,下面笔者就带大家初识OdinWindow。创建一个Window不积跬步无以至千里,我们先从最简单的创建一个Window开始,只需要自定义一类并继承OdinEditorWindow即可publiccl…

大家好,又见面了,我是你们的朋友全栈君。

7643202-b44ad2fad1f68038.gif

笔者以往在使用一些插件的时候经常会看上面这种多炫酷的插件操作界面,常常羡慕不已,如今有了Odin,自己也可以简简单单的实现这些炫酷的效果了,下面笔者就带大家初识OdinWindow。

创建一个Window

不积跬步无以至千里,我们先从最简单的创建一个Window开始,只需要自定义一类并继承OdinEditorWindow即可

7643202-f4ea072b2d31e852.gif

public class MySimpleEditorWindow : OdinEditorWindow
{
    [MenuItem("My Game/My Simple Editor")]
    private static void OpenWindow()
    {
        GetWindow<MySimpleEditorWindow>().Show();
    }

    public string Hello = "菜鸟海澜";
}

混合Window

完成第一步后,我们可以根据笔者Odin主页中的特性来填充这个Window了

7643202-32e1d42951ca2dc6.png

public class MyHybridEditorWindowOne : OdinEditorWindow
{
    [MenuItem("My Game/My Hybrid Editor")]
    private static void OpenWindow()
    {
        GetWindow<MyHybridEditorWindowOne>().Show();
    }

    [EnumToggleButtons, BoxGroup("Settings")]
    public ScaleMode ScaleMode;

    [FolderPath(RequireExistingPath = true), BoxGroup("Settings")]
    public string OutputPath;

    
    [HorizontalGroup(0.5f)]//占比0.5
    public List<Texture> InputTextures;

    [HorizontalGroup, InlineEditor(InlineEditorModes.LargePreview)]
    public Texture Preview;

    [Button(ButtonSizes.Gigantic), GUIColor(0, 1, 0)]
    public void PerformSomeAction()
    {

    }
}
7643202-5d5d548b5e5a018d.png

using Sirenix.OdinInspector;
using Sirenix.OdinInspector.Editor;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;


/*
 * 通过从OdinEditorWindow而不是EditorWindow继承,您可以使Unity编辑器窗口的方式与创建检查器的方式完全相同:仅使用属性。

提示:您可以使用 OnInspectorGUI 属性,如果您希望将自定义编辑器IMGUI代码与Odin绘制的编辑器混合使用
 */
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() { }
}

使用OdinMenuEditorWindow保持井井有条

7643202-ce001b99c4b6a2db.gif

这个就厉害了,一个Window集成数个功能,让每个功能以菜单的形式进行选择并显示。
这里需要注意的是,这次并不是继承OdinEditorWindow,而是继承OdinMenuEditorWindow,并使用OdinMenuTree中的AddAddAllAssetsAtPath函数添加菜单

  • Add: 设置菜单名称并传入对应需要渲染的类
  • AddAllAssetsAtPath:设置菜单名称,传入路径,示例中的第一个bool是指是否包含子路径,第二bool表示是否子路径的所有可用类都在一个层级中渲染。选择false就是下面这种形式
    7643202-5207e294828f2eb3.png

using Sirenix.OdinInspector;
using Sirenix.OdinInspector.Editor;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;

public class MyMenuEditorWindow : OdinMenuEditorWindow
{
    [MenuItem("My Game/My Menu Editor")]
    private static void OpenWindow()
    {
        GetWindow<MyMenuEditorWindow>().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

7643202-2538956279aa0cf5.png

public class MyTreeEditorWindow : OdinMenuEditorWindow
{
    [MenuItem("My Game/My Tree Editor")]
    private static void OpenWindow()
    {
        GetWindow<MyTreeEditorWindow>().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;
    }
}

在编辑器窗口中渲染实例对象

您可以覆盖GetTarget方法,并给它任何类型的实例来呈现。

7643202-5ec1da8b40e6b6ae.png

public class MyTargetEditorWindow : OdinEditorWindow
{
    [MenuItem("My Game/My Target Editor")]
    private static void OpenWindow()
    {
        GetWindow<MyTargetEditorWindow>().Show();
    }

    protected override void Initialize()
    {
        this.WindowPadding = Vector4.zero;
    }

    protected override object GetTarget()
    {
        return Selection.activeObject;
    }
}

更多教程内容详见:革命性Unity 编辑器扩展工具 — Odin Inspector 系列教程

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/162785.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • BeanUtils工具类常用方法「建议收藏」

    BeanUtils工具类常用方法「建议收藏」        BeanUtils是Apachecommons组件的成员之一,主要用于简化JavaBean封装数据的操作。它可以给JavaBean封装一个字符串数据,也可以将一个表单提交的所有数据封装到JavaBean中。使用第三方工具,需要导入jar包:BeanUtils工具常用工具类有两个:BeanUtils、ConvertUtils。BeanUtils用于封装数据,ConvertUti…

    2025年10月25日
    3
  • c语言中uint8_uint16转uint8

    c语言中uint8_uint16转uint8C++的基础数据类型:名称字节长度取值范围bool1false,truechar1-128~127signedchar1-128~127unsignedchar10~255short(signedshort)2-215~215-1unsignedshort20~216-1int(signedin…

    2022年9月15日
    4
  • rabbitmq优先级队列_rabbitmq主从模式

    rabbitmq优先级队列_rabbitmq主从模式优先级队列:此队列中的消息可以拥有优先级属性,在发送有优先级属性的消息到此队列时,优先级属性能够生效。优先级高的消息得以提早消费,消息优先级的最大值由队列的属性决定。超出队列的最大值按最大值算。Map<String,Object>priority=newHashMap<String,Object>();priority.put(“x-max-priority…

    2022年9月23日
    5
  • Text Justification — LeetCode

    Text Justification — LeetCode

    2022年1月7日
    37
  • 关于使用XLSTransformer.transformXLS导出Excel表格中遇到的问题

    关于使用XLSTransformer.transformXLS导出Excel表格中遇到的问题1.需求:最近拿到的一个任务,是将订单列表导出,按照订单列表导出(包括筛选条件)。背景:由于原本的订单列表查询代码太过繁重,里面夹杂的逻辑较多,再有一个是自己想尽快的熟悉公司的业务。于是决定,自己按照原本的样子重新写一个查询的逻辑。历程:原本以为这个功能会比较简单,用不了几天。原本打算用4天把这个需求搞定。结果,到今天结束用了10天。这大大的超出了我的预估。这也有开发系统故障的原因,导…

    2022年7月24日
    7
  • 基于MVP架构设计ASP.Net的应用研究

    基于MVP架构设计ASP.Net的应用研究

    2021年7月26日
    56

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号