2024-07-23 Unity插件 Odin Inspector11 —— 使用 Odin 自定义编辑窗口

文章目录

  • 1 OdinEditorWindow
    • 1.1 运作方式
    • 1.2 使用特性绘制 OdinEditorWindow
    • 1.3 在 OdinEditorWindow 中渲染对象
  • 2 OdinMenuEditorWindow
    • 2.1 添加菜单导航栏
    • 2.2 添加导航栏示例

​ Odin Window 可以完整地访问 Odin 绘图系统,不再需要操心 Window 的绘制 方式,而是专注于真正重要的事情:Window 提供的功能。

img

​ OdinWindow 分为两类:

  1. OdinEditorWindow

    用法与 Inspector 中使用特性自定义属性显示方式类似。

  2. OdinMenuEditorWindow

    能够创建具有左侧导航目录的窗口。本教程着重讲解如何创建 OdinMenuEditorWindow。

1 OdinEditorWindow

1.1 运作方式

​ 只需继承 OdinEditorWindow 类,而不是 EditorWindow ,就可以像使用 Odin Inspector 一样,在窗口中呈现字段、属性和方法,而无需编写任何自定义编辑器 GUI 代码。

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

1.2 使用特性绘制 OdinEditorWindow

​ 和 MonoBehaviour 或 ScriptableObject 一样,在 OdinEditorWindow 中对字段、属性和方法添加特性,以实现自定义绘制效果。

img
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&lt;Texture&gt; InputTextures;[HorizontalGroup, InlineEditor(InlineEditorModes.LargePreview)]public Texture Preview;[Button(ButtonSizes.Gigantic), GUIColor(0, 1, 0)]public void PerformSomeAction() { }
}

1.3 在 OdinEditorWindow 中渲染对象

​ 重写 GetTarget() 方法,并为其提供任何类型的任何实例进行呈现。它不需要可序列化,甚至不需要是 Unity 对象。

img
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;}
}

2 OdinMenuEditorWindow

2.1 添加菜单导航栏

​ 继承 OdinMenuEditorWindow 类后,需要实现其抽象方法:BuildMenuTree(),该方法用于指定窗口左侧的导航目录显示什么内容。

using Sirenix.OdinInspector.Editor;public class EnemyDataEditor : OdinMenuEditorWindow
{protected override OdinMenuTree BuildMenuTree() {throw new System.NotImplementedException();}
}

​ 添加导航目录的方法通常有 2 种:

  1. OdinMenuTree.Add(string path, object instance)

    直接在导航目录中绘制某个对象。

    • path:导航栏名称。
    • instance:右侧绘制的对象。
  2. OdinMenuTree.AddAllAssetsAtPath( string menuPath, string assetFolderPath, Type type, bool includeSubDirectories = false, bool flattenSubDirectories = false)

    在导航目录中绘制某个目录下所有类型为 type 的对象。

    • menuPath:导航栏名称。
    • assetFolderPath:选择的目录。
    • type:对象类型。
    • includeSubDirectories:是否在子目录中也寻找对象。
    • flattenSubDirectories:如果为 true,选择的对象将不会在左侧菜单栏中依据目录折叠显示。
img
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;// 方法 1tree.Add("Settings", GeneralDrawerConfig.Instance); tree.Add("Utilities", new TextureUtilityEditor());// 方法 2tree.AddAllAssetsAtPath("Odin Settings", "Assets/Plugins/Sirenix", typeof(ScriptableObject), true, true);return tree;}
}public class TextureUtilityEditor
{[BoxGroup("Tool"), HideLabel, EnumToggleButtons]public Tool Tool;public List&lt;Texture&gt; Textures;[Button(ButtonSizes.Large), HideIf("Tool", Tool.Rotate)]public void SomeAction() { }[Button(ButtonSizes.Large), ShowIf("Tool", Tool.Rotate)]public void SomeOtherAction() { }
}

