ScriptableObject OnValidate() 活用ガイド

概要

  • ScriptableObject とは、シリアライズ可能なデータコンテナをアセットとして管理し、設定やステータス情報をコードから切り離して扱う仕組み。
  • OnValidate() はインスペクタ上でプロパティが変更された直後やスクリプト再コンパイル時に呼び出される Editor 専用のコールバック。

OnValidate() の活用ポイント

  • 範囲チェック&自動補正
    • 入力値を Mathf.Clamp や Mathf.Max で制限し、妥当性を保つ。
  • 依存値の再計算
    • 関連フィールドを変更に応じて自動更新(例:最大値変更時に現在値を上限内に収める)。
  • アセット名や参照チェックの自動化
    • 内容に応じたアセット名付けや、参照アセットの存在確認を行い、手動作業を削減。

実装例

using UnityEngine;

public class ExampleValidator : MonoBehaviour
{
    [Header("数値設定 (0~100)")]
    public int someValue = 50;

    [Header("比率設定 (0.0~1.0)")]
    public float ratio = 0.5f;

    private void OnValidate()
    {
        // 範囲チェック&クランプ
        someValue = Mathf.Clamp(someValue, 0, 100);
        ratio = Mathf.Clamp01(ratio);

        // 名前を自動更新(オプション)
        gameObject.name = $"Validator_V{someValue}_R{ratio:0.00}";
    }
}

利点(メリット)

  1. 即時フィードバック:Inspector 上で不正な値を自動補正し、データの信頼性を向上。
  2. 整合性担保:依存関係のフィールド間ズレを防ぎ、ヒューマンエラーを減少。
  3. 開発効率向上:アセット名付けや参照チェックなど定型処理を自動化し、手動修正を削減。

注意点(デメリット・落とし穴)

  • Editor 専用:ビルド後の実行時には呼ばれない。
  • 処理の重さ:頻繁に呼ばれるため、重いループや I/O、AssetDatabase 操作は避ける。
  • 呼び出し順序:複数 OnValidate() が相互依存する場合、タイミングに注意。

推奨ケース

  • ゲームバランス調整データ:数値調整が頻繁なアセットの範囲チェック。
  • UI/ビヘイビア設定アセット:見た目や動作の微調整時に入力ミスを防止。
  • シリアライズデータの整形/名前付け:JSON や CSV 入出力前提データの自動整形。

設計時チェックリスト

  1. この処理は Inspector 編集時のみ必要か?
  2. 毎回実行しても Editor のレスポンスに問題ないか?
  3. 実行時やビルド時のチェックを別実装で担保できるか?

以上のポイントを踏まえ、軽量で Editor 向けの処理に限定すれば、OnValidate() を積極的に活用してエディタ上の品質担保と開発効率化を図れます。

OnValidate() の適用範囲

  • ScriptableObject だけでなく、MonoBehaviour や他の UnityEngine.Object 派生クラスでも使用可能です。
  • MonoBehaviour に実装することで、ゲームオブジェクトのインスペクタ操作時にも同様に OnValidate() が呼び出されます。
  • Editor 専用機能のため、ビルド後の実行時には OnValidate() は呼ばれません。

デバッグ

Posted by hidepon