A brand new Odin Validator

Fix issues the moment they are introduced
3.1 BETA

Your personal project caretaker now in beta

Odin Validator has been rebuilt from the bottom up to be better, faster and leaner. It boasts new features such as live validation, project rules, sophisticated scanning and search filters, scene view widgets for issues, issue fixes, bulk issue fixing and more, all built around a philosophy of extensibility, configurability and customizability.

Everything is packed into one compact window, streamlined, centralized and easier to use than ever. The new Odin Validator is the ultimate companion for any team, small or large, making sure that you can move fast - without breaking things.


On-the-fly error detection

While you work, Odin Validator silently scans your project in the background, applying a vast, configurable set of rules, validations and filters all without interrupting work, and immediately notifying developers when issues relevant to their current work are detected. Validation is kept up to date as changes are made in the editor, assets are pulled from source control, and so on, making sure you always have the latest state of your project right at your fingertips.

New validation attributes

Odin already contains many validation attributes such as ChildGameObjectsOnly, Required, AssetsOnly, SceneObjectsOnly, ValidateInput and so on. We've added three additional built-in attributes to help boost productivity for your team.

[RequiredInPrefabAssets]
[DisallowPrefabModifications]
public string Name;

[RequiredInPrefabInstances]
public Camera Camera;

Fixes and bulk fixes

Validators which detect issues can choose to offer fixes for them. These provided fixes can range from things as simple as adding a missing Rigidbody or correcting a bad layer assignment, to complex operations requiring user input to resolve.

Fixes can be run individually, or run in bulk, where one fix is applied to several or all instances of a detected issue. No longer will you have to painstakingly trawl through your project looking for every single lost instance of an enemy prefab that you forgot needed a rigidbody, or even go through them one by one just to click a few buttons to resolve it manually. With bulk fixing, hours, days or sometimes even weeks of tedious work can be reduced to a single click of a button.

Simple and easy fix creation API

Creating a fix is both simple and fast, requiring an absolute minimum of boilerplate code and pointless tedium.


                [assembly: RegisterValidator(typeof(RockValidator))]

public class RockValidator : RootObjectValidator<Rock>
{
    protected override void Validate(ValidationResult result)
    {
        if (this.Object.GetComponent<Rigidbody>() == null)
        {
            result.AddError($"{this.Object.name} is missing a Rigidbody",
                Fix.Create("Add Rigidbody", () => this.Object.gameObject.AddComponent<Rigidbody>()));
        }
    }
}

Even easier with the new ISelfValidator interface

Instead of creating validation logic that needs to live in a separate file, editor only assembly or wrapped in clunky preprocessor statements, you can use the new ISelfValidator interface on any type in your project, such as your MonoBehaviours, ScriptableObjects, or even simple non-Unity object data types.

This handy new API gives you all the power of custom validators and fixes right inside the type that needs to be validated, with no fuss or boilerplate at all, making the process of adding custom validation and fixes as fast and effortless as it could possibly be.


public class MyComponent : MonoBehaviour, ISelfValidator
{
    public bool ShouldBeAboveSeaLevel;

    public void Validate(SelfValidationResult result)
    {
        if (this.ShouldBeAboveSeaLevel && this.transform.position.y < 0)
        {
            result.AddError(this.gameObject.name + " should be above sea level", SelfFix.Create(() =>
            {
                this.transform.position = new Vector3(this.transform.position.x, 0, this.transform.position.z);
            }));
        }
    }
}

Master your project

With a single click of a button, you can gain an overview of all issues in your entire project (or in only the parts you are interested in), and double-click any issues to instantly go to them. Improved scanning times yields results faster than ever before, and the option of background validation means your work will never be needlessly interrupted.

A new and improved validation issue overview boasts a vastly better user experience, with a large array of filters and search options, and the ability to smoothly scale to any size of project, displaying anything from a few dozen issues to many tens of thousands with buttery smooth performance.

Built-in Rules

Odin Validator now comes with several built-in, configurable rules, which can be enabled,
disabled and modified on both a team-wide project basis, or on a local machine-only basis.



