2024-07-15 Unity插件 Odin Inspector3 —— Button Attributes
文章目录
- 1 说明
- 2 Button 特性
- 2.1 Button
- 2.2 ButtonGroup
- 2.3 EnumPaging
- 2.4 EnumToggleButtons
- 2.5 InlineButton
- 2.6 ResponsiveButtonGroup
1 说明
本文介绍 Odin Inspector 插件中有关 Button 特性的使用方法。
2 Button 特性
2.1 Button
依据方法,在 Inspector 窗口上生成可点击的按钮。点击一次,方法执行一次。
-
无参方法
-
string name按钮名称,默认为方法名。
-
ButtonSizes buttonSize按钮大小(枚举)。
-
ButtonStyle parameterBtnStyle按钮样式。
-
int buttonSize按钮自定义大小。
-
SdfIconType icon按钮图标。
-
IconAlignment iconAlignment按钮图标对齐方式。
-
// ButtonExamplesComponent.csusing Sirenix.OdinInspector;
using UnityEngine;public class ButtonExamplesComponent : MonoBehaviour
{public string ButtonName = "Dynamic button name";public bool Toggle;[Button("$ButtonName")]private void DefaultSizedButton() {this.Toggle = !this.Toggle;}[Button("@\"Expression label: \" + DateTime.Now.ToString(\"HH:mm:ss\")")]public void ExpressionLabel() {this.Toggle = !this.Toggle;}[Button("Name of button")]private void NamedButton() {this.Toggle = !this.Toggle;}[Button(ButtonSizes.Small)]private void SmallButton() {this.Toggle = !this.Toggle;}[Button(ButtonSizes.Medium)]private void MediumSizedButton() {this.Toggle = !this.Toggle;}[DisableIf("Toggle")][HorizontalGroup("Split", 0.5f)][Button(ButtonSizes.Large), GUIColor(0.4f, 0.8f, 1)]private void FanzyButton1() {this.Toggle = !this.Toggle;}[HideIf("Toggle")][VerticalGroup("Split/right")][Button(ButtonSizes.Large), GUIColor(0, 1, 0)]private void FanzyButton2() {this.Toggle = !this.Toggle;}[ShowIf("Toggle")][VerticalGroup("Split/right")][Button(ButtonSizes.Large), GUIColor(1, 0.2f, 0)]private void FanzyButton3() {this.Toggle = !this.Toggle;}[Button(ButtonSizes.Gigantic)]private void GiganticButton() {this.Toggle = !this.Toggle;}[Button(90)]private void CustomSizedButton() {this.Toggle = !this.Toggle;}[Button(Icon = SdfIconType.Dice1Fill, IconAlignment = IconAlignment.LeftOfText)]private void IconButton01() {this.Toggle = !this.Toggle;}[Button(Icon = SdfIconType.Dice2Fill, IconAlignment = IconAlignment.LeftOfText)]private void IconButton02() {this.Toggle = !this.Toggle;}
}
-
有参方法
-
bool Expanded = false如果按钮包含参数,可通过将其设置为 true 来禁用折叠显示。
-
// ButtonWithParametersExamplesComponent.csusing Sirenix.OdinInspector;
using UnityEngine;public class ButtonWithParametersExamplesComponent : MonoBehaviour
{[Button]private void Default(float a, float b, GameObject c) { }[Button]private void Default(float t, float b, float[] c) { }[Button(ButtonSizes.Medium, ButtonStyle.FoldoutButton)]private int FoldoutButton(int a = 2, int b = 2) {return a + b;}[Button(ButtonSizes.Medium, ButtonStyle.FoldoutButton)]private void FoldoutButton(int a, int b, ref int result) {result = a + b;}[Button(ButtonStyle.Box)]private void Full(float a, float b, out float c) {c = a + b;}[Button(ButtonSizes.Large, ButtonStyle.Box)]private void Full(int a, float b, out float c) {c = a + b;}[Button(ButtonStyle.CompactBox, Expanded = true)]private void CompactExpanded(float a, float b, GameObject c) { }[Button(ButtonSizes.Medium, ButtonStyle.Box, Expanded = true)]private void FullExpanded(float a, float b) { }
}
2.2 ButtonGroup
将 Button 分组显示。
string group = "_DefaultGroup"组名。
float order = 0.0f顺序。
int ButtonHeight按钮组中所有按钮的高度。
// ButtonGroupExamplesComponent.csusing System;
using Sirenix.OdinInspector;
using UnityEngine;public class ButtonGroupExamplesComponent : MonoBehaviour
{public IconButtonGroupExamples iconButtonGroupExamples;[ButtonGroup]private void A() { }[ButtonGroup]private void B() { }[ButtonGroup]private void C() { }[ButtonGroup]private void D() { }[Button(ButtonSizes.Large)][ButtonGroup("My Button Group")]private void E() { }[GUIColor(0, 1, 0)][ButtonGroup("My Button Group")]private void F() { }[Serializable, HideLabel]public struct IconButtonGroupExamples{[ButtonGroup(ButtonHeight = 25), Button(SdfIconType.ArrowsMove, "")]void ArrowsMove() { }[ButtonGroup, Button(SdfIconType.Crop, "")]void Crop() { }[ButtonGroup, Button(SdfIconType.TextLeft, "")]void TextLeft() { }[ButtonGroup, Button(SdfIconType.TextRight, "")]void TextRight() { }[ButtonGroup, Button(SdfIconType.TextParagraph, "")]void TextParagraph() { }[ButtonGroup, Button(SdfIconType.Textarea, "")]void Textarea() { }}
}
可以与 TitleGroup 组合使用。
// BigTitleGroupExampleComponent.cs
using Sirenix.OdinInspector;
using UnityEngine;public class BigTitleGroupExampleComponent : MonoBehaviour
{[BoxGroup("Titles", ShowLabel = false)][TitleGroup("Titles/First Title")]public int A;[BoxGroup("Titles/Boxed")][TitleGroup("Titles/Boxed/Second Title")]public int B;[TitleGroup("Titles/Boxed/Second Title")]public int C;[TitleGroup("Titles/Horizontal Buttons")][ButtonGroup("Titles/Horizontal Buttons/Buttons")]public void FirstButton() { }[ButtonGroup("Titles/Horizontal Buttons/Buttons")]public void SecondButton() { }
}
2.3 EnumPaging
为枚举添加“下一步”和“上一步”按钮选择器,循环查看枚举属性的可用值。
// EnumPagingExamplesComponent.csusing Sirenix.OdinInspector;
using UnityEngine;public class EnumPagingExamplesComponent : MonoBehaviour
{[EnumPaging]public SomeEnum SomeEnumField;public enum SomeEnum{A, B, C}#if UNITY_EDITOR // UnityEditor.Tool is an editor-only type, so this example will not work in a build[EnumPaging, OnValueChanged("SetCurrentTool")][InfoBox("Changing this property will change the current selected tool in the Unity editor.")]public UnityEditor.Tool sceneTool;private void SetCurrentTool() {UnityEditor.Tools.current = this.sceneTool;}
#endif
}
2.4 EnumToggleButtons
在水平按钮组中绘制枚举,而不是下拉列表。
// EnumToggleButtonsExamplesComponent.csusing Sirenix.OdinInspector;
using UnityEngine;public class EnumToggleButtonsExamplesComponent : MonoBehaviour
{[Title("Default")]public SomeBitmaskEnum DefaultEnumBitmask;[Title("Standard Enum")][EnumToggleButtons]public SomeEnum SomeEnumField; // 单选枚举[EnumToggleButtons, HideLabel]public SomeEnum WideEnumField; // 单选枚举[Title("Bitmask Enum")][EnumToggleButtons]public SomeBitmaskEnum BitmaskEnumField; // 多选枚举[EnumToggleButtons, HideLabel]public SomeBitmaskEnum EnumFieldWide; // 多选枚举[Title("Icon Enum")][EnumToggleButtons, HideLabel]public SomeEnumWithIcons EnumWithIcons;[EnumToggleButtons, HideLabel]public SomeEnumWithIconsAndNames EnumWithIconsAndNames;public enum SomeEnum{First, Second, Third, Fourth, AndSoOn}public enum SomeEnumWithIcons{[LabelText(SdfIconType.TextLeft)] TextLeft,[LabelText(SdfIconType.TextCenter)] TextCenter,[LabelText(SdfIconType.TextRight)] TextRight,}public enum SomeEnumWithIconsAndNames{[LabelText("Align Left", SdfIconType.TextLeft)]TextLeft,[LabelText("Align Center", SdfIconType.TextCenter)]TextCenter,[LabelText("Align Right", SdfIconType.TextRight)]TextRight,}[System.Flags]public enum SomeBitmaskEnum{A = 1 << 1,B = 1 << 2,C = 1 << 3,All = A | B | C}
}
2.5 InlineButton
在属性右侧绘制按钮。
string action点击按钮时执行的方法。
SdfIconType icon按钮图标。
string label = null按钮显示名称。
// InlineButtonExamplesComponent.csusing Sirenix.OdinInspector;
using UnityEngine;public class InlineButtonExamplesComponent : MonoBehaviour
{// Inline Buttons:[InlineButton("A")]public int InlineButton;[InlineButton("A")][InlineButton("B", "Custom Button Name")]public int ChainedButtons;[InlineButton("C", SdfIconType.Dice6Fill, "Random")]public int IconButton;private void A() {Debug.Log("A");}private void B() {Debug.Log("B");}private void C() {Debug.Log("C");}
}
2.6 ResponsiveButtonGroup
将按钮绘制在组内,该组将响应其可用的水平空间。
string group = "_DefaultResponsiveButtonGroup"组名。
// ResponsiveButtonGroupExampleComponent.cs
using Sirenix.OdinInspector;
using UnityEngine;#if UNITY_EDITOR // Editor namespaces can only be used in the editor.
using Sirenix.OdinInspector.Editor.Examples;
#endifpublic class ResponsiveButtonGroupExampleComponent : MonoBehaviour
{
#if UNITY_EDITOR // Editor-related code must be excluded from builds[Button(ButtonSizes.Large), GUIColor(0, 1, 0)]private void OpenDockableWindowExample(){var window = UnityEditor.EditorWindow.GetWindow<MyDockableGameDashboard>();window.WindowPadding = new Vector4();}
#endif[OnInspectorGUI] private void Space1() { GUILayout.Space(20); }[ResponsiveButtonGroup] public void Foo() { }[ResponsiveButtonGroup] public void Bar() { }[ResponsiveButtonGroup] public void Baz() { }[OnInspectorGUI] private void Space2() { GUILayout.Space(20); }[ResponsiveButtonGroup("UniformGroup", UniformLayout = true)] public void Foo1() { }[ResponsiveButtonGroup("UniformGroup")] public void Foo2() { }[ResponsiveButtonGroup("UniformGroup")] public void LongesNameWins() { }[ResponsiveButtonGroup("UniformGroup")] public void Foo4() { }[ResponsiveButtonGroup("UniformGroup")] public void Foo5() { }[ResponsiveButtonGroup("UniformGroup")] public void Foo6() { }[OnInspectorGUI] private void Space3() { GUILayout.Space(20); }[ResponsiveButtonGroup("DefaultButtonSize", DefaultButtonSize = ButtonSizes.Small)] public void Bar1() { }[ResponsiveButtonGroup("DefaultButtonSize")] public void Bar2() { }[ResponsiveButtonGroup("DefaultButtonSize")] public void Bar3() { }[Button(ButtonSizes.Large), ResponsiveButtonGroup("DefaultButtonSize")] public void Bar4() { }[Button(ButtonSizes.Large), ResponsiveButtonGroup("DefaultButtonSize")] public void Bar5() { }[ResponsiveButtonGroup("DefaultButtonSize")] public void Bar6() { }[OnInspectorGUI] private void Space4() { GUILayout.Space(20); }[FoldoutGroup("SomeOtherGroup")][ResponsiveButtonGroup("SomeOtherGroup/SomeBtnGroup")] public void Baz1() { }[ResponsiveButtonGroup("SomeOtherGroup/SomeBtnGroup")] public void Baz2() { }[ResponsiveButtonGroup("SomeOtherGroup/SomeBtnGroup")] public void Baz3() { }
}
与 TabGroup 结合使用:
// BigTabGroupExampleComponent.csusing Sirenix.OdinInspector;
using UnityEngine;public class BigTabGroupExampleComponent : MonoBehaviour
{[TitleGroup("Tabs")][HorizontalGroup("Tabs/Split", Width = 0.5f)][TabGroup("Tabs/Split/Parameters", "A")]public string NameA, NameB, NameC;[TabGroup("Tabs/Split/Parameters", "B")]public int ValueA, ValueB, ValueC;[TabGroup("Tabs/Split/Buttons", "Responsive")][ResponsiveButtonGroup("Tabs/Split/Buttons/Responsive/ResponsiveButtons")]public void Hello() { }[ResponsiveButtonGroup("Tabs/Split/Buttons/Responsive/ResponsiveButtons")]public void World() { }[ResponsiveButtonGroup("Tabs/Split/Buttons/Responsive/ResponsiveButtons")]public void And() { }[ResponsiveButtonGroup("Tabs/Split/Buttons/Responsive/ResponsiveButtons")]public void Such() { }[Button][TabGroup("Tabs/Split/Buttons", "More Tabs")][TabGroup("Tabs/Split/Buttons/More Tabs/SubTabGroup", "A")]public void SubButtonA() { }[Button][TabGroup("Tabs/Split/Buttons/More Tabs/SubTabGroup", "A")]public void SubButtonB() { }[Button(ButtonSizes.Gigantic)][TabGroup("Tabs/Split/Buttons/More Tabs/SubTabGroup", "B")]public void SubButtonC() { }
}
相关文章:
2024-07-15 Unity插件 Odin Inspector3 —— Button Attributes
文章目录 1 说明2 Button 特性2.1 Button2.2 ButtonGroup2.3 EnumPaging2.4 EnumToggleButtons2.5 InlineButton2.6 ResponsiveButtonGroup 1 说明 本文介绍 Odin Inspector 插件中有关 Button 特性的使用方法。 2 Button 特性 2.1 Button 依据方法,在 Inspec…...
根据脚手架archetype快速构建spring boot/cloud项目
1、找到archetype,并从私仓下载添加archetype到本地 点击IDEA的file,选择new project 选择maven项目,勾选create from archetype 填写archetype信息,(repository填写私仓地址) 2、选择自定义的脚手架arche…...
安灯系统在电力设备制造业中的应用效果
安灯系统作为面向制造业生产现场的专门应用软硬件系统,在电力设备制造企业中发挥着重要的作用。作为精益制造执行的核心工具,安灯系统为企业提供了快速联络生产、物料、维修、主管等部门的功能,以实时掌控和管理生产线状况,实现生…...
代码随想录打卡第二十五天
代码随想录–回溯部分 day 24 休息 day 25 回溯第三天 文章目录 代码随想录--回溯部分一、力扣93--复原IP地址二、力扣78--子集三、力扣90--子集Ⅱ 一、力扣93–复原IP地址 代码随想录题目链接:代码随想录 有效 IP 地址 正好由四个整数(每个整数位于 0…...
openharmony上传图片,并获取返回路径
适用条件: openharmony开发 4.0 release版本,对应能力API10 一直不断尝试,一会用官方提供的上传文件,一会用第三方库的axios都不行, 一会报错‘没权限,一会报错’路径错误,还有报错‘401参数错…...
git常用命令及git分支
git常用命令及git分支 git常用命令设置用户签名初始化本地库查看本地库状态将文件添加到暂存区提交到本地库查看历史记录版本穿梭 git分支什么是分支分支的好处分支的操作查看分支创建分支切换分支删除分支合并分支合并冲突 git常用命令 设置用户签名 //设置用户签名 git con…...
c# 依赖注入-服务的生命周期
在 C# 中,依赖注入服务的生命周期指的是在应用程序中管理和控制依赖项注入服务对象的生命周期的方式。常见的生命周期包括瞬态(transient)、作用域(scoped)和单例(singleton)三种。 瞬态&#…...
一站式短视频矩阵开发,高效托管!
短视频矩阵系统源码SaaS解决方案提供全面的开发服务,包括可视化视频编辑、矩阵式内容分发托管以及集成的多功能开发支持。 短视频矩阵:引爆您的数字营销革命 短视频矩阵系统是一套多功能集成解决方案,专为提升在短视频平台上的内容创作、管理…...
实践致知第16享:设置Word中某一页横着的效果及操作
一、背景需求 小姑电话说:现在有个word文档,里面有个表格太长(如下图所示),希望这一个设置成横的,其余页还是保持竖的! 二、解决方案 1、将鼠标放置在该页的最前面闪烁,然后选择“页面”》“↘…...
Leetcode—3011. 判断一个数组是否可以变为有序【中等】(__builtin_popcount()、ranges::is_sorted())
2024每日刷题(144) Leetcode—3011. 判断一个数组是否可以变为有序 O(n)复杂度实现代码 class Solution { public:bool canSortArray(vector<int>& nums) {// 二进制数位下1数目相同的元素就不进行组内排序// 只进行分组// 当前组的值若小于…...
盲盒一番赏小程序:开启惊喜之旅,探索无限创意!
在这个充满无限想象与惊喜的时代,盲盒已成为连接心灵与梦想的奇妙桥梁。为了将这份独特的乐趣与探索精神传递给每一位热爱生活、追求新鲜的你,我们自豪地推出了“盲盒一番赏”小程序——一个集创意、趣味、互动与社交于一体的盲盒新纪元,邀您…...
Linux基础知识之Linux文件系统权限
概述 文件权限控制对文件的访问可以针对文件所属用户、所属组和其他用户可以设置不同的权限权限具有优先级。user 权限覆盖 group 权限,后者覆盖 other 权限 权限:读取、写入和执行 权限 对文件的影响 对目录的影响 r (读取) 可以读取文件的内容 …...
Qt qml详细介绍
一.基本类型 QML的基本类型包括了很多不同的类型,这些类型可以用于定义用户界面元素、属性和信号。以下是一些常用的QML基本类型及其详细介绍: 数值类型:包括整数类型(int、uint、short、ushort等)和浮点数类型&#…...
深度解析:如何优雅地删除GitHub仓库中的特定commit历史
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...
JS之短路操作符
短路操作符(Short-circuit Operator)是 JavaScript 中的一个概念,这些操作符同样适用于 TypeScript,因为 TypeScript 是 JavaScript 的类型超集。短路操作符主要包括逻辑“与”(&&)和逻辑“或”&am…...
【Linux】安装PHP扩展-redis
说明 本文档是在centos7.6的环境下,安装PHP7.4之后,安装对应的PHP扩展包redis。 一、下载redis扩展 pecl官方地址:PECL :: The PHP Extension Community Library 下载的版本是:redis-5.3.7.tgz 二、安装redis扩展 1.上传 redis 压缩包到…...
内衣洗衣机怎么选?分享五款人气巅峰机型,选对不选贵
随着科技的不断发展,内衣裤洗衣机成为了家庭必备的家电之一。选择一个好的品牌对于日后的使用体验至关重要。市场上内衣洗衣机型号繁多,究竟哪个牌子好用呢?下面给大家分享五款无论是口碑还是价格,都称得上是公认好用又实惠的内衣…...
OpenMesh入门,安装,运行示例Hello World
安装 环境 win10,qt5 源码下载编译 进入OpenMesh官网OpenMesh官网 https://www.graphics.rwth-aachen.de/software/openmesh/download/ 使用cmake gui 注意:先安装qt5 使用 CMake-Gui 构建 vs 2019 项目 注意 where is the source code 是<project…...
std::env是什么库?|Python一对一教学答疑
你好,我是悦创。 std::env 是 Rust 标准库中的一个模块,提供了访问操作系统环境的功能,比如处理环境变量、程序参数等。这个模块包含了一系列的函数和类型,用于管理与程序执行环境相关的信息。以下是 std::env 模块提供的一些主要…...
Go语言--广播式并发聊天服务器
实现功能 每个客户端上线,服务端可以向其他客户端广播上线信息;发送的消息可以广播给其他在线的客户支持改名支持客户端主动退出支持通过who查找当前在线的用户超时退出 流程 变量 用户结构体 保存用户的管道,用户名以及网络地址信息 typ…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...
内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献
Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译: ### 胃肠道癌症的发病率呈上升趋势,且有年轻化倾向(Bray等人,2018&#x…...
