很好用的Unity编辑器扩展工具 Odin Inspector教程

Posted 天才小熊猫oo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了很好用的Unity编辑器扩展工具 Odin Inspector教程相关的知识,希望对你有一定的参考价值。

Odin Inspector是什么?

Odin Inspector是Unity的一个插件,让您可以享受拥有强大,自定义和用户友好编辑器的所有工作流程优势,而无需编写任何自定义编辑器代码。
Odin包含许多功能,例如Static Inspector,Project Validation,Odin Editor Windows和我们的开源Odin Serializer,它允许您在需要多态对象结构时扩展Unity的序列化功能,或者希望在运行时序列化和反序列化数据。

Odin Inspector可以做什么?

下图是 Odin Inspector 的官方给示例Demo,完成了一个编辑器,OdinInspector 拜托了传统那种要写一堆代码的编辑器拓展,而紧紧使用数据,就可以完成一个强大的编辑器功能,相比原来写代码的方式不知道要省了多少事。

 

 

思维导图

 

 Odin Inspector官网

 Odin Inspector and Serializer | Improve your workflow in UnityOdin Inspector is a plugin for Unity that lets you enjoy all the workflow benefits of having a powerful, customized and user-friendly editor, without ever having to write a single line of custom editor code.https://odininspector.com/

Unity插件Odin入门

商店地址:Odin
Odin是一个对编辑器进行拓展的插件,可以序列化各种数据,方便的制作出各种编辑器界面,如下:


导入插件后,如图Tool–Odin Inspector–Getting Started可以查看Odin提供的概览界面。

点击Open Attributes Overview会显示属性,字段编辑相关的示例,可以让我们方便的编辑Inspector界面的内容。点击Leran More会显示一些窗口相关的示例,方便自定义一些弹窗界面。

概览的下方提供了一些Scene样例,方便进一步学习。

首先,查看字段相关的实例,如上图,左侧是分类,右侧上方是Inspector界面上绘制出的内容,右侧下方是对应的代码,可直接复制使用。
Odin提供了100多个特性(Attribute),只需要把特性加到字段上就可以显示上方的样式。特性简单说就是用来标记元素的,如字段,方法,类。这么多特性很难记住,一般是需要了再去查找合适的样式。

	//AssetsOnly表示只能拖拽Assets目录下的资源,场景中的资源是无法拖动
	[AssetsOnly]
	public GameObject SomePrefab;
	
	//SceneObjectsOnly相反,只能拖拽Scene场景中的资源
	[SceneObjectsOnly]
	public GameObject SomeSceneObject;

下面总结一些比较常用的特性

1.限制数值范围,滑块,进度条

    [Range(0, 100)]
    public int Field = 2;
    
    [MinValue(0)]
    public int IntMinValue0;

    [MaxValue(0)]
    public int IntMaxValue0;

    [ProgressBar(0, 100)]
    public float ProgressBar = 50;

2.数值变化时触发特定方法

	[OnValueChanged("OnValueChanged")]
    public int DelayedField;
    
    //ShowInInspector用于将属性显示到界面上
    [ShowInInspector]
    [OnValueChanged("OnValueChanged")]
    public string DelayedProperty  get; set; 

    private void OnValueChanged()
    
        Debug.Log("Value changed!");
    

3.颜色

	//字段添加颜色
    [GUIColor(0.3f, 0.8f, 0.8f, 1f)]
    public int ColoredInt1;
    
    //调色板
    [ColorPalette("Fall")]
    public Color Color1;
    
    //按钮添加颜色
    [GUIColor(0, 1, 0)]
    [Button("ButtonName", ButtonSizes.Small)]
    private void ButtonMethod()
    
    

4.提示信息

    //HideLabel用于隐藏字段名
    [Title("Vector3标题")]
    [HideLabel]
    public Vector3 WideVector1;
    
    //Space用于添加一行空隙
    [Space]
    [InfoBox("提示1")]
    public int Int1;
    
    //MyGameObject为空时才会提示
    [Required]
    public GameObject MyGameObject;

5.输入校验

    [ValidateInput("HasMeshRenderer")]
    public GameObject DynamicMessage;
    
    private bool HasMeshRenderer(GameObject gameObject, ref string errorMessage)
    
        if (gameObject == null) return true;

        if (gameObject.GetComponentInChildren<MeshRenderer>() == null)
        
            errorMessage = "\\"" + gameObject.name + "\\" 必须包含MeshRenderer组件";
            return false;
        

        return true;
    
    
    
    [ValidateInput("CheckSpace", "字符串不能有空格", InfoMessageType.Warning)]
    public string Message = "Dynamic";

    private bool CheckSpace(string value)
    
        return value.IndexOf(' ') < 0;
    

