Odin Inspector Version

Odin Menu Editor Window Improvements

We've added a lot of new features and made a few changes to OdinMenuTrees such as; filtering menu items, toggling their visibility, drawing a search field which works with keyboard menu navigation, automatically drawing a scroll view, and highlighting menu item etc...

With these new changes, OdinMenuTrees are now used for a wide range of features throughout Odin, such as the new Enum dropdowns and Odin Selectors.

  • Added OdinMenuTreeDrawingConifg to Odin Menu Trees, where you can enable and disable or enable various features of Odin Menu Trees when drawing them. Instances of these configs can be serialized separate from the Odin Menu Tree, and parsed to them, so that it keeps various settings through reloads, enabling search and undo etc.
  • Added AddRange to OdinMenuTree.
  • Added GetParentMenuItemsRecursive to OdinMenuItem.
  • Added a readonly LabelRect property to OdinMenuItems.
  • Added a lot new overloads in OdinMenuTreeExtensions for adding icons to menu items.
  • Added a DefaultToggleState boolean to OdinMenuItem.
  • MenuItemExtensions.AddThumbnailIcons can now also add thumbnail icons for menu trees containing types.
  • MenuItemExtensions.AddThumbnailIcons now also works with menu trees containing asset paths.
  • Instances of OdinMenuTrees can now be drawn by Odin.
  • Added support for referencing members using the $ sign in OdinMenuItem names.
  • SortMenuItemsByName now takes an overload to sort items with children by name before sorting menu items without children by name.

New Enum Dropdown

Added and replaced Unity's enum dropdown. You can still get the old enum drawer back in the Odin Inspector preferences window.

Odin Selectors

Odin Selector is a new class that combines Odin Editor Windows and OdinMenuTrees to draw feature-rich and flexible selector popups. OdinSelectors can be drawn anywhere; as a drop-down, in an EditorWindow, or inline directly in the inspector. We've included a few new selectors to start off with; EnumSelector, GenericSelector, and TypeSelector. These sort of popup are super easy to make yourself. Take a look at the documentation for OdinSelector's to learn more. We've also included a ScriptableObjectCreator which is located in the new sample project.

Odin Serialization Debugger

We've added a new tool for those utilizing Odin's serialization system, inheriting from classes such as SerializedMonoBehaviour or SerializedScriptableObject, that can help you get an overview of which members are serialized, and which are not.

The tool will tell you why a member is serialized by Unity, why it's serialized by Odin, or why it is not serialized at all. It will help you to debug your scripts, avoid common pitfalls, such as values not being serialized, not showing up in the inspector, disappearing between reloads or having both Unity and Odin serializing the same value.

When relevant, the window will also make good practices suggestions, so you can get the most out of using the Odin serializer.

Our First Sample Project

We've added our first sample project to Odin which is available from the getting started guide (The getting started guide can now also be found in Tool > Odin Inspector > Getting started). The intention of these sample projects is to give you inspiration, ideas, and tips and tricks to improve your workflow.