Detect missing references

Detect broken assets

Detect duplicate components

Detect invalid layers

Detect shader compiler errors

Detect broken materials

Detect renderers with invalid materials

Detect invalid transform positions

Detect broken prefab connections

Detect use of obsolete components


And many, many more to come during the beta..



Create custom rules

Simply right-click anywhere in the project view or click the plus icon in the rules list to create
a custom rule from a script template. Serialized fields in the validator become configurable values.



[assembly: RegisterValidationRule(typeof(MyPhysicsMaterialValidator))]

public class MyPhysicsMaterialValidator : RootObjectValidator<Collider>
{
    // Objects in these layers must have a physics material assigned
    public LayerMask physicsMaterialLayers;

    protected override void Validate(ValidationResult result)
    {
        if (this.Object.sharedMaterial == null && (this.physicsMaterialLayers.value & (1 << this.Object.gameObject.layer)) != 0)
        {
            result.AddError($"{this.Object.name} needs a physics material");
        }
    }
}

Automated validation

Validate on play/build/startup

Exactly like the old validator, Odin Validator 3.1 provides event hooks that you can enable to scan your project a play, build or startup time and report with the results, optionally preventing the build from succeeding or stopping you from entering playmode with an invalid setup.

foreach (var result in ValidationSession.GlobalValidationSession.ValidateEverythingEnumerator(true, true, false, false))
{
    if (result.HighestSeverityResult.ResultType == ValidationResultType.Error)
    {
        Debug.LogError("Error: " + result.HighestSeverityResult.Message);
    }
    else if (result.HighestSeverityResult.ResultType == ValidationResultType.Warning)
    {
        Debug.LogError("Warning: " + result.HighestSeverityResult.Message);
    }
}

Validate in your custom pipeline/CI systems

Odin Validator's API is easy to use and invoke from your own code, anywhere you please. The full power and configurability of the validator is available through the API, to be run as part of your custom build pipeline, testing suite or CI systems.

Getting Started

Opening the Odin Validator

You can access the new validator from a couple of different places.

  • You can open the window from Tools > Odin Validator. This will open an editor for the global validation session.
  • The new Odin validator window can also be opened by clicking on the new scene widget. If multiple validation sessions are active, the scene widget can be right-clicked and from there you access individual validation sessions.
  • Right-click an asset or a folders and click on Asset folder or File > Odin Validator > Validate this to start a one-off validation session targeting only the selected assets or folders.

Configure the validator to your project

You can configure which parts of your project the validator should look at, such as which scenes should or shouldn't be validated. Use the include and exclude buttons highlighted in the image. You can add individual files or entire folders.

There are far more things that can be configured, but we’ll let you discover those while we write the documentation for the full release.

Quick start using attributes

Apply your attributes, set up your preferred rules, run a scan, and enjoy your new, faster and more reliable workflow.

public class MyComponent : MonoBehaviour
{
    [Required]
    public string Name;

    [AssetsOnly, AssetSelector, Required]
    public GameObject Prefab;

    [ChildGameObjectsOnly, Required]
    public GameObject Child;

    [ValidateInput("@OddNumber % 2 == 1", "@OddNumber + \" is too normal!\"")]
    public int OddNumber;
}

Migrating from the old validator

The new 3.1 Odin Validator can form a parallel install alongside the old version of the validator, so your old validation setup will not be affected during migration. The new Validator contains an upgrade wizard, which can import as much of your prior validator setup as possible to the new validator.

Beta patch notes

Version 3.1.0.19 Beta

Odin Validator

  • Opening prefabs from validator issues now always open the stage for the outer most prefab instance, instead of the nearest prefab instance.
  • Validation Profiles can now have icons, which can be changed while having the profile asset selected.
  • Fixed error log that would occur when toggling visibility of gameobjects.

