博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Odin Inspector 系列教程 --- 初识 OdinWindow
阅读量:4147 次
发布时间:2019-05-25

本文共 4902 字,大约阅读时间需要 16 分钟。

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
().Show(); } public string Hello = "菜鸟海澜";}

混合Window

完成第一步后,我们可以根据笔者来填充这个Window了

7643202-32e1d42951ca2dc6.png
public class MyHybridEditorWindowOne : OdinEditorWindow{    [MenuItem("My Game/My Hybrid Editor")]    private static void OpenWindow()    {        GetWindow
().Show(); } [EnumToggleButtons, BoxGroup("Settings")] public ScaleMode ScaleMode; [FolderPath(RequireExistingPath = true), BoxGroup("Settings")] public string OutputPath; [HorizontalGroup(0.5f)]//占比0.5 public List
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
().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
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
().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
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
().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
().Show(); } protected override void Initialize() { this.WindowPadding = Vector4.zero; } protected override object GetTarget() { return Selection.activeObject; }}

更多教程内容详见:

转载地址:http://mijti.baihongyu.com/

你可能感兴趣的文章
7 个适用于所有前端开发人员的很棒API,你需要了解一下
查看>>
25个构建Web项目的HTML建议,你需要了解一下!
查看>>
【web素材】02-10款大气的购物商城网站模板
查看>>
6种方式实现JavaScript数组扁平化(flat)方法的总结
查看>>
49个在工作中常用且容易遗忘的CSS样式清单整理
查看>>
20种在学习编程的同时也可以在线赚钱的方法
查看>>
隐藏搜索框:CSS 动画正反向序列
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(上)
查看>>
【视频教程】Javascript ES6 教程27—ES6 构建一个Promise
查看>>
【5分钟代码练习】01—导航栏鼠标悬停效果的实现
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(中)
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(下)
查看>>
【web素材】03-24款后台管理系统网站模板
查看>>
Flex 布局教程:语法篇
查看>>
年薪50万+的90后程序员都经历了什么?
查看>>
2019年哪些外快收入可达到2万以上?
查看>>
【JavaScript 教程】标准库—Date 对象
查看>>
前阿里手淘前端负责人@winter:前端人如何保持竞争力?
查看>>
【JavaScript 教程】面向对象编程——实例对象与 new 命令
查看>>
我在网易做了6年前端,想给求职者4条建议
查看>>