Unity---Odin Inspector

这篇具有很好参考价值的文章主要介绍了Unity---Odin Inspector。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Odin界面编辑器

记录 2312



一、Odin Inspector介绍

Odin Inspector(Version:3.1.6) 是 Unity 的一个插件,是一款可自定义的、功能强大的界面编辑器。可以使用插件自身提供的100多个插件轻松的编辑出美观的界面,让开发者更容易使用。

二、特性

1.Unity与Odin类似特性的对比

Unity也有一些特性,但涉及界面开发的并不多。而Odin作为界面编辑器,它提供了100多个特性,不过基本上都是作用与字段上的特性,同时有很多和Unity特性类似的,就界面开发来说非常的全面。
以下举例几个类似的特性对比:

1、InspectorNameAttribute 和 LabelText,字段别名显示
//Unity Attribute , 作用与枚举值,可以给枚举值起个别名
public enum unityEnum{
	[inspcetorName("a的别名")]
	a,
	[inspcetorName("b的别名")]
	b,
}
//Odin Attribute  ,给字段和枚举值个名字
 public enum odinEnum{
	[LabelText("a的别名")]
	a,
	//注意这里Odin使用$意思是使用字段D的值,但是在枚举里是不起作用的,实际上显"$D"
	[LabelText("$D")]   
	b,
}
//在Odin特性里,使用@代表引用一个方法
[LabelText("@dataTime.Now.Tostring(\"HH:mm:ss\")")]
public string D = "name:D";
2、SpaceAttribute和 PropertySpace 填充
    //Unity Space 
    [Space(10)] //只能用于字段,用于当前字段和下一字段的空白填充
    public int unitySpace;
    
    //Odin  PropertySpace
    [PropertySpace(spaceBefore:10,spaceAfter:10)]//可用于字段,可以对字段前后都进行填充,更灵活
    public int odinSpace;
    [PropertySpace(spaceBefore:40,spaceAfter:100)]//也可用于属性,可以对字段前后都进行填充,更灵活
    public int property { get; set; }
3、PropertyRange
    ///Unity Range
    [Range(0, 10)] //只能用于字段
    public int unityRange = 1;
    
    //Odin PropertyRange
    [PropertyRange(0,10)] //可用于属性
    public int odinProperRange { get; set; }
    [PropertyRange("unityRange", 10)] //也可以应用其他变量作为最大最小值,不在范围内时会有错误提示
    public int odinRange = 2;
4、Title 和Header 标题提示显示
   //Unity Header
    [Header("UnityHeader")] //仅可用于字段
    public string myTitle;
    //Odin Title
    //第一个参数为一级标题;第二个参数为二级标题;第三个参数为位置,默认靠左;第四个参数为是否加下划线,默认为true;第五个参数为是否加粗一级标题,默认为True
    [Title("myTitle", "Subtitle", titleAlignment:TitleAlignments.Centered,horizontalLine:true,bold:true)]
    public string OdinTitle1;
    //同时方法也是可以添加标题,仅限于添加按钮特性的方法
    [Title("$myTitle")][Button]
    public void OdinTitleFunc(){}

2、几个好用的Odin特性

1、DictionaryDrawerSettings 字典使用
    //DictionaryDrawerSettings
    //DictionaryDrawerSettings 有4个定义参数,KeyLabel为Key的字段文本,ValueLabel为value的字段文本
    //displayMode定义字典的展开方式,KeyColumnWidth为显示的Key的宽度
    //一般来说非可序列话的元素是无法在面板展示的,如果想要在Inspector中显示字典的格式,需要添加[ShowInInspector]或者让类继承SerializedBehaviour,
    [ShowInInspector] 
    [DictionaryDrawerSettings(KeyLabel = "Key",ValueLabel = "value",DisplayMode = DictionaryDisplayOptions.OneLine,KeyColumnWidth = 100)]
    public Dictionary<string, string> odinDic;
2、[BoxGroup]、[HorizontalGroup]和[HideIfGroup] 窗口布局
    //有相同标题的字段会放到一个“盒子”里,且盒子的名字为SomeTitle,同时ShowLabel可以控制标题是否显示
    [BoxGroup("SomeTitle",ShowLabel = false)] 
    public int a;
    [BoxGroup("SomeTitle")] 
    public int b;
    //在父级标题下加子标题,形成嵌套,就是个文件夹路径
    [BoxGroup("SomeTitle/SubTitle")] 
    public int a1;
    //[HorizontalGroup] 可以把当前子标题“box“下的所有Group水平排列,
    [HorizontalGroup("box",LabelWidth =  50)]
    [BoxGroup("box/left")] 
    public int left;
    //同时HorizontalGroup也可以进行嵌套,然后在”box/right"下的所有子Group又会是水平排列
    [HorizontalGroup("box/right",LabelWidth =  50)]
    [BoxGroup("box/right/A")]
    public int right;
    //Hide if Group,就是根据传递的值来看是否隐藏或显示当前组,
    public bool toggle = true;
    [HideIfGroup("toggle")][VerticalGroup]
    public int testHideifgroup;