This time we've made an RPG editor that allows you to create characters, items, and edit inventories. This project showcases Odin Editor Windows, Odin Selectors, various attribute combinations, and custom drawers to build a feature-rich editor window for managing scriptable objects.


  • Implemented Odin property drawers and Odin serialization formatters for Vector2Int and Vector3Int.
  • Added a new attribute called DefaultSerializationBinder, that lets you help the DefaultSerializationBinder bind type names to types. This is useful if you're renaming a type, that would result in data loss, and what to specify the new type name to avoid loss of data.
  • Added a few more overloads OdinEditorWindow.InspectObjectInDropDown() which doesn't take a button rect, but instead opens the window at the mouse position.
  • Added a IsReadOnly property to the TableList attribute.
  • Added a menu item to open the getting started guid from Tools > Odin Inspector > Getting Started.
  • Added a readonly ObjectType property to StringMemberHelper.
  • Added DrawFoldoutTriangle to OdinMenuStyles.
  • Added ProgressBarField and overloads to SirenixEditorFields.
  • Added RectExtensions.AlignCenterX, AlignCenterY and AlignCenterXY to avoid confusion between RectExtensions.AlignCenter and RectExtensions.AlignMiddle.
  • Added ProgressBarField and SegmentedProgressBarField and overloads to SirenixEditorFields.
  • Added Serialization Debugger Example to the serialization related examples in the Odin Attributes Overview.
  • Added SirenixEditorGUI.DrawVerticalLineSeperator and SirenixEditorGUI.DrawHorizontalLineSeperator.
  • InlineEditors now has support for multi-selection.
  • Added SirenixGUIStyles.LeftAlignedCenteredLabel.
  • Added utility methods for making relative paths to PathUtilities.
  • Added an overview of Odin's included editor icons that can be found in Tools > Odin Inspector > Odin Editor Icons
  • Implemented support for left/right arrow keys on ProgressBarField and SegmentedProgressBarField.
  • Added a property to the ListDrawerSettings attribute that lets you override the default behaviour for adding objects to a list. If the referenced member returns the list type element, it will be called once per selected object. If the referenced method returns void, it will only be called once regardless of how many objects are selected.


  • Clicking buttons now also mark the underlying unity object(s) dirty. This means you no longer have to use EditorUtility.SetDirty, whenever you use a button attribute to change the state of an object. This behaviour can be disabled in the general drawer settings and is on by default.
  • AssemblyUtilities.GetTypeByChachedFullName now consistenly returns null if the type was not found.
  • Increased the priority of the HideLabel attribue drawer from (0.1, 0, 0) to (0.7, 0, 0).
  • Left and right arrow for navigating Odin menu trees, now behaves the same as Unity's project window.
  • Made menuTree.Selection.OnSelectionChanged obsolete, use menuTree.Selection.SelectionChanged instead which also gives you the type of event that occured.
  • Content padding in OdinEditorWindows is now applied after BeginDrawEditors instead of before, to make it easier to add toolbars to your editor windows.
  • OdinMenuItems.ChildMenuItems is now made virtual.
  • Moved EnsureOdinInspectorDefine.cs to Plugins/Sirenix/OdinInspector/Scripts/Editor/EnsureOdinInspectorDefine.cs so people manually can decide whether to include the define symbol. Also included instructions in the script to only have the ODIN_INSPECTOR symbol defined for those that have Odin. 289
  • EditorIcons.LockUnloacked is made obsolete. Use EditorIcons.LockUnlocked instead.
  • Replaced DirectoryInfoExtensions with PathUtilities.
  • Type drawer now uses the new TypeSelector.
  • OnValueChanged on members with structs in them will now always trigger when child values are changed, as changing a value in the struct counts as changing the struct itself.
  • CharDrawer no longer uses a delayed text field, which was confusing.
  • EditorOnlyModeConfig is now made public.
  • Improved logging in DeepReflection when the last member in the path does not match the expected type.
  • MemberInfoExtensions.IsStatic should now support all cases.
  • ReferenceEqualityComparer.GetHashCode() now returns -1 instead of throwing an exception, if the given object instance's own GetHashCode() throws a NullReferenceException.