Odin Inspector

  • Added value drawer for SdfIconType.
  • Sdf Icon Overview can now also function as a Icon Selector. (SdfIconSelector)
  • Fixed beta issue where all Odin Inspector and Odin Validator's precompiled assemblies would be compiled against .NET Framework 4.8 instead of .NET Framework 4.7.1, causing issues with VS Code's intellisense and compiler errors when trying to manually build solutions or projects referencing the .dll's via for example MSBuild. All assemblies are now built targeting .NET Framework 4.7.1.
  • SdfIconType.None now draws nothing instead of 123
  • Fixed case introduced during the beta where Odin would incorrectly draw members in Odin-serialized Unity objects as if the roots were always serialized by Odin, and never Unity. This did not change the actual serialization behaviour, only the display of it.
  • Value on ValueValidator is now browsable and will show up in Visual Studio's intellisense

Version 3.1.0.18 Beta

Odin Validator

  • Validator settings are now serialized in your project and shared with your team. They can also be overriden with local machine settings as needed.
  • Fixed a bug where profiles and other serialized validator settings would be overriden when the project is imported for the first time.
  • Fixed an issue with ValidationSession.CurrentWarningCount.

Odin Inspector

  • Added reference to Sirenix.OdinInspector.Attributes to the Sirenix.Utilities assembly definition in the source distribution of Odin, fixing compiler errors introduced to the source build by the addition of SdfIcons to the Sirenix.Utilities assembly.
  • Added more menu item shortcuts to Odin Serialization preferences.
  • Fixed a bug where the SdfIcon texture is unable to be loaded during InitializeOnLoad first time the project is loaded. Unity is still unable to load it, but uses of API SdfIcon api is resiliant to it not working during that time, and SdfIcon will fix itself later when the AssetDatabase works again.
  • Fixed various ImGUI layout issues and slightly improoved performance of SirenixEditorGUI.BeginFadeGroup()
  • GUIEditorTime.DeltaTime's now work correctly when used in multple different IMGUIContainers from the same window.
  • Odin ProjectSetting utilities intoruced in the beta is now moved to the Sirenix.OdinInspector.Internal namespace.

Version 3.1.0.17 Beta

Odin Validator

Features and additions

  • Added new Getting Started window. The Odin Validator tutorials linked in the new window are not ready yet, but will be online soon.
  • Added setup wizard in the Odin Validator section of the new Getting Started, which will guide you through initial setup of Odin Validator and offer to migrate settings from the old version of the Validator if you have it installed.
  • Added "Configure" context menu to the scene validation widget.
  • Added right click context to No Empty Strings rule.
  • Added right click context to Reference Required By Default rule.
  • Added right click context to Scene Not In Build Settings rule.
  • Added ability to ignore certain shader assets in Shader Compile Error rule.
  • Added DynamicObjectAddress.GetAllExistingAddresssesForAssetGuid()
  • Added FindAllComponentsInSceneOfType<T> and FindComponentInSceneOfType<T> to SceneValidators.
  • Added 'Ignore shader compile errors' > 'For me only' and 'For everyone' to Shader Compile Error rule's right click context.
  • Added 'ignore this component type' to duplicate component rule's right click menu.
  • Added result.AddError("error message").WithModifyRuleDataContextClick(..) which makes it easy to modify rule settings when right clicking issues that come from rules.
  • Added support for validators to implement the IDefineGenericMenuItems interface. Menu items added by a validator will appear in both the inspector and in the validator window.
  • Attributes can now be applied to meta data entries for issues. result.AddError("...").WithMetaData("Name", 10f, new RangeAttribute(0, 20), new InfoBoxAttribute("Hello"));
  • Changed how enabling and disabling live validation works in the Validator Window.
  • Cleaned up the ValidationSession API, and added validationSession.CurrentWarningCount, validationSession.CurrentErrorCount and validationSession.CurrentValidCount() as well as GetCurrentResults(applyFilters) ;
  • Creating a profile in the validator window, now pings the asset it creates.
  • Double clicking issues from prefab assets now opens the prefab stage and locates the issue in there.
  • Missing shader issues on materials are now fixable.
  • Restructured validation config and added many new options in validation config for specifying when to automatically validate certain objects.
  • this.ValueEntry.SmartValue can now be accessed through this.Value in AttribtueValidators, RootObjectValidators and ValueValidators.
  • Validator now captures all console errors and warnings logged during asset load events performed during validation.
  • You can now more easily add buttons to issues. Example: result.AddError("").WithButton("Name", () => { Debug.Log("Button was clicked"); })
  • Added right click > 'See Rule Settings' to huge transforms.