2.2 添加导航栏示例

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;OdinMenuTree tree = new OdinMenuTree(supportsMultiSelect: true) {{ "Home", this, EditorIcons.House },{ "Odin Settings", null, SdfIconType.GearFill },{ "Odin Settings/ Color Palettes", ColorPaletteManager.Instance, EditorIcons.EyeDropper  },{ "Odin Settings/ AOT Generation", AOTGenerationConfig.Instance, EditorIcons.SmartPhone  },{ "Camera current", Camera.current },{ "Some Class", this.someData }};tree.AddAllAssetsAtPath("Some Menu Item", "Some Asset Path", typeof(ScriptableObject), true).AddThumbnailIcons();tree.AddAssetAtPath("Some Second Menu Item", "SomeAssetPath/ SomeAssetFile. asset");var customMenuItem = new OdinMenuItem(tree, "Menu Style", tree.DefaultMenuStyle);tree.MenuItems.Insert(2, customMenuItem);tree.Add("Menu/ Items/ Are/ Created/ As/ Needed", new GUIContent());tree.Add("Menu/ Items/ Are/ Created", new GUIContent("And can be overridden"));return tree;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/874889.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BGP选路之Local Preference

原理概述 当一台BGP路由器中存在多条去往同一目标网络的BGP路由时&#xff0c;BGP协议会对这些BGP路由的属性进行比较&#xff0c;以确定去往该目标网络的最优BGP路由。BGP首先比较的是路由信息的首选值&#xff08;PrefVal)&#xff0c;如果 PrefVal相同&#xff0c;就会比较本…

全方位了解智慧校园行政办公的新闻管理功能

在智慧校园的日常运营中&#xff0c;行政办公系统中的新闻公告功能犹如一座沟通的桥梁&#xff0c;连接着校园内外的每一个角落&#xff0c;传递着最新的资讯与动态。它不仅是智慧校园信息发布的平台&#xff0c;更是校园文化与精神风貌的展现窗口&#xff0c;对于增强师生的凝…

JavaWeb(4)JavaScript入门2—— JS的对象和JSON

一、JS的对象 1.声明语法1 通过new Object()直接创建对象 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><ti…

C#与C++交互开发系列(三):深入探讨P/Invoke基础知识

欢迎来到C#与C交互开发系列的第三篇。在这篇博客中&#xff0c;我们将深入探讨P/Invoke&#xff08;Platform Invocation Services&#xff09;的基础知识。P/Invoke是C#调用非托管代码的一种机制&#xff0c;能够让C#直接调用C编写的动态链接库&#xff08;DLL&#xff09;中的…

外六角半螺纹螺丝主要应用领域

外六角半螺纹螺丝&#xff0c;作为一种常见的紧固件&#xff0c;因其独特的设计和多样的功能而在多个工业领域中占据着重要的地位。这种螺丝的一端具有完整的螺纹&#xff0c;而另一端则可能没有螺纹或螺纹较短&#xff0c;这样的设计使其在某些应用场景中具有独特的优势。 应用…

MySQL入门学习-SQL高级技巧.CTE和递归查询

在 MySQL 中&#xff0c;SQL 高级技巧包括了 Common Table Expressions&#xff08;CTE&#xff09;和递归查询等。 一、CTE&#xff08;Common Table Expressions&#xff0c;公共表表达式&#xff09;的概念&#xff1a; CTE 是一个临时的结果集&#xff0c;它可以在一个查询…

docker文件挂载和宿主主机文件的关系

一、背景 在排查docker日志时发现在读取docker的文件时找不到文件&#xff0c;在宿主主机上可以查到对应的文件。这里就要理解docker文件目录和宿主主机上的文件的关系。 二、Docker文件系统和宿主系统 Docker文件和宿主文件之间的关系主要体现在Docker容器的运行环境中。Docke…

【目录】8051汇编与C语言系列教程

8051汇编与C语言系列教程 作者将狼才鲸创建日期2024-07-23 CSDN文章地址&#xff1a;【目录】8051汇编与C语言系列教程本Gitee仓库原始地址&#xff1a;才鲸嵌入式/8051_c51_单片机从汇编到C_从Boot到应用实践教程 一、本教程目录 序号教程名称简述教程链接1点亮LCD灯通过IO…

【分布式锁】Redission实现分布式锁

接着上一节&#xff0c;我们遇到了超卖的问题&#xff0c;并通过Redis实现分布式锁&#xff0c;进行了解决。本节 我将换一种方式实现分布式锁。 前提&#xff1a; nginx、redis、nacos 模块1&#xff1a; provider-and-consumer 端口 8023 模块2 rabbitmq-consumer 端口 8021 …

应用平台DDOS攻击如何解决

