インスペクタを圧倒的に使いやすくするアセット、Odin
Unityのアセットの中でもトップクラスに人気のアセット、Odinの使い方を紹介します。
使い方はカンタン。プログラムを書く時に、Odinに対応したワードをつけるだけです。
たとえば、以下のように書くことで、
[Button("ログ出すよ")]
public void LogButton()
{
Debug.Log("ボタンが押されたよ!");
}
インスペクタ上にボタンが出現し、特定のメソッドの動きをデバッグすることがカンタンになります。

今回はOdinを使うとどんなことが出来るかまとめました、ぜひチートシートとしてご活用ください!
変数の属性セット
属性名 | 説明 |
---|---|
[Title("タイトル")] | 見出しテキストを表示 |
[LabelText("表示名")] | フィールド名をラベルに変更 |
[Tooltip("説明文")] | ツールチップを表示 |
[FoldoutGroup("グループ名")] | 折りたたみグループ |
[BoxGroup("ボックス名")] | ボックスで囲むグループ |
[TabGroup("タブ名")] | タブ切り替え表示 |
[HorizontalGroup("横並び項目")] | 横に複数フィールドを並べる |
[HideLabel] | ラベル非表示(インライン編集などに) |
[Title("タイトル")]
タイトル分け出来る、変数のグルーピングに有用。

[LabelText("表示名")]
変数名のインスペクタ上での表記を変えられる。

[Tooltip("説明文")]
変数にマウスオーバーすると出てくる説明文を入れられる。

[FoldoutGroup("グループ名")]
折りたたみグループを作る。

[BoxGroup("ボックス名")]
ボックスでくくることが出来る。

[TabGroup("タブ名")]
タブ切り替え出来る。

[HorizontalGroup("横並び項目")]
横並びで表示出来る。

[ShowIf("条件式")]
/[HideIf("条件式")]
例えばこんな風に書きます。
public bool IsOnline = true;
[ShowIf("IsOnline")]
public string onlineText;
isOnlinenにチェックが入っている時だけ、onlineTextが表示され、

チェックが入っていないと、onlineTextも表示されません。

[EnableIf("条件式")]
/[DisableIf("条件式")]
こんな風に書きます。
public bool IsOnline = true;
[EnableIf("IsOnline")]
public string onlineText2;
[DisableIf("IsOnline")]
public string offlineText2;
isOnlinenにチェックが入っている時だけ、onlineText2が入力出来る状態になり、

それ以外の時は入力出来ません。

[ReadOnly]
インスペクタで表示は出来るが入力出来なくなります。

値制限・入力補助
属性名 | 説明 |
---|---|
[Range(0, 100)] | スライダー表示(int, float) |
[MinValue(0)] / [MaxValue(100)] | 最小/最大値制限 |
[ProgressBar(0, 100)] | プログレスバー表示 |
[ColorUsage(true, true)] | HDR(発光するやつ)を指定 |
[ValueDropdown(nameof(リストメソッド))] | ドロップダウンメニューで選択 |
[AssetsOnly] | シーンからの参照を禁止しアセットからのみ参照可能とする |
[Range(0, 100)]
Odin無くても出来るが一応。スライダーで値を設定出来る。

[MinValue(0)] / [MaxValue(100)]
値の最小値、最大値とインスペクタの値が異なっているとエラーメッセージを表示してくれる。

[ProgressBar(0, 100)]
進捗で値を表示。正直使い所は分かっていない。

[ColorUsage(true, true)]
インスペクタからHDRカラーを指定出来る。

[ValueDropdown(nameof(リストメソッド))]
たとえばこんな感じで書きます。
[ValueDropdown(nameof(SelectableValues))]
public int selectedValue;
// 候補リストを返すメソッド or プロパティ
private IEnumerable<int> SelectableValues => new[] { 100, 200, 300 };
するとこんな感じでリスト選択が可能になります。

Enumでいいじゃんと思うかもしれないですが、Enumの中からさらに抽出して表示したいときに有用。
KeyCode型で選択しようとすると無限にあるので、選択肢を減らす、みたいな使い方が良いと思います。
参考:https://kan-kikuchi.hatenablog.com/entry/Odin_ValueDropdown
[AssetsOnly]
Prefabを指定するときに重宝。シーン内のGameObjectが、選択の候補に出なくなります。

リスト表示
属性名 | 説明 |
---|---|
[ListDrawerSettings] | List/Arrayの表示方法を調整 |
[DictionaryDrawerSettings] | Dictionaryをインスペクタに表示 ※ MonoBehaviour ではなく、SerializedMonoBehaviour を継承する必要あり! |
[ListDrawerSettings]
Odinを入れるだけで、配列やLIst表示の見た目が変わるが、そのときの挙動を制御出来ます。
[ListDrawerSettings(ShowPaging = false, DraggableItems = true, NumberOfItemsPerPage = 5)]
ShowPagingで、リストのページングを可能に出来ます。デフォルトはtrueです。

[DictionaryDrawerSettings]
Unity標準のMonobehaviour
クラスではDictionaryを表示出来ないため、SerializedMonoBehaviour
を継承する必要があります。

こんな風に書きます。
[DictionaryDrawerSettings(KeyLabel = "アイテム名", ValueLabel = "所持数", DisplayMode = DictionaryDisplayOptions.OneLine)]
public Dictionary<string, int> itemCounts = new()
{
{ "ポーション", 5 },
{ "エーテル", 3 },
{ "エリクサー", 1 }
};
すると、以下のようにインスペクタで表示されます。見やすいですね。

ScriptableObjectに使える属性
属性名 | 説明 |
---|---|
[TableList] | テーブル形式で表示 ※SerializedScriptableObjectを継承する必要あり |
[InlineEditor] | ScriptableObjectの中身を表示 |
[TableList]
こんな風に書きます。
public class CharacterDataList : SerializedScriptableObject
{
[TableList(AlwaysExpanded = true)]
public List<CharacterData> characters = new();
}
[System.Serializable]
public class CharacterData
{
public string Name;
public int HP;
public int MP;
public Sprite Icon;
}
すると、表形式で入力が出来ます。

[InlineEditor]
ScriptableObjectなどの参照をインライン展開して中身を直接編集できます。
文で書くと意味わからないですが、たとえば
[InlineEditor]
public CharacterDataList characterDataList;
のように書くと、
ScriptableObjectの中身を参照している別のクラスから編集出来ます。

上述のTableListと組み合わせて使うとより効果的です。
インスペクタ内でのメソッド実行
属性名 | 説明 |
---|---|
[Button] | Inspector上にボタンを表示してメソッドを呼び出し |
[Button]
多分、Odin使っている人が一番使っている属性。
インスペクタにボタンを表示して好きなときに呼び出せます。
[Button("ログ出すよ")]
public void LogButton()
{
Debug.Log("ボタンが押されたよ!");
}
こんな風に書くと、インスペクタにボタンが出現します。

また、Playモードでなくともこのボタンのメソッドは呼び出すことは出来ます。
ただ、コルーチンなどの非同期処理をPlayモードになっていないで動かすと、うまく動かないことがほとんどです。非同期処理は、必ずPlayにしてから動かすようにしましょう!
まとめ
以上、インスペクタを”圧倒的に”使いやすくするOdinのチートシート紹介でした。
公式マニュアル(英語)
他にもこんな属性使っているよ、というものがあればコメントくださいね、定期。
それでは、素敵なゲーム制作ライフを!
コメント