はじめに
この記事はUnity #3 Advent Calendar 2020の23日目の記事です。
Unity2020.2でRoslyn Analyzerが使用できるようになったらしいので、使ってみるという内容です。
Roslyn Analyzer
Roslyn Analyzerは簡単に言うとコーディングスタイルなどをチェックできるものです。
用意したアナライザー、ルールセットに基づいて、IDE上などでエラーや警告を表示してくれたりします。
Unityではコンパイル時にコンソールに表示されるようになっています。
Microsoft公式のFxCopAnalyzersや、サードパーティのStyleCopAnalyzersなどのアナライザーが用意されているので、これを使用し、自分で必要に応じてルールセットを記述していく、という使い方が良いかと思います。
VisualStudioなどのIDEで使えば、書きながらその場で指摘してくれて便利ですが、人によっていろんなエディタを使う場合もありますし、Unity上に一覧で表示させることで、統一したコーディングスタイルを意識することに繋がると思います。
環境
- MacBook Pro (Retina, 13-inch, Late 2013)
- macOS Catalina 10.15.7
- Unity 2020.2.0b14
使用方法
アナライザーの用意
DLLのインポート
今回はサードパーティのStyleCopAnalyzersを使用してみます。
上のリンクの画面右の方にある[Download package]ボタンから、nupkgファイルをダウンロードします。
stylecop.analyzers.{Version}.nupkg
の拡張子をzipにし、展開を行います。
(自分の環境だとうまく行かなかったので、unzipコマンドで展開を行いました。)
analyzers/dotnet/csフォルダ内のStyleCop.Analyzers.dll
をUnityプロジェクトにインポートします。
インポートしたDLLの設定
上画像の赤枠の部分をクリックして、インポートしたDLLにRoslynAnalyzer
のAssetLabelを追加します。
アイコンが出ていない場合、Asset Labels
の部分をクリックすることで表示されるようになります。
また、ランタイムにDLLが含まれないように、Select platforms for plugin
の部分の全てのチェックを外しておきます。
ここでプロジェクトに含まれているスクリプトに大してアナライザーが実行され、場合によってエラー、警告が表示されます。
ルールセットの用意
ルールセットの配置ルール
ルールセットは全体に対してとアセンブリに対しての設定が行えます。
全体の場合はDefault.ruleset
アセンブリごとの場合は{アセンブリ名}.ruleset
、Assembly-CSharp.dllに対してであればAssembly-CSharp.ruleset
という風に作成し、Assetsフォルダのルートに配置します。
ルールセットの作成
今回はDefault.rulesetを作成してみます。
現在、デフォルト設定だと、Unity上で新規ファイルを作成した時点で以下のような警告が表示されます。
まずテストとして、警告として表示されていたものをエラーとして出してみます。
<?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してみると
全てエラーとして表示されることが確認できました。
この際、コンパイルエラーとしてエラーが出ている訳ではないので、このまま問題なく実行することは可能です。
また、今度はこれら全ての警告を取り除いてみます。
<?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
Roslyn アナライザーを使用したコード分析 - Visual Studio