应用平台DDOS攻击如何解决&#xff1f;在开发并运营应用平台的征途中&#xff0c;我深知稳定与安全是通往成功的两大基石。随着业务的不断增长&#xff0c;我们也遭遇了网络世界中最令人头疼的挑战之一——DDoS攻击。这段经历让我深刻体会到&#xff0c;拥有一个可靠的高防IP服…

微服务常用的中间件有哪些?都有什么用途?

前言 最近整理一下我们的项目使用了哪些中间件&#xff0c;借此机会也来分享一下&#xff0c;在微服务架构中我们常用的那些中间件&#xff0c;都有什么作用&#xff0c;为什么要使用中间件。 消息中间件-RocketMQ 比如RocketMQ&#xff0c;RocketMQ 是一个开源的分布式消息…

成都云飞浩容文化传媒有限公司电商服务新领航者

在电商的海洋里&#xff0c;无数企业如同繁星般闪烁&#xff0c;但其中有一颗璀璨的明星——成都云飞浩容文化传媒有限公司&#xff0c;以其专业的电商服务和独特的创新理念&#xff0c;成为行业的佼佼者。今天&#xff0c;就让我们一起走进云飞浩容&#xff0c;探索这家公司的…

# Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型

Redis 入门到精通&#xff08;八&#xff09;-- 服务器配置-redis.conf配置与高级数据类型 一、redis 服务器配置–redis.conf 配置 1、服务器端设定 1&#xff09;设置服务器以守护进程的方式运行&#xff1a; daemonize yes|no 2&#xff09;绑定主机地址&#xff1a; bin…

【防火墙】防火墙NAT、智能选路综合实验

实验拓扑 实验要求 7&#xff0c;办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 8&#xff0c;分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 9&#xff0c;多出口环境基于带宽比例进行选路…

Pod 处于 Error 状态

Error 状态说明 Pod 启动过程中发生了错误 可能原因&#xff1a; 1&#xff0c;依赖的 ConfigMap、Secret 或者 PV 等不存在 2&#xff0c;请求的资源超过了管理员设置的限制&#xff0c;比如超过了 LimitRange 等 3&#xff0c;容器无权操作集群内的资源&#xff0c;比如开启…

配置SQL Server端口

在配置SQL Server时&#xff0c;设置正确的端口是确保数据库服务器安全、高效运行的关键步骤。SQL Server的默认端口是1433&#xff0c;但在某些情况下&#xff0c;为了增强安全性或避免端口冲突&#xff0c;管理员可能会选择更改默认端口。以下将详细介绍如何在SQL Server中设…

自动驾驶AVM环视算法–更新超广角视图算法和exe测试demo

1、测试环境 opencv310vs2022 2、使用的编程语言 c和c 3、测试的demo的获取 更新&#xff1a;测试的exe程序&#xff0c;无需解压码就可以体验算法测试效果 百度网盘&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1ndDcJ6VwexZoLUyUXlwLwg 提取码&#xff1a;q1…

python-爬虫实例(1):获取京东商品评论

目录 前言 道路千万条&#xff0c;安全第一条 爬虫不谨慎&#xff0c;亲人两行泪 获取京东商品评论信息 一、实例示范 二、爬虫四步走 1.UA伪装 2.获取Url 3.发送请求 4.获取响应数据进行解析并保存 总结 前言 道路千万条&#xff0c;安全第一条 爬虫不谨慎&#xff0c;…

手机怎么恢复回收站清空的照片?2个技巧大公开(适用各类安卓机)

站在时间的边缘&#xff0c;凝视着那些即将消逝的回忆&#xff0c;心里的惆怅不断增加。我们到底该怎么恢复回收站删除的照片呢&#xff1f;请相信&#xff0c;这些回忆并未真正消失。 无论你是因为误操作还是其他原因导致回收站被清空&#xff0c;这篇文章都将为你提供有力的…

Centos7_Minimal安装Cannot find a valid baseurl for repo: base/7/x86_6

问题 运行yum报此问题 就是没网 解决方法 修改网络信息配置文件&#xff0c;打开配置文件&#xff0c;输入命令&#xff1a; vi /etc/sysconfig/network-scripts/ifcfg-网卡名字把ONBOOTno&#xff0c;改为ONBOOTyes 重启网卡 /etc/init.d/network restart 网路通了