Changes

  • The way in which features are added to error messages has been changed from parameters on a single create call to a fluent builder pattern. IE, result.AddError().WithFix(..).WithMetaData("name", value)
  • Validator feedback button was moved from being an overlay button, to be part left icon menu.
  • Column header labels are now left aligned.
  • Duplicate component rule message now includes the name of the duplicate component.
  • Duplicate Component rule right context is now 'Ignore this component' > 'For Me Only' and 'For everyone'.
  • Huge Transform Position rule right click context is now 'Open rule settings' > 'For Me Only' and 'For everyone'.
  • Improved validation count per second in progress bars.
  • Renamed PersistentValidationResult to PersistentValidationResultBatch, and added a new version of PersistentValidationResult which is a simple data-only class that only ever represents a single result, not potentially a collection of them. Also changed the ValidateEverythingEnumerator APIs and added ValidateEverythingEnumeratorBatched.
  • Renamed ValidationSessionProfile to ValidationProfile, ISessionConfigData to IValidationProfile, GlobalSessionConfigData to MainValidationProfile and LocalSessionConfigData to MainLocalValidationProfile.
  • ResultItem.WithContextClick can now be called multiple times to add multiple right click options instead of just one.
  • Root Object Validator templates are now non-generic.
  • RuleConfig.GetRuleDataWrapper now keeps and reuses the RuleDataWrapper object.
  • SceneView is no longer accessible as a parameter through the delegate passed to result.AddError().WithOnSceneGUI() to be consistent with the non editor version accessed through ISelfValidator. You can still access it though SceneView.currentDrawingSceneView.
  • When a gameobject is deleted, only the scene it came from will be revalidated, if the setting for it is enabled.

Fixes

  • Fixed case where fixes for sub-validation results would not be persisted.
  • Fixed case where prefabs assets would not be pinged in the project browser on double click.
  • Fixed issue data would not always get updated after revalidation.
  • Fixed issue where some objects would not get removed from the validator window when deleted from Unity.
  • Multiple Audio Listeners validator now only looks through active gameobjects.
  • Search and filters are now properly handled for validators that output multiple results.
  • Validator no longer revalidates entire prefabs when revalidation of a component inside a prefab is triggered.
  • When switching to a scene the validate has already validated, it will no longer re-validate that entire scene.
  • Fixed case where rebuilding of persisted validation result items was broken in cases where not all data items had references to persist.

Odin Inspector

Additions

  • Added a new Getting Started window and removed the old one.
  • Added builder pattern to ResultItem for both Validator and ISelfValidator, IE, result.AddError(foo).WithFix(bar).WithMetaData(baz). These replace the now-removed AddX overloads that took fix and metadata arguments.
  • Added DisableIn attribute.
  • Added EnableIn attribute.
  • Added HideIn attribute.
  • Added new overload of SirenixEditorGUI.MessageBox which takes a delegate that can add items to the context menu when right-clicking the message box.
  • Added OnContextClick and OnSceneGUI delegates to ResultItems for both Validator and ISelfValidator, which is what is added to ValidationResult instances via result.AddError() etc. OnContextClick is invoked to help build a right-click context menu for that validation result item when it is right clicked in the inspector or in the Validator window, and OnSceneGUI lets you draw to a scene view when the result item is selected in the validator window if you have Odin Validator installed. Use the new builder pattern methods WithContextClick and WithSceneGUI to set these on your results, IE, result.AddError(error).WithContextClick(foo).WithSceneGUI(bar).
  • Added PrefabKind enum to OdinInspector.Attributes.dll and OdinPrefabUtility.GetPrefabKind(obj).
  • Added ShowIn attribute, which lets you specify in which kinds of prefabs a thing should be shown.
  • Added TextureUtilities.ResizeByBlit() that can resize a texture regardless of its readOnly state.
  • The root object of a property tree can now be accessed from Odin's attribute expressions as a named argument. [InfoBox("@$root.name")] will print the name of the component if a component is inspected.
  • Added DisallowModificationsIn attribute.
  • Added RequiredIn attribute.