3、FilePath和FolderPath 筛选文件路径
     //FilePath,打开文件路径,并把路径赋值给对应变量,支持打开文件夹自选,也支持拖拽过来
     //ParentFolder可以规定打开时的初始文件夹路径,Extensions筛选扩展名的。AbsolutePath 是否需要绝对路径,RequireExistingPath 所选路径是否存在,
     [FilePath(ParentFolder = "Assets/Plugins",Extensions = "cs",AbsolutePath = true, RequireExistingPath = true)]
     public string filePath;
     //FolderPath 是打开文件夹,输入的也是文件加路径,也只能输入文件夹路径,
     [FolderPath(ParentFolder = "Assets/Plugins",AbsolutePath = true, RequireExistingPath = true)]
     public string folderPath;
4、Validition 检测输入

    //ValidatorInput 用于检测输入,condition 用于自定义检测函数,defaultmessage 默认提示消息,MessageType 提示消息类型
    [ValidateInput("CheckName","defaultMessage",MessageType = InfoMessageType.Info)] 
    public GameObject go;

    private bool CheckName(GameObject go, ref string errorMessage,ref InfoMessageType ? infoMessageType)
    {
        if (go == null)
        {
            infoMessageType = InfoMessageType.Error;
            errorMessage = "没对象";
            return false;
        }
        string name = go.gameObject.name;
        if (name == "")
        {
            infoMessageType = InfoMessageType.Warning;
            errorMessage = "给个名字呗";
            return false;
        }
        return true;
    }

三、自定义特性

1、OdinValueDrawer 自定义值特性

可以自定一值特性,模板如下,可以使用泛型,这里继承SerializedMonoBehaviour 并加上OdinSerialize标签是为了把对应值序列化,然后显示在面板上。

public class Test : SerializedMonoBehaviour
{
    [OdinSerialize]
    public TestValue<int,int> tt = new TestValue<int,int>();
}
public class TestValue<T1,T2>
{
    public T1 t1;
    public T2 t2;
}

public class TestValueDrawer : OdinValueDrawer<TestValue<int, int>>
{
    protected override void DrawPropertyLayout(GUIContent label){ }
}
public class TestValueDrawer<T1,T2> : OdinValueDrawer<TestValue<T1, T2>>
{
    protected override void DrawPropertyLayout(GUIContent label){ }
}
2、OdinAttributeDrawer 自定义特性绘制

绘制自定义特性,和普通特性使用方式一样


public class AttributeTest : MonoBehaviour
{
    [TestDraw(1)] public int a;
}
//定义特性运用的范围
[AttributeUsage(AttributeTargets.Field)]
public class TestDrawAttribute : Attribute
{
    public int value;

    public TestDrawAttribute(int value)
    {
        this.value = value;
    }
}

public class TestDrawAttributeDraw : OdinValueDrawer<TestDrawAttribute>
{
    protected override void DrawPropertyLayout(GUIContent label){ }
}
3、OdinGroupDrawer 自定义组特性
public class GroupTest : MonoBehaviour
{
    [GroupDrap(1)] public int a;
}
[AttributeUsage(AttributeTargets.All)]
public class GroupDrap : PropertyGroupAttribute
{
    public int value;
    public GroupDrap(int value,int order = 0):base("_DefaultGroup",order)
    {
        this.value = value;
    }
}
public class GroupDrapDraw : OdinGroupDrawer<GroupDrap>
{
    protected override void DrawPropertyLayout(GUIContent label){ }
}
4、AttributeValidator 自定义验证器特性

可以写一些验证器相关的


 public class ValidationExample : MonoBehaviour
{
    [NotOne] public int NotOne;
}
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class NotOneAttribute : Attribute
{
}
public class NotOneAttributeValidator : AttributeValidator<NotOneAttribute, int>
{
    protected override void Validate(ValidationResult result)
    {
        if (this.ValueEntry.SmartValue == 1)
        {
            result.Message = "1 is not a valid value.";
            result.ResultType = ValidationResultType.Error;
        }
    }
}

