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.
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.
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;
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.
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>()));
}
}
}
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);
}));
}
}
}
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.
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.
And many, many more to come during the beta..
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");
}
}
}
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);
}
}
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.
You can access the new validator from a couple of different places.
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.
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;
}
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.
DynamicObjectAddress.GetAllExistingAddresssesForAssetGuid()
result.AddError("error message").WithModifyRuleDataContextClick(..)
which makes it easy to modify rule settings when right clicking issues that come from rules.result.AddError("...").WithMetaData("Name", 10f, new RangeAttribute(0, 20), new InfoBoxAttribute("Hello"));
result.AddError("").WithButton("Name", () => { Debug.Log("Button was clicked"); })
result.AddError().WithFix(..).WithMetaData("name", value)
result.AddError().WithOnSceneGUI()
to be consistent with the non editor version accessed through ISelfValidator. You can still access it though SceneView.currentDrawingSceneView.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.