5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RiderがOdin Inspectorをサポートした!

Posted at

Jet Brains社の.NET 向けIDE、Rider。そんなRiderはバージョン2024.1から、Unityの人気アセットOdin Inspectorをサポートするようになりました。

本投稿では、RiderとOdinの概要を紹介し、RiderのOdinサポートの中身を簡単に紹介します。

Riderとは?

RiderはJetBrains社の.NET向け有償IDEです。メインは.NETですが、Unityをはじめとしたゲーム開発や、Web開発など、.NETを中心として幅広いテクノロジーに活用できます。また、Mac・Windows・LinuxとマルチプラットフォームでRiderを利用可能です。

先日、Riderは非商用利用であれば、無料で利用できる様になりました。

Odinとは?

OdinはSirenix社のUnity向け有償Editor拡張アセットです。

非常に便利なエディター拡張を多数提供する「Odin Inspector」。
UnityでDictionary<TKey, TSource>もシリアライズできる「Odin Serializer」。
そしてインスペクターで設定した値やシーンなどが想定していない状態になっていないかバリデーションできる「Odin Validator」。

があります。

「Odin Inspector and Serializer」はセットになっていたり、コード同梱版があったり、エンタープライズ版があったり、プランの収入制限があったりします。詳しくは、Asset Storeと公式サイトを確認してください。

サポート、パートナーシップの経緯

次の公式ブログによると、2023年11月にアムステルダムで開催されたUniteにて、JetBrainsのチームとOdinのチームが会って、話し合いが行われたそうです。それからパートナーシップ、Rider 2024.1でのOdinの正式サポートと続いたようです。

RiderのOdinサポートの中身

ここからは、RiderのOdinサポートの中身を簡単に紹介します。

Odin Serializerでシリアライズされていることを表示

「このフィールドは、Odinでシリアライズされているよ!」とRiderが教えてくれるようになりました。

次のようなSerializeExampleクラスを使って説明します。

using System.Collections.Generic;
using Sirenix.OdinInspector;
using UnityEngine;

public class SerializeExample : SerializedMonoBehaviour
{
    [SerializeField] private string message;
    [SerializeField] private Dictionary<int, string> idNameDictionary;
}

messageフィールドはUnityの仕様通り、シリアライズされます。
idNameDictionaryフィールドは、通常ではシリアライズされませんが、Odin Serializerによりシリアライズされます。

インスペクターは、こんな感じになります。

スクリーンショット 2024-11-29 22.48.54.png

さて、このSerializeExampleクラスのコードは、RiderのOdinサポートによりとても読みやすくなりました。サポート前後を比べてみましょう。

サポート前 (Rider 2023.3) サポート後 (Rider 2024.3)
before_serialize.png after_serialize.png

サポート前のRider 2023.3は、本来は必要なidNameDictionaryのSerializeField属性に、「Redundant 'SerializeField' attribute」と表示しています。また、必要なのに、消したほうがいいようなシンタックスハイライトをしています。

スクリーンショット 2024-11-29 22.48.24.png

一方、サポート後のRider 2024.1以降は、シンタックスハイライトも変わり、「このフィールドはOdinでSiriarizeされているよ」とCode VisionでRiderが教えてくれるようになりました。

スクリーンショット 2024-11-29 23.01.51.png

Group属性のCode Analysis と Code Completion

Odin InspectorのTabGroupやBoxGroupなどGroup系の属性を使うことで、インスペクターの要素をグループ化し、各項目が管理しやすくなります。

次のようなコードで、

using Sirenix.OdinInspector;
using UnityEngine;

public class GroupExample : MonoBehaviour
{
    [TabGroup("Group0")] [SerializeField] private string nameGroup0;
    [BoxGroup("_DefaultTabGroup/Group0/SubGroup00")] [SerializeField] private string nameSubgroup00InGroup0;
    [BoxGroup("_DefaultTabGroup/Group0/SubGroup00")] [SerializeField] private int value0Subgroup00InGroup0;
    [BoxGroup("_DefaultTabGroup/Group0/SubGroup00")] [SerializeField] private int value1Subgroup00InGroup0;
    [BoxGroup("_DefaultTabGroup/Group0/SubGroup01")] [SerializeField] private string nameSubgroup01InGroup0;
    [BoxGroup("_DefaultTabGroup/Group0/SubGroup01")] [SerializeField] private int value0Subgroup01InGroup0;
    [BoxGroup("_DefaultTabGroup/Group0/SubGroup01")] [SerializeField] private int value1Subgroup01InGroup0;