6.下拉列表

    [ValueDropdown("TextureSizes")]
    public int SomeSize1;
    
    private static int[] TextureSizes = new int[]  256, 512, 1024 ;
    
    
    [ValueDropdown("FriendlyTextureSizes")]
    public int SomeSize2;
    
    private static IEnumerable FriendlyTextureSizes = new ValueDropdownList<int>()
    
         "Small", 256 ,
         "Medium", 512 ,
         "Large", 1024 ,
    ;
    

    [ValueDropdown("TreeViewOfInts", ExpandAllMenuItems = true)]
    public List<int> IntTreview = new List<int>()  1, 2, 7 ;
    
    private IEnumerable TreeViewOfInts = new ValueDropdownList<int>()
    
         "Node 1/Node 1.1", 1 ,
         "Node 1/Node 1.2", 2 ,
         "Node 2/Node 2.1", 3 ,
         "Node 3/Node 3.1", 4 ,
         "Node 3/Node 3.2", 5 ,
         "Node 1/Node 3.1/Node 3.1.1", 6 ,
         "Node 1/Node 3.1/Node 3.1.2", 7 ,
    ;

7.分组

    //水平分组
    [HorizontalGroup] 
    public float num;
    
    [HorizontalGroup, Button(ButtonStyle.Box)]
    private void Full(float a, float b, out float c)
    
        c = a + b;
    
    
    //Box分组
    [BoxGroup("Titles")]
    public int A;

    [BoxGroup("Titles")]
    public int B;
    
    //按钮分组
    [ButtonGroup]
    private void C()  

    [ButtonGroup]
    private void D()  

8.集合


1.注意序列化字典必须继承SerializedMonoBehaviour,List不需要

public class Odin学习 : SerializedMonoBehaviour

    public Dictionary<int, Material> IntMaterialLookup;
    
    [OnInspectorInit]
    private void CreateData()
    
        IntMaterialLookup = new Dictionary<int, Material>()
        
             1, ExampleHelper.GetMaterial() ,
             7, ExampleHelper.GetMaterial() ,
        ;
    


2.List不加特性也可以使用,拖动左侧的滑块可以调整元素的顺序,TableList可以将List转为表格的形式,点击加号左边的按钮可以切换会原来列表的形式。

    public List<float> FloatList;
    
    [Range(0, 1)]
    public float[] FloatRangeArray;
    
    [TableList(ShowIndexLabels = true, AlwaysExpanded = true)]
    public List<SomeCustomClass> TableListWithIndexLabels = new List<SomeCustomClass>()
    
        new SomeCustomClass(),
        new SomeCustomClass(),
    ;
    
    [Serializable]
    public class SomeCustomClass
    
        [TableColumnWidth(57)]
        [PreviewField(Alignment = ObjectFieldAlignment.Center)]
        public Texture Icon;

        [TextArea]
        public string A, B;
    

9.条件

    public bool IsToggled;

    [DisableIf("IsToggled")]
    public int DisableIfToggled;
    
    [EnableIf("IsToggled")]
    public int EnableIfToggled;
    
    [DisableInEditorMode]
    public GameObject A;

    [DisableInPlayMode]
    public Material B;

    [HideIf("IsToggled")]
    public Vector3 HiddenWhenToggled;

    [ShowIf("IsToggled")]
    public Vector2 VisibleWhenToggled;

10.资源列表

	//显示该路径下的材质,路径前面的Assets不用写
    [AssetList(Path = "Materials/")]
    public List<Material> AssetList;
    
    [AssetList(AssetNamePrefix = "Line")]
    public List<Material> MaterialsStartingWithLine;

11.窗口

public class Odin窗口 : OdinEditorWindow

    [MenuItem("Tools/简单窗口")]
    private static void OpenWindow()
    
        var window = GetWindow<Odin窗口>();
        window.position = GUIHelper.GetEditorWindowRect().AlignCenter(500, 500);
    

    [EnumToggleButtons]
    public ViewTool SomeField;


以上是关于很好用的Unity编辑器扩展工具 Odin Inspector教程的主要内容,如果未能解决你的问题,请参考以下文章

扩展下光照图查看工具

Unity3D Editor Undo回退效果实现3 Odin相关

Unity3D Editor Undo回退效果实现3 Odin相关

Unity3D Odin Inspector 简单介绍与入门

Unity3D Odin Inspector 简单介绍与入门

Unity3D Odin Inspector Attribute回调的实现原理