Odin使いこなしチートシート

目次

インスペクタを圧倒的に使いやすくするアセット、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です。

ページングありの場合、1/3のように表示される

[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のチートシート紹介でした。


公式マニュアル(英語)

他にもこんな属性使っているよ、というものがあればコメントくださいね、定期。

この記事がよかったら、ぜひX(@mitakamikata)もフォローしてくださいね。
それでは素敵なゲーム制作ライフを!

ゲームの素材探しに困っていませんか?

ゲームのUI素材探しなら、Free Game UI Assets がオススメです!
完全無料で著作権フリーな、UIのアセット素材がなんと1700以上使い放題!

ぜひ、こちらもチェックしてみてください。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

ゲーム制作の敷居を下げ、もっと多くの人にゲーム作りを楽しんでもらうために、ゲームをカンタンに作る方法を”網羅的に”解説しています。
よかったらブックマークお願いします。
Twitter(X)もよければフォローお願いします。

コメント

コメントする


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

目次