Changes

  • Icons for info, error and warning messages are now much smaller, making the message boxes take up less space in the inspector.
  • Made the icons of warnings and errors and info smaller, which means smaller info boxes in the inspector.
  • Moved SdfIcons to the Sirenix.Utilities.Editor assembly.
  • Moved SdfIconType to the correct assembly, Sirenix.OdinInspector.Attributes.
  • Removed Fix<T> generic variant; there's now just Fix. The usage API is the same, though, so this should have little impact for anyone.
  • Removed overloads for ValidationResult and SelfValidationResult that took fix and metadata arguments; use the builder pattern that replaces it instead, IE, result.AddError(foo).WithFix(bar).WithMetaData(baz).
  • Removed the Validator.OnSceneGuiSelected virtual method. Use the OnSceneGUI delegate on individual result items instead, ideally using the builder pattern via result.AddError("Error").WithSceneGUI()
  • Reorganized Odin's menu items.

Fixes

  • All OdinSelector window instances now close immediately when the current selection changes, to prevent all strange edge cases where things change under the selector's feet.
  • DisableInNonPrefabs, DisableInPrefabs, DisableInPrefabInstances, DisableInPrefabAssets, HideInNonPrefabs, HideInPrefabs, HideInPrefabAssets, HideInPrefabInstances, HideInPrefabs, has all been fixed to work with stages. But they have also been marked obsolete in favor of the new attributes.
  • Fixed bug where SdfIcons didn't work during initialization of Unity.
  • Fixed PropertyTree leak in the module preferences tab.
  • Fixed compiler error in EnumToggleButtonsAttributeDrawer.cs in source mode in newer versions of Unity that happened due to a name collision with StringExtensions.
  • Fixed case where TypeExtensions.GetCastMethod would return a method with a wrong signature that could not in fact perform the requested cast. This could cause the expression system to compile invalid expressions and cause hard crashes when inadvertently invoking methods with parameters of the wrong types.
  • Fixed Odin failing to update the editors of existing PropertyEditor window instances when injecting its editors. Odin will now force update the editors of all window instances which implement the IPropertyView interface.
  • Fixed issue where InfoBoxValidator would not get a custom message if the VisibleIf parameter was not set.
  • Reference Required By Default now correctly handles Unity-null objects.
  • In cases where SirenixAssetPaths fails to locate it self, it now defaults to the default installation folder instead of project root.
  • Fixed error in generic type argument inferral in the GenericParameterInferenceTypeMatcher, and in TypeExtensions.TryInferGenericParameters, where they in some cases would fail to properly infer generic parameter arguments from parameter constraints which were nested two or more layers deep in other parameter constraints. This would cause an error where, for example, the type declaration `public class SomeDrawer<TList,TReference,TAsset> : where TList : IList<TReference> where TReference : AssetReferenceT<TAsset> where TAsset : Object` would fail to match to valid types such as `List<AssetReferenceT<Component>>`.

Odin Serializer

Changes

  • Type casting errors where deserialized values cannot be assigned to the expected type now log the full type name of all relevant types.

Fixes

  • Fixed case where the DefaultSerializationBinder's type binding logic would fail to correctly resolve type names for vector arrays to multidimensional arrays of 1 dimension instead, if .NET type resolution fails, such as in the case of types having been renamed.

Version 3.1.0.13 Beta

Odin Validator

  • Fixed various layout issues.
  • ValidationSessionAsset has been renamed to ValidationSessionProfile

Odin Inspector

  • Fixed various layout issues.
  • Fixed cases where animating elements would not always be consistent with the framerate of editor windows.
  • EditorTime.Time is now obsolete - use the new GUITimeHelper.RepaintDeltaTime or GUITimeHelper.LayoutDeltaTime instead.
  • UnityTypeCacheUtility is now obsolete as we no longer support versions of unity from 2018 and below.

