Odin Project Validator comes with three different validation profile types: AssetValidationProfile, which scans assets using the AssetDatabase; SceneValidationProfile, which scans a set of scenes; and CollectionValidationProfile, which is used to combine multiple other validation profiles together.
These three validation profile types cover most use-cases, but if you have data stored in a database or a JSON file and you want to validate that, or if you otherwise need highly custom behaviour, then you'll need to create a custom validation profile.
This is done by implementing the IValidationProfile interface. We suggest that your custom profile be a regular C# type, and not a Unity object. It is better that you store your custom validation profile instance in a host scriptable object asset, so it can be easily configured and added to the the Validation Profile Manager. We provide a handy ValidationProfileAsset
using Sirenix.OdinInspector.Editor.Validation;
using Sirenix.OdinValidator.Editor;
using System.Collections.Generic;
using UnityEngine;
using System;
[CreateAssetMenu]
public class MyDatabaseValidatorAsset : ValidationProfileAsset<MyDatabaseValidator>
{
}
[Serializable]
public class MyDatabaseValidator : IValidationProfile
{
public string Name;
public string Description;
public string DatabaseFilePath;
string IValidationProfile.Name { get => this.Name; set => this.Name = value; }
string IValidationProfile.Description { get => this.Description; set => this.Description = value; }
Texture IValidationProfile.GetProfileIcon() => Sirenix.Utilities.Editor.EditorIcons.FileCabinet.Active;
object IValidationProfile.GetSource(ValidationProfileResult entry) => entry.Source;
IEnumerable<IValidationProfile> IValidationProfile.GetNestedValidationProfiles() { yield break; }
public IEnumerable<ValidationProfileResult> Validate(ValidationRunner runner)
{
var imaginaryDatabase = new ImaginaryDatabase();
var items = imaginaryDatabase.GetAndDeserializeAllImaginaryItems();
for (int i = 0; i < items.Length; i++)
{
var item = items[i];
var results = new ValidationProfileResult();
results.Name = item.Name;
results.Profile = this;
results.Progress = (float)i / items.Length;
results.Source = item;
results.Results = new List<ValidationResult>();
// Calling ValidateValue will use all defined Validators, and populate the results with errors and warnings.
// You can also manually add your own custom ValidationResult here, but it's better to write a
// CustomValidator instead, so that Odin Inspector can pick them up and show them to you in the editor.
runner.ValidateValue(item, null, ref results.Results);
yield return results;
}
}
}