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によりシリアライズされます。
インスペクターは、こんな感じになります。
さて、このSerializeExampleクラスのコードは、RiderのOdinサポートによりとても読みやすくなりました。サポート前後を比べてみましょう。
サポート前 (Rider 2023.3) | サポート後 (Rider 2024.3) |
---|---|
サポート前のRider 2023.3は、本来は必要なidNameDictionaryのSerializeField属性に、「Redundant 'SerializeField' attribute」と表示しています。また、必要なのに、消したほうがいいようなシンタックスハイライトをしています。
一方、サポート後のRider 2024.1以降は、シンタックスハイライトも変わり、「このフィールドはOdinでSiriarizeされているよ」とCode VisionでRiderが教えてくれるようになりました。
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;
}
次のようなインスペクターになります。
Rider 2024.1から、定義済みのGroup名に対して、Code Completionが有効になりました。これにより、コード入力の速さが向上し、コード入力のミスも減ります。
またRider 2024.1から、誤ったGroupの使い方をしていると、Code Inspectionsで教えて(警告して)くれるようになりました。
次のコードのように、まだ定義していないグループのパスに対して、警告してくれます。
次のコードのように、同じパスで違うグループの型を使っていると警告してくれます。
次のコードのように、同時に一つのフィールドが違うグループに所属していると警告してくれます。
色をRider上で表示
Odin Inspectorには、GUIColorクラスというエディターの色を設定する属性が用意されています。
Rider 2024.1から、GUIColorを使って設定している色が、Rider上で表示されるようになりました。
サポート前 (Rider 2023.3) | サポート後 (Rider 2024.3) |
---|---|
また、GUIColorで指定した色に対するContext Actionsから「Pick color from palette」を選択すると、
次の画像の様に、Color Pickerが表示されます。Color Pickerで色を選択すると、その色にGUIColorの色指定が更新されます。
$とメンバー名を引数にとる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」が表示されていることに注目してください。
このようなOdin Inspectorの「$とメンバー名」を利用するコードに対して、シンタックスハイライトやCode Completion、リネームやジャンプがサポートされました。
サポート前 (Rider 2023.3) | サポート後 (Rider 2024.3) |
---|---|
いろいろなCode CompletionやCode Inspectionsも
Rider 2024.1から、いくつかの属性に対して、Code Completionが効くようになりました。
Rider 2024.1から、さまざまな属性の内容・設定に応じて、Code Inspectionsが表示されるようになりました。
まとめ
Riderはいいぞ!Odinはいいぞ!好きなIDEと好きなアセットのコラボ、嬉しい!