Version 3.1.0.12 Beta

Odin Validator

Additions

  • Added ValidationReport class, which provides an API for generating json and HTML reports for validation session results. UI buttons to create these reports will be added later.
  • Added Unity Event Validator.
  • Added info below the execute fix button when there is no fix to draw.
  • Added MaterialValidator and improved material and shader validation.
  • Added No Empty Strings rule.
  • Finally added Reference Required By Default rule.
  • RequireComponent now offers to automatically add the missing component, either on the prefab root, or the gameobject itself.

Fixes

  • Fixed a bug where issues would not always disappear when an object was deleted.
  • Fixed bug where validation couldn't be enabled or disabled.
  • Fixed case where changing asset filters would not immidiatly be applied.
  • Fixed case where fixes to missing mesh renders would not always work.
  • Fixed case where ObjectAddress would locate the wrong object in a scene after hierarchy changes had been made after a scan finished. This would manifest as the wrong objects being selected on clicking issue entries in the issue overview.
  • Fixed issue where Odin Validator in source mode would have an ambiguous type reference compiler error between UnityEditor.SerializationUtility and Sirenix.Serialization.SerializationUtility in GlobalSessionConfigData.cs.

Changes

  • Made several major and minor changes and improvements to the validator window UI to improve UX.
  • Embedded shaders and materials into source code.
  • Issues will now more quickly disappear when a scene object is deleted.
  • The plus button under the rules tab in the Odin Validator window now only offers to create rules and not validators, to avoid confusion between the two concepts.

Odin Inspector

Additions

  • Added ImGUITimeHelper.
  • Added OdinEditorResources to Sirenix.OdinInspector.Editor which contains logos of Odin and other things.
  • Added PropertyTree.SerializationBackend property, which controls SerializationBackend to use for the PropertyTree instance's root, and which overrides any default behaviour. Also added overloads to PropertyTree.Create that lets you pass in an initial SerializationBackend to use.
  • Added Sirenix.Utilities.Editor.CleanupUtility class to help clean up objects and disposables upon app domain reloads.
  • Added TakeFromLeft, TakeFromRight, TakeFromTop and TakeFromBottom to RectExtensions.
  • Made RequiredInPrefabInstances & RequiredInPrefabAssets fixable.

Fixes

  • Dragging a texture asset set to be a sprite onto a PreviewField for a sprite member now accepts the drag, assigning the texture's first sprite as the value.
  • Fixed bug where the InspectorProperty for a method with a dot "." in its signature (such as when it had nested types as arguments) would have its name truncated to whatever came after the last dot in the name.
  • Fixed case where a member with a single letter name could not be targeted as a member reference in a resolved string, IE, [ShowIf("a")] wouldn't work for example.
  • Fixed case where drawing aliased methods (such as when other members in base types have the same name as the method) with parameters would cause exceptions to the be thrown in the ButtonParameterPropertyResolver, preventing drawing of the method/button.
  • Fixed case where EditorIcons textures would leak upon app domain reloads without being cleaned up.
  • Fixed collection resolvers not applying to root properties of property trees, causing an inspected list to not be drawn as a list, when for example using OdinEditorWindow.InspectObject(theList).
  • Fixed issue where the UndoTracker would start mixing up which objects were in which undo groups when a lot of undoing and redoing was done, which would cause it to start sending wrong undo and redo events for the wrong objects sometimes.

Changes

  • Removed the obsoleted LinqExtensions.ToHashSet overloads entirely, as enough time has passed since they were obsoleted.
  • Better Require Component error messages.

Odin Serializer

Fixes

  • Fixed case where, in cases where no AOT support has been generated for serialized primitive arrays, the weak fallback formatter for primitive arrays would fail to deserialize the values properly and the array would be null after deserialization.

Version 3.1.0.11 Beta

Odin Validator

