えんじにあ雑記!

開発していて学んだことをまとめていきます!

UnityでRoslyn Analyzerを導入してみた

f:id:flat-M_M:20210613181254j:plain

Roslyn AnalyzerがUnity2020.2から使えるっぽかったのでとりあえず触ってみました。

Roslyn Analyzerとは

下記のブログがAnalyzerとは何かの参考になると思います。

Analyzerって何?というと、まぁlintです。lintなのですが、Roslyn(C#で書かれたC# Compiler)から抽象構文木を取り出せるので、それによってユーザーが自由にルールを作って、警告にしたりエラーにしたりできる、というのがミソです。

Analyzerを導入し、ユーザが自由に.rulesetファイルを作成することで独自にlintのような機能を拡張できるものになっています。

neue.cc

参考サイト

今回はUnity公式ドキュメントを参考に、Analyzerの導入と動作確認までの手順を解説します。

docs.unity3d.com

導入までの手順

1. dllの配置

NuGetを使って「ErrorProne.NET.CodeAnalyzers」をインストールします。

ErrorProne.NET.CodeAnalyzersはRoslynベースのAnalyzerであり、大きく二つのパッケージに分かれます。

ErrorProne.CodeAnalyzersは一般的なエラーハンドリングやAPIの使い方の正当性などをチェックするものであり、 もう一方のErrorProne.StructAnalyzersはC#においてstructを扱う際の潜在的なパフォーマンスに関する問題を指摘してくれるAnalyzerと記載されています。

・ErrorProne.CoreAnalyzers - the analyzers covering the most common cases that may occur in almost any project, like error handling or correctness of some widely used API.

・ErrorProne.StructAnalyzers - the analyzers focusing on potential performance problem when dealing with structs in C#.

github.com

www.nuget.org

NuGetでインストールが完了したら、下記のdllが三つ見つかると思います。

  • ErrorProne.NET.Core.dll
  • ErrorProne.Net.CoreAnalyzers.dll
  • RuntimeContracts.dll

この三つをAssetsフォルダ下のどこでも良いのでコピーします。

2. dllの設定

Analyzerのコードはビルド時には含まれないようにするため、dllの設定から「select platforms for plugin」で「Any Platform」のチェックを外し、そのほかのチェックも全て外しておきます。

3. dllにタグをつける

ここまでできたら、インポートした3つのdllにタグを設定します。

dllを選択しながらInspectorViewの右下にある青いラベルアイコンをクリックし、「RoslynAnalyzer」というタグ名を設定します。

f:id:flat-M_M:20210613180427p:plain

4. rulesetの作成

Assetsフォルダのルートに「Default.rulteset」というファイルを作成し、とりあえず下記のrulesetをコピーしてください。

<?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="New Rule Set" Description=" " ToolsVersion="10.0">
    <Rules AnalyzerId="ErrorProne.NET.CodeAnalyzers" RuleNamespace="ErrorProne.NET.CodeAnalyzers">
        <Rule Id="ERP021" Action="Error" />
        <Rule Id="EPC12" Action="None" />
    </Rules>
</RuleSet>

5. サンプルコードの作成

ここまで準備できればAnalyzerが機能するようになっていると思うので、サンプルコードを作成し、動作を確認します。

using System;
using UnityEngine;

public class RethrowError : MonoBehaviour
{
    private void Update()
    {
        try
        {
            DoSomethingInteresting();
        }
        catch (Exception ex)
        {
            Debug.Log(ex.Message);
            throw ex; 
        }
    }

    private void DoSomethingInteresting()
    {
        throw new NotImplementedException();
    }
}

このコードを作成し、再コンパイルを走らせるとConsole Windowにエラーが表示されるようになると思います。 ここまで確認できればあとはrulsetをカスタマイズすることで独自のlint機能が実装できるようです。

所感

プロジェクト独自のルール(特定のメソッドが重いから絶対使うな)であったり、LINQを禁止しているなどがあると思うので、その辺りをチェックすることができれば一定導入するメリットはあるなぁと感じました。 ただ、Unityのサポートがまだ2020.2以降からなので、新しく始まるなら検討してみてもいいかもって感じですかね、、

Unityというより、こういった.NETのリソースをもっと学んで、より良い開発環境を作れる力をつけていきたいです、、