四、EditorWindow

Odin提供了两个类,OdinEditorWindow和OdinMenuEditorWindow,他们分别用来编辑通用窗口和菜单窗口,使用这俩类编写窗口时UI不必写在OnGui里了,不在需要调用EditorLayout 、Layout、OnGui等这些Unity原生接口,可以直接使用Odin丰富的特性编写,这样写不仅更简单且更容易维护。

1、OdinEditorWindow:

基础窗口,类似原生EditorWindow

//基础窗口可以继承OdinEditorWindow,创建窗口是直接调用GetWidow就够了
public class windowTest : OdinEditorWindow
{
    [MenuItem("WindowTest/OdinBaseWindow")]
    private static void OpenWindow()
    {
        var window = GetWindow<windowTest>();
        window.position = new Rect(0, 0, 1980, 1080);
    }
    //不用写在 OnGui 里了 ,可直接运用特性写入
    [LabelText("测试文字")]
    public string test;
}
2、OdinMenuEditorWindow

菜单树窗口,就是提供了一个类似Unity Project Settings的窗口,当然显示是更加丰富。

 
//继承OdinMenuEditorWindow,创建窗口是直接调用GetWidow就够了
public class windowTest : OdinMenuEditorWindow
{
    [MenuItem("WindowTest/OdinMenuEditorWindow")]
    private static void OpenWindow()
    {
        var window = GetWindow<windowTest>();
        window.position = new Rect(0, 0, 1980, 1080);
    }
    [BoxGroup("当前页面内容")]
    public string test;

    protected override OdinMenuTree BuildMenuTree()
    {
        OdinMenuTree tree = new OdinMenuTree(supportsMultiSelect: false) //为true时,可以按着ctrl多选
        {
            //path 菜单树的名,文件夹形式的,可以嵌套,  instance 需要显示在当前菜单下显示的页面,EditorIcon 图标
            {"Home", this , EditorIcons.House},
            {"OdinSetting", null , EditorIcons.SettingsCog},
            {"OdinSetting/Color paletter", ColorPaletteManager.Instance , EditorIcons.EyeDropper}
        };
        var customMenuStyle = new OdinMenuStyle
        {
            BorderPadding = 0f,
            AlignTriangleLeft = true,
            TriangleSize = 16f,
            TrianglePadding = 0f,
            Offset = 20f,
            Height = 23,
            IconPadding = 0f,
            BorderAlpha = 0.323f
        };
        //定义菜单树样式
        tree.DefaultMenuStyle = customMenuStyle;
        //是否显示搜索栏
        tree.Config.DrawSearchToolbar = true;
        //自定义搜索方式,也可以不定义
        tree.Config.SearchFunction = (obj) =>  !obj.Name.StartsWith("Odin");
        //也能这样定义,但是发现没啥用
        /*this.DrawMenuSearchBar = true;
        this.CustomSearchFunction = (obj) =>  !obj.Name.StartsWith("Odin");*/
        //AddAllAssetsAtPath 把assetFolderPath下的所有对应类型的文件插入到menuPath下
        tree.AddAllAssetsAtPath("Odin Settings/More Odin Settings", "Plugins/Sirenix", typeof(ScriptableObject), true);
        //AddassetAtPath 把支援assetPath插入到menuPath下
        tree.AddAssetAtPath("Odin Getting Started", "Plugins/Sirenix/Getting Started With Odin.asset");
        //MenuItems.Insert 在Index位置插入一个 OdinMenuItem,这个是在最外层插入
        tree.MenuItems.Insert(2, new OdinMenuItem(tree, "Menu Style", tree.DefaultMenuStyle));
        //Add添加一个菜单
        tree.Add("Menu/Items/Are/Created/As/Needed", new GUIContent());
        //默认排序 排序方式是,有子菜单的在上面,然后同级按照首字母排序
        tree.SortMenuItemsByName();
        //自定义排序
        tree.EnumerateTree(true).SortMenuItemsByName((obj1,obj2) =>  0);
        return tree;
    }
}

总结

Odin特性大概有100多个,目前只举例了一点,更多的还是需要看官网,或者下载插件,点击 Tools->Odin->Inspector->Attribute Overview.
Odin提供的众多特性可以让我们非常快速的编写代码,搭建美观且强大的界面,它也允许我们轻松的扩展和定制我们的编辑器,通过编写自定义属性绘制器、值绘制器等,我们可以快速编写我们想要的功能。
嗯·推荐使用文章来源地址https://www.toymoban.com/news/detail-776654.html

