【Unity】Rider上で非推奨関数/型を検知したい - お手軽に試すRoslynAnalyzer


## はじめに
本記事は[サムザップ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/sumzap) の12/24の記事です。
昨日の記事は@reo_chocsarさんの「【さらばTime.timeScale】バトルにおける複雑なスピード制御を実現するための設計思想【Unity】」でした。

この記事は、Roslyn Analyzerを用いたC#コードの静的解析をなるべく手軽に行うものです。

## 今回作るもの
![スクリーンショット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669902/6dd4deab-812f-5b28-d1d6-08d03607513c.png)
非推奨関数（or型など）に対し、IDE上から警告を出す。

## 環境
- Unity 2021.3.11f1
- Rider 2021.3.4

## Roslyn Analyzer
Unity2020.2以降では、Roslyn Analyzerを利用することでC#コードを静的解析して（ビルドすることなく）エラーや警告文を表示させることが出来ます。
なお、この時のエラーや警告文のルールはユーザーが任意に定めることが可能です。
<!-- 今回はこれを用いてコードを静的解析することで、IDE上で非推奨の関数などに警告を出します。 -->

## BannedApiAnalyzersの導入
まずは利用するルールを定めます。
今回はこのルールとして、Microsoftが公開しているBannedApiAnalyzersを利用することとします。

### dllダウンロード
以下のURLの`Download Packages`からパッケージをDLし、解凍します。
（拡張子を`.nupkg`→`.zip`に変更すれば簡単に解凍できるかと思います。）

https://www.nuget.org/packages/Microsoft.CodeAnalysis.BannedApiAnalyzers/

### Unityへ導入
次に、↑で解凍したフォルダから以下2つのdllファイルをUnityプロジェクトのEditorフォルダ以下に配置してください。
`analyzers/dotnet/cs/Microsoft.CodeAnalysis.BannedApiAnalyzers.dll`
`analyzers/dotnet/cs/Microsoft.CodeAnalysis.CSharp.BannedApiAnalyzers.dll`
![スクリーンショット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669902/e13eae65-76dd-f960-f818-b56a727a34bc.png)
![スクリーンショット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669902/3fdf468f-1373-0740-472a-1d27d9debd13.png)

次に、2つのdllファイルを選択し、Inspector上から`Select Platforms for plugin`のチェックをすべて外します
その後、右下の栞マークをクリックして`RoslynAnalyzer`と入力しラベルを設定します。
![スクリーンショット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669902/f837be52-df83-ce2a-d567-19f0f385ecc1.png)
これでBannedApiAnalyzersの導入は完了です。

## 設定ファイルの編集
次に、実際に警告文を出すコードを設定していきます。
まず、Assetsフォルダ直下に`BannedSymbols.txt`を作成し、以下のように記述します。
（もちろん直下でなくとも大丈夫ですが、その場合は後述のcsprojへの設定を配置したパスで行ってください。）
```BannedSymbols.txt
M:UnityEngine.GameObject.Find(System.String);GameObject.Findは非推奨です
```
なお、このルールは以下のように記述します。
```
{Banしたい対象種別}:{対象の名前};{表示したいメッセージ}
```
なお、Banしたい対象種別には以下のように指定します
- T : 型
- M : メソッド
- F : メンバ変数（フィールド）
- P : プロパティ
- E : イベントハンドラ

より詳しくは以下を参考にしてください。

https://github.com/dotnet/roslyn-analyzers/blob/main/src/Microsoft.CodeAnalysis.BannedApiAnalyzers/BannedApiAnalyzers.Help.md

## csprojへの設定
最後に、`.csproj`へ設定ファイルを登録します。
プロジェクトの`Assembly-CSharp.csproj`（adfを設定している場合はそれに対応する`.csproj`ファイル）を開き、以下のように編集します。
※実際に導入する場合は[CsprojModifier](https://github.com/Cysharp/CsprojModifier)などのパッケージを用いて設定してください。
```Assembly-CSharp.csproj
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- 中略 -->
  <!-- 以下を追加 -->
  <ItemGroup>
    <AdditionalFiles Include="Assets/BannedSymbols.txt" />
  </ItemGroup>
  <!-- 追加ここまで -->
</Project>
```

## 結果
Rider上で`GameObject.Find("")`を記述すると警告文が出るように
（必要ならリロードをかけてください）
![スクリーンショット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669902/6dd4deab-812f-5b28-d1d6-08d03607513c.png)

## 最後に
非推奨な関数/クラスや記法などは各プロジェクトで異なりますが、それを関わっているプログラマ全員に周知させることは難しいです。
非推奨なコードが使われていたり記法が統一されていないことは、可読性の低下や将来的なバグなどの原因となります。
今回のようにRoslyn Analyzerを利用してルールをIDE上に表示してしまうことは、その解決策の一つとなるのではないでしょうか？

明日は@kanasaki_kenjiさんの記事です。