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

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

https://blog.jetbrains.com/dotnet/2024/03/20/sirenix-s-odin-inspector-support-comes-to-rider-a-jetbrains-ide/

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

# Riderとは？

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

https://www.jetbrains.com/ja-jp/rider/

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

https://blog.jetbrains.com/ja/blog/2024/11/28/webstorm-rider/

# Odinとは？

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

https://www.odininspector.com/

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

があります。

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

* [Odin Inspector and Serializer (Asset Store)](https://assetstore.unity.com/packages/tools/utilities/odin-inspector-and-serializer-89041)
* [Odin Validator (Asset Store)](https://assetstore.unity.com/packages/tools/utilities/odin-validator-227861)
* [Pricing（公式ページ）](https://www.odininspector.com/pricing)

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

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

https://blog.jetbrains.com/dotnet/2024/03/20/sirenix-s-odin-inspector-support-comes-to-rider-a-jetbrains-ide/

# RiderのOdinサポートの中身

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

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

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

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

```csharp
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/486cf1f9-15ba-b54e-dd5b-0fc5d4583ea6.png)

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

| サポート前 (Rider 2023.3) | サポート後 (Rider 2024.3)|
|:---:|:---:|
|![before_serialize.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/18addfa9-d4b7-90b5-fe5e-aa7c333b2c68.png) | ![after_serialize.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/de989eff-c124-697c-82a0-bac14f9c63c3.png) |

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

![スクリーンショット 2024-11-29 22.48.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/d58496b5-af10-86e9-80e7-6dae8c80af64.png)

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

![スクリーンショット 2024-11-29 23.01.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/92038b7d-ffa1-b793-3267-1d6f32b25e22.png)

## Group属性のCode Analysis と Code Completion

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

次のようなコードで、

```csharp
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/53f6d8ae-c7ab-0be3-346b-04cb6c7fb52a.png)

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


![スクリーンショット 2024-11-29 23.38.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/f56162f6-670d-4053-d023-c926b123d8a5.png)

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

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

![スクリーンショット 2024-11-29 23.44.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/5954f53d-6351-25ca-1ce9-8ab9c445ea31.png)

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

![スクリーンショット 2024-11-29 23.50.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/c0a8c67d-6a00-5751-782d-9d4380d309c3.png)

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

![スクリーンショット 2024-11-29 23.52.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/01091e3b-d702-b769-fdd3-0380ebcad468.png)

## 色をRider上で表示

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

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

| サポート前 (Rider 2023.3) | サポート後 (Rider 2024.3)|
|:---:|:---:|
| ![スクリーンショット 2024-11-30 0.11.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/c17d74ec-b0da-f0af-f20f-f1785849a3b4.png) | ![スクリーンショット 2024-11-30 0.03.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/4cd13239-3e91-9a21-fb55-02df19e492de.png) |

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

![スクリーンショット 2024-11-30 0.03.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/282f6315-af22-396c-5866-065a5ba6c0c1.png)

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

![スクリーンショット 2024-11-30 0.04.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/e1c70dc8-7742-9dfd-e967-f0d50409e31e.png)


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

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

```csharp
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/c32356f6-9541-c200-a58b-5dca9686a3b0.png)

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

| サポート前 (Rider 2023.3) | サポート後 (Rider 2024.3)|
|:---:|:---:|
| ![スクリーンショット 2024-11-30 0.33.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/98ce9a80-419b-ac7b-3145-d897c83dd7f6.png) | ![スクリーンショット 2024-11-30 0.37.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/6f74c564-4195-ef24-7523-ae9362b6a902.png) |

![スクリーンショット 2024-11-30 0.38.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/509ce2cf-a009-3c2b-01e5-808f5b000d1b.png)

## いろいろなCode CompletionやCode Inspectionsも

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

![スクリーンショット 2024-11-30 0.53.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/ac42f728-e5d1-a164-dd9b-c20fc212bbe0.png)

![スクリーンショット 2024-11-30 0.52.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/5f81d2f9-0f2c-05dd-cff3-9f86a0619472.png)

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

![スクリーンショット 2024-12-01 22.55.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/e3d08bb1-514e-41b1-3a16-30d888024a0c.png)

# まとめ

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