Additions

  • Added ISelfValidator interface, which lets any type specify validation logic for itself which will be executed as part of validation as though a custom validator has been written for it.
  • Added ValidatorSeverity overload to ValidationResults, which registers an error or warning depending on the severity, and doesn't do anything if the severity is set to ignore.
  • Added MeshRendererValidator rule that detects missing materials, broken materials, and prefab modifications in mesh renderers.
  • Right clicking issues from scenes now presents a "Ping scene asset" option.
  • Added Debug mode in validator settings to hunt down bugs during bulk fixing and show additional information in issue info.

Fixes

  • Validation rules will now deserialize with default values for new fields that were added after the rule was last changed and saved.
  • Fixed Validator about page not rendering the Odin Validator logo.
  • Prevented "FormatException: Unrecognized Guid format" errors from occuring when assets was removed outside of Unity.
  • Fixed error where validators for SceneAsset and SceneValidators would come in conflict and wipe out each other's validation results in the validation overview whenever they were revalidated, such as when visible issues were being continuously validated.
  • Fixed layout error logs that would occur when running many fixes that added/removed components. There is a separate issue where layout errors still occur after running some kinds of fixes; we are still working on resolving those, but this should take care of most of them.

Odin Inspector

Fixes

  • Fixed Button attribute's DirtyOnClick still causing scenes and assets to be marked dirty when undoable changes are made. This means undo is now disabled for changes made by button clicks when DirtyOnClick is set to false.

Odin Serializer

Features

  • Integrated the Easy AOT feature which has been offered as an experimental testing build for a long time. This feature means Odin Serializer can function without AOT generation support in many cases where it would have failed before. This is a very large change to make which required major reworks and additions to the serializer, hence why it has been in testing for so long. As it has been reported stable and functioning, we've finally chosen to add it.

Fixes

  • EditorOnlyModyConfigUtility will now not throw exceptions when drawing the editor only mode warning for SerializedX classes in an editor only mode distribution of Odin.

Version 3.1.0.10 Beta

Odin Validator

See page above for information about changes and additions to the validator in 3.1. The validator has been rewritten from scratch in 3.1 and can form a parallel install with the pre-3.1 validator, so patch notes from the prior version would not make much sense.

Odin Inspector

Optimizations

  • Added lazy fetching of PrefabUtility.GetPropertyModifications for a PropertyTree's PrefabModificationHandler, so it is only fetched when it is requested on any given frame, as fetching it is very slow. More optimizations are coming to this, such that fetched modifications are only updated when they actually change, instead of every frame they are actually requested, which is still the case even with this change.
  • Attribute expressions are now cached for a time to prevent constant repeated parsing and compilation of the same expressions in cases such as validation scanning.
  • PrefabModificationHandler is now cached and reused properly when PropertyTree instances are cached and reused.
  • Drastically increased performance of validation and project scanning over prior versions of Odin. Changes made are too numerous to list exhaustively, and cover the entire codebase. We have seen 10-100x improvements in scan time, though scans of very large projects can still take a while. In most of our test cases, Unity's asset and scene loading accounts for the majority of the validation scan time.
  • EditorOnlyModeConfig now has far less of an impact on startup time. Where before it could take seconds, it will now in most cases take <3 milliseconds to initialize.

