UnityでRoslyn Analyzerが使えるようになるので使ってみる

# はじめに
この記事は[Unity #3 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/unity3)の23日目の記事です。
Unity2020.2でRoslyn Analyzerが使用できるようになったらしいので、使ってみるという内容です。

# Roslyn Analyzer
Roslyn Analyzerは簡単に言うとコーディングスタイルなどをチェックできるものです。
用意したアナライザー、ルールセットに基づいて、IDE上などでエラーや警告を表示してくれたりします。
Unityではコンパイル時にコンソールに表示されるようになっています。

Microsoft公式の[FxCopAnalyzers](https://www.nuget.org/packages/Microsoft.CodeAnalysis.FxCopAnalyzers)や、サードパーティの[StyleCopAnalyzers](https://www.nuget.org/packages/StyleCop.Analyzers/)などのアナライザーが用意されているので、これを使用し、自分で必要に応じてルールセットを記述していく、という使い方が良いかと思います。

VisualStudioなどのIDEで使えば、書きながらその場で指摘してくれて便利ですが、人によっていろんなエディタを使う場合もありますし、Unity上に一覧で表示させることで、統一したコーディングスタイルを意識することに繋がると思います。

# 環境
* MacBook Pro (Retina, 13-inch, Late 2013)
* macOS Catalina 10.15.7
* Unity 2020.2.0b14

# 使用方法
## アナライザーの用意
### DLLのインポート
今回はサードパーティの[StyleCopAnalyzers](https://www.nuget.org/packages/StyleCop.Analyzers/)を使用してみます。
上のリンクの画面右の方にある[Download package]ボタンから、nupkgファイルをダウンロードします。
`stylecop.analyzers.{Version}.nupkg`の拡張子をzipにし、展開を行います。
(自分の環境だとうまく行かなかったので、unzipコマンドで展開を行いました。)

analyzers/dotnet/csフォルダ内の`StyleCop.Analyzers.dll`をUnityプロジェクトにインポートします。

### インポートしたDLLの設定
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46278/4efd8bd3-cc55-52b4-4428-23ac29212550.png" width="300px">

上画像の赤枠の部分をクリックして、インポートしたDLLに`RoslynAnalyzer`のAssetLabelを追加します。
アイコンが出ていない場合、`Asset Labels`の部分をクリックすることで表示されるようになります。

また、ランタイムにDLLが含まれないように、`Select platforms for plugin`の部分の全てのチェックを外しておきます。

ここでプロジェクトに含まれているスクリプトに大してアナライザーが実行され、場合によってエラー、警告が表示されます。

## ルールセットの用意
### ルールセットの配置ルール
ルールセットは全体に対してとアセンブリに対しての設定が行えます。
全体の場合は`Default.ruleset`
アセンブリごとの場合は`{アセンブリ名}.ruleset`、Assembly-CSharp.dllに対してであれば`Assembly-CSharp.ruleset`
という風に作成し、Assetsフォルダのルートに配置します。

### ルールセットの作成
今回はDefault.rulesetを作成してみます。

現在、デフォルト設定だと、Unity上で新規ファイルを作成した時点で以下のような警告が表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46278/ec70d8ec-d24d-22fa-c5d3-32a2b7dce594.png" width=800px>

まずテストとして、警告として表示されていたものをエラーとして出してみます。

```xml:Default.ruleset
<?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="New Rule Set" Description=" " ToolsVersion="10.0">
  <Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers">
    <Rule Id="SA1028" Action="Error" />
    <Rule Id="SA1400" Action="Error" />
    <Rule Id="SA1505" Action="Error" />
    <Rule Id="SA1508" Action="Error" />
    <Rule Id="SA1633" Action="Error" />
  </Rules>
</RuleSet>
```

作成したスクリプトファイルをReimportしてみると
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46278/d30b7f0f-12ed-d632-a9e0-2316b660d21f.png" width=800px>
全てエラーとして表示されることが確認できました。

この際、コンパイルエラーとしてエラーが出ている訳ではないので、このまま問題なく実行することは可能です。

また、今度はこれら全ての警告を取り除いてみます。

```xml:Default.ruleset
<?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="New Rule Set" Description=" " ToolsVersion="10.0">
  <Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers">
    <Rule Id="SA1028" Action="None" />
    <Rule Id="SA1400" Action="None" />
    <Rule Id="SA1505" Action="None" />
    <Rule Id="SA1508" Action="None" />
    <Rule Id="SA1633" Action="None" />
  </Rules>
</RuleSet>
```

再度スクリプトファイルをReimportしてみると、警告が出なくなったことを確認できるかと思います。

今回は`Default.ruleset`しか作成しませんでしたが、上で述べたようにアセンブリに対してもルールセットを作成することができます。その際、アセンブリに対応するルールセットの方が優先され、対応するものがない場合のみ`Default.ruleset`が使用されることになります。

## 補足 StyleCopの設定ファイル
StyleCopではいろいろな設定を行うことができます。
例えばインデントでタブを使用するか、スペースを使用するか。などを設定しておくことができます。
その際に`stylecop.json`というファイルを作成、記述します。

この設定は`.csproj`ファイルに特定の記述を行うことで有効になるのですが、
今回Unityにおいて、これをうまく設定することができませんでした・・・

おそらく、`AssetPostProcessor`の`OnGeneratedCSProject`というイベントを使用することで、`.csproj`ファイルを書き換えることができるので、それでうまくいくかもしれません。
(現状VSCodeを使用していると、`OnGeneratedCSProject`は呼び出されないようになっている)

# まとめ
今回はUnity2020.2にてRoslyn Analyzerが使えるようになったという話の紹介を行いました。
ちょうど最近2020.2の正式版がリリースされました。
Roslyn Analyzerの使い方自体は割とシンプルで、どこにどういったファイルを配置するかが分かれば、それほど詰まる点もなく設定ができそうでした。
StyleCop Analyzerに関しては、ちょっと調査が必要そうです。
以下にも貼っているマニュアルのMore analyzersの項目で紹介されているアナライザーを使用するのが、間違いないのかなとも思います。

# 参考
[Unity - Manual:  Roslyn analyzers and ruleset files](https://docs.unity3d.com/2020.2/Documentation/Manual/roslyn-analyzers.html)
[Roslyn アナライザーを使用したコード分析 - Visual Studio](https://docs.microsoft.com/ja-jp/visualstudio/code-quality/roslyn-analyzers-overview?view=vs-2019)