到了这里,关于Unity---Odin Inspector的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity界面介绍:Inspector属性窗口

    Unity 中的游戏是由多个GameObjects(游戏物体)构成,这些游戏物体可以是多边形物体,脚本,声音,或其它图形元素如Lights等。Ispectror视窗会显示当前选择物体的详细信息,包括物体上当前连接的所有Componens(组件)和它们的属性。用户就是使用Componens(组件)来扩展当前场景中游戏

    2024年02月11日
    浏览(32)
  • Unity Editor Inspector界面编辑

    一、继承MonoBehaviour 1、[Header(\\\" \\\")] 标题 2、[Tooltip(\\\" \\\")] 如果鼠标光标是在字段上,显示的说明文本 3、[Range(0, 5)] 将int、float变量限制在特定范围内,滑动条 4、[Multiline] 字符串多行文本显示 5、[TextArea(2, 5)] 字符串多行文本显示,可以设置可现实的最大值和最小值的行数

    2024年02月08日
    浏览(31)
  • 【Unity编辑器】拓展Inspector视图

    目录 1、拓展源生组件 2、拓展继承组件 3、组件不可编辑 4、Context菜单 摄像机就是典型的源生组件。它的局限性就是拓展组件只能加在源生组件的最上面或者最下面,不能插在中间,不过这样也就够了 CustomEditor()表示自定义哪个组件,OnInspectorGUI()可以对它进行重新绘制,b

    2024年02月07日
    浏览(55)
  • unity初级——Inspector检视器面板开发

    目录 一、背景知识: 1、C#特性: 2、Unity中特殊目录: 3、*注意: 二、编辑器检视面板扩展属性 二、通过Editor脚本扩展组件(检视器外挂式开发) 三、检视器窗口开发 四、完成点击生成方块的工具 Resources:存储资源目录。 Plugins:需要跨语言条用的逻辑代码目录,三方插件,

    2024年02月09日
    浏览(28)
  • Unity3D:专属 Inspector

    推荐:将 NSDT场景编辑器 加入你的3D工具链 3D工具集: NSDT简石数字孪生 专属 Inspector 是专门用于特定游戏对象、Unity 组件或资源的 Inspector 窗口。 它始终显示为其打开的项目的属性,即使您在场景或项目中选择了其他内容。 专属 Inspector 的工作方式与常规 Inspector 一样,但有

    2024年02月12日
    浏览(33)
  • Unity 使方法以按钮的形式在Inspector上

    先看结果   目录结构(置于非Editor文件夹中) InspectorButtonAttribute.cs InspectorButton.cs    

    2024年02月11日
    浏览(26)
  • 【Unity编辑器扩展】| Inspector监视器面板扩展

    前言 前面我们介绍了Unity中编辑器扩展的一些基本概念及基础知识,还有编辑器扩展中用到的相关特性Attribute介绍。 后面就来针对Uniity编辑器扩展中比较常用的模块进行学习介绍。 本文就来详细介绍一下Unity编辑器扩展中关于 Inspector面板 扩展功能学习。

    2024年02月08日
    浏览(49)
  • Unity入门系列之Inspector检查窗口和Console控制台窗口

    目录 1.基本内容 2.Inspector检查窗口 3.Console控制台窗口 Inspector检查窗口:查看场景中游戏对象关联的C#脚本信息。 Console控制台窗口:用于查看调试信息的窗口,报错警告,测试打印都可以显示在其中。 不选择场景中游戏对象或不进行任何相关设置,该界面不会显示任何信息。

    2024年02月05日
    浏览(36)
  • unity把公共方法在Inspector 界面上实现一个按钮点击直接调用的最快最方便的方式

    在unity界面用显示的样式如下图: 没有参数的直接是一个按钮,有参数的会在下边加一个参数,点击Invoke按钮可以调用这个方法。 要实现上边的效果需要脚本继承MonoBehaviour,并且引用 using Sirenix.OdinInspector

    2024年02月16日
    浏览(36)
  • 初识Unity——创建代码、场景以及五个常用面板(创建C#代码、打开代码文件、场景的创建、Project、Hierarchy、Inspector、Scene、Game )

    目录 创建代码 创建C#脚本 打开代码文件 可能出现的问题 场景 场景的创建 基本介绍 五个窗口面板的作用 Project Hierarchy Inspector Scene Game  从unity2018版本开始,unity就开始不再维护和推荐JavaScript for Unity以及Boo等语言,现在官方主推和最常用的脚本语言是C#。 创建一个脚本之后

    2024年02月07日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包