Additions

  • Added SdfIcons to Odin, a new class for drawing icons in the editor. These are a set of icons which are drawn using signed distance fields, meaning they scale to being drawn precisely at any resolution. Long term, these will replace the EditorIcons class. The SdfIcons class includes the entirety of the Bootstrap icon library. You can search and preview available icons using the new Tools > Odin Inspector > SDF Icon Overview window.
  • Added PlaceholderLabel attribute, which draws a placeholder label inside a text field while the text field is empty.
  • Added three new attributes: RequiredInPrefabAssets, DisallowPrefabModifications and RequiredInPrefabInstances.
  • Added EnumTypeUtilities and cleaned up EnumSelector.
  • Added leak detection for Odin PropertyTree instances, which will print a helpful message to the debug log when a PropertyTree is garbage collected without first having been disposed, and which contains information about where the tree was allocated to help track down the source of the leak.
  • Added MessagBox overload in SirenixEditorGUI that takes a GuiStyle.
  • Added MiniLabelCentered to SirenixGUIStyles.
  • Added PropertyTree.EnableLeakDetection setting.
  • Added RecordUndoForChanges to PropertyTree, that lets you specify whether or not the undo should be recorded.
  • Added Sirenix.OdinInspector.Editor.UndoTracker utility that can be used to track when objects are modified, as well as when those modifications are undone and redone on which objects.
  • Added UnityTypeCacheUtility.GetTypesWithAttribute proxy methods.
  • Added various OdinMenuTree colors to SirenixGuiStyles.
  • Added EditorPref<T> with subtypes EditorPrefBool, EditorPrefString, EditorPrefFloat, EditorPrefInt and EditorPrefEnum<T> as a convenient utility wrapper for values stored in editor prefs.
  • Added ProjectSetting<T> with subtypes ProjectSettingBool, ProjectSettingString, ProjectSettingFloat, ProjectSettingInt and ProjectSettingEnum<T> as a convenient utility for a value which can either be stored serialized in a project asset, or overwritten on a local machine basis by being stored in editor prefs. As such, this enables having settings values which can be adjusted in a project but also controlled on a per-machine basis with local user overrides for improved collaboration possibilities. Also added ProjectSettingKeyAttribute, and ProjectSettingsGlobalConfig<T> as a new GlobalConfig type which supports storing ProjectSetting values via ProjectSettingKey attributes set on the settings members.
  • Added .Slice() extension method to strings which is the same as .Slice(0).
  • Added TrimStart(), TrimEnd() and Trim() to StringSlice.

Improvements

  • GuiHelper.GetAssetThumbnail now gives more accurate thumbnail icons.

Fixes

  • Added bounds check to StringSlice's indexer.
  • CustomValueDrawer now also works for drawing methods and expressions that return void; in this case, no value will be set automatically.
  • Fixed a bug where OdinEditorWindow's without a scroll bar would not paint the background correctly.
  • Fixed bug where EnumSelector.DrawEnumField didn't draw the label provided.
  • Fixed case where setting new targets on a property tree would prevent prefab modifications from working properly.
  • Fixed issue where the ToggleGroup attribute would not respect setting CollapseOthersOnExpand to false when it has multiple members.
  • Fixed several issues where PropertyTrees was not properly disposed.
  • InspectorTypeDrawingConfigDrawer now uses SafeGetTypes() when retrieving types from assemblies, to protect itself from corrupt loaded assemblies.
  • PropertyTree's now ApplyChanges when disposed.
  • Range, MinMaxSlider, MaxValue and MinValue attribute drawers no longer immediately clamp the value to valid values when drawing; values are now only clamped to valid ranges when user input changes the values so that data does not mutate merely by inspecting it.
  • Reverting prefab modifications on a value now triggers OnValueChanged for that value.
  • Fixed multiple cases where TypeSearchIndex would incorrectly match many different types in ways that would later be filtered away. Type matching is now more precise to begin with, without need for further filtering.

Changes

  • Type matching for all drawers, validators, resolvers and processors has been changed to allow for polymorphic matching on non-generic targets. IE, public class UnityObjectDrawer : OdinValueDrawer<UnityEngine.Object> will now in fact match on and draw all UnityEngine.Object instances without needing to be generic and using generic constraints to match on those types instead.
  • TypeSearchIndex's match search API now requires you to pass in TargetMatchCategory values for each match target, both when indexing types and when matching them, in order to more precisely distinguish between which things to match as values and as attributes.
  • InspectorProperty.NiceName for ordered collection elements now takes the form of "CollectionNiceName [index]" instead of just "index".
  • Marked various obsolete members as being hidden from IDE intellisense
  • All debug symbol files for Odin's assemblies are now marked portable for better cross platform and cross Unity version compatibility.
  • Removed all deprecated features from Odin Validators.
  • Removed obsolete OpenGlobalConfigWindow.
  • SirenixGUIStyles.RichTextLabel now word wraps.
  • The overload of GUIHelper.RequestRepaint that takes an argument of how many frames it should repaint has been deprecated.