    [TabGroup("Group1")] [SerializeField] private string nameGroup1;
    [BoxGroup("_DefaultTabGroup/Group1/SubGroup10")] [SerializeField] private string nameSubgroup10InGroup1;
    [BoxGroup("_DefaultTabGroup/Group1/SubGroup10")] [SerializeField] private int value0Subgroup10InGroup1;
    [BoxGroup("_DefaultTabGroup/Group1/SubGroup10")] [SerializeField] private int value1Subgroup10InGroup1;
    [BoxGroup("_DefaultTabGroup/Group1/SubGroup11")] [SerializeField] private string nameSubgroup11InGroup1;
    [BoxGroup("_DefaultTabGroup/Group1/SubGroup11")] [SerializeField] private int value0Subgroup01InGroup1;
    [BoxGroup("_DefaultTabGroup/Group1/SubGroup11")] [SerializeField] private int value1Subgroup01InGroup1;
}

次のようなインスペクターになります。

スクリーンショット 2024-11-29 23.42.12.png

Rider 2024.1から、定義済みのGroup名に対して、Code Completionが有効になりました。これにより、コード入力の速さが向上し、コード入力のミスも減ります。

スクリーンショット 2024-11-29 23.38.31.png

またRider 2024.1から、誤ったGroupの使い方をしていると、Code Inspectionsで教えて(警告して)くれるようになりました。

次のコードのように、まだ定義していないグループのパスに対して、警告してくれます。

スクリーンショット 2024-11-29 23.44.38.png

次のコードのように、同じパスで違うグループの型を使っていると警告してくれます。

スクリーンショット 2024-11-29 23.50.19.png

次のコードのように、同時に一つのフィールドが違うグループに所属していると警告してくれます。

スクリーンショット 2024-11-29 23.52.08.png

色をRider上で表示

Odin Inspectorには、GUIColorクラスというエディターの色を設定する属性が用意されています。

Rider 2024.1から、GUIColorを使って設定している色が、Rider上で表示されるようになりました。

サポート前 (Rider 2023.3) サポート後 (Rider 2024.3)
スクリーンショット 2024-11-30 0.11.47.png スクリーンショット 2024-11-30 0.03.44.png

また、GUIColorで指定した色に対するContext Actionsから「Pick color from palette」を選択すると、

スクリーンショット 2024-11-30 0.03.54.png

次の画像の様に、Color Pickerが表示されます。Color Pickerで色を選択すると、その色にGUIColorの色指定が更新されます。

スクリーンショット 2024-11-30 0.04.03.png

$とメンバー名を引数にとるOdin属性のサポート

Odin Inspectorには、「$」とメンバー名を使った記法があります。例えば、次のコードでは、

using Sirenix.OdinInspector;
using UnityEngine;

public class ResolvingExample : MonoBehaviour
{
    [Title(title: "enemy name", subtitle: "$enemyName")] 
    [SerializeField] private string enemyName;
}

次のスクリーンショットのようなインスペクターになります。subtitleとして「enemyName」フィールドに設定した文字列「Strong Dragon」が表示されていることに注目してください。

スクリーンショット 2024-11-30 0.33.52.png

このようなOdin Inspectorの「$とメンバー名」を利用するコードに対して、シンタックスハイライトやCode Completion、リネームやジャンプがサポートされました。

サポート前 (Rider 2023.3) サポート後 (Rider 2024.3)
スクリーンショット 2024-11-30 0.33.06.png スクリーンショット 2024-11-30 0.37.42.png

スクリーンショット 2024-11-30 0.38.25.png

いろいろなCode CompletionやCode Inspectionsも

Rider 2024.1から、いくつかの属性に対して、Code Completionが効くようになりました。

スクリーンショット 2024-11-30 0.53.18.png

スクリーンショット 2024-11-30 0.52.48.png

Rider 2024.1から、さまざまな属性の内容・設定に応じて、Code Inspectionsが表示されるようになりました。

スクリーンショット 2024-12-01 22.55.17.png

まとめ

Riderはいいぞ!Odinはいいぞ!好きなIDEと好きなアセットのコラボ、嬉しい!

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?