Major Fixes

  • Fixed a bug where a mysterious "Serializable Json Dictionary" property would show up in OdinEditorWindow in some of the 2017 Unity versions.
  • Fixed a bug where the UnityEvents would behave badly if multiple UnityEvents was being drawn. 294, 284
  • Fixed a crash-bug reagrding Odin serialized UnityEvents and prefab modifications. 280, 291
  • In some rare cases, prefab instances can become corrupted if there somehow end up being applied bad prefab modifications to the JSON, Nodes or Binary data fields. This will result in a corrupted data-stream, and if the resilient serialization mode fails to be resilient, scenes will also give an error when opened or built. And in some cases would also cause an VS Bridge error when trying to log an error.
  • Fixed an issue where the persistent context cache would not be saved when exiting play mode, resulting in foldout groups expanding or collapsing etc...
  • Fixed an issue where changing a property in the inspector would in some cases not always mark the object dirty and repaint the scene view.


  • Fixed an issue where dragging from one list to another sometimes would cause the object to be copied instead of moved. 295
  • DragAndDropUtilities.GetDragAndDropId now gets a more reliable Id, which is immune to damages made to GUIUtility.GetControlId.
  • Fixed a bug where AOTGenerationConfig.ScanProject would throw an exception when executed from command line. 282
  • Fixed a bug where DontApplyToListElements attribute would sometimes incorrectly think that a property was part of a list element. 279
  • Fixed a bug where adding an icon to an OdinMenuItem would not assign the icon to the selected menu item state.
  • Fixed a bug where it was possible to set a progress bar to a value that was outside the specified range.
  • Changing a value inside a struct with multiple elements selected no longer sets the entire struct to be the same on all selected instances.
  • Fixed a bug where the delegate drawer would be indented twice per indent level if no label was assigned.
  • Fixed a bug where the PreviewField attribute where not applied to list elements.
  • Fixed an issue in SerializationPolicies where Unity and Strict policies would return true for non-auto properties.
  • Fixed an issue where inheriting from OdinEditor, overriding OnInspectorGUI and calling DrawDefaultInspector would result in an endless recursive loop.
  • Fixed an issue with File and Folder fields that would not make correct relative paths on Mac.
  • Labels are now always fully visible in the Odin preferences window.
  • ProgressBarField and SegmentedProgressBarField now works with keyboard focus.
  • StringExtensions.SplitPascalCase now doesn't break if the first letter is a non-letter, and doesn't break with empty strings either.
  • When the OdinMenuEditorWindow automatically selects the first menu item that has something to display, it now also expands all parent menu items, which will make the selected menu items visible.
  • Changes made to struct instances inside OnValueChanged callbacks are now kept and applied, rather than discarded.
  • Fixed an issue where buttons in TableLists would spam the console with GUIContent null warnings.
  • Fixed an issue where TableLists would throw OutOfRangeExceptions when the title label was null. 273
  • Fixed a case where FormatterEmitter could fail to emit a formatter for a type if it had already emitted a formatter for another type with the same full name.
  • Fixed an error in the serialization system's JsonTextReader class, where it would guess that an unannotated, nameless entry with the string content "null" was an Integer entry, rather than a Null entry.
  • Fixed a minor issue in ToggleExamples where not all of the examples where being drawn as intended.
  • Fixed potential stack overflow in TypeExtensions.AreGenericParametersFulfilledBy, when a generic parameter has a constraint that contained itself, such as "where T : IComparable<T>".
  • Fixed serialization error where System.Runtime.Serialization.IDeserializationCallback.OnDeserialization would be called on callback instances before values were deserialized into the given instance, not after, causing errors in some cases.
  • The SerializableFormatter class now also finds ISerializable constructors defined in the serialized type's base classes.
  • TypeExtensions.GetAllMembers<T> no longer throws a null exception if it is passed System.Object as a parameter.
  • Fixed right click context menus for Folder/FilePath fields.

What's to come

We wanted to take the opportunity to tell you a bit about the future of Odin Inspector. As some of you are aware, we recently pitched, that the next patch - 1.0.7 - would bring improvements to the validation system included in Odin. But due to the strong interest in the features of Odin 1.1 we've decided to put 1.0.7 on hold for now, and go straight to 1.1, which we have been working on for quite some time and will start beta-testing of very soon.

In Odin Inspector patch 1.1, we've completely rewritten how the property tree works internally. Properties are now lazily evaluated, which means that Odin doesn't care how much data you throw at it, it will only do processing on the properties you're looking at, which is currently not the case. This will vastly increase editor performance.

It will also introduce attribute and property resolvers and locators. Much more on that later, but this means that attributes and properties can come from anywhere. This will open up a world of new possibilities! You'll be able to add attributes to members you don't own the code for, you would be able to put all attributes on the types and have them be applied globally for all members of that type, ShowInInspector will work on static members as well. We could even at some point, go as far as to create an editor to make editors, meaning you wouldn't even have to put attributes on your members, you could just right-click a property in the inspector, and customize it. Adjust the range slider, drag and drop them around to change the order etc...

You can sign up for beta testing by sending us a mail with your Odin invoice Id included from our contact form.