はじめに
本記事はサムザップ Advent Calendar 2022 の12/24の記事です。
昨日の記事は@reo_chocsarさんの「【さらばTime.timeScale】バトルにおける複雑なスピード制御を実現するための設計思想【Unity】」でした。
この記事は、Roslyn Analyzerを用いたC#コードの静的解析をなるべく手軽に行うものです。
今回作るもの
環境
- Unity 2021.3.11f1
- Rider 2021.3.4
Roslyn Analyzer
Unity2020.2以降では、Roslyn Analyzerを利用することでC#コードを静的解析して(ビルドすることなく)エラーや警告文を表示させることが出来ます。
なお、この時のエラーや警告文のルールはユーザーが任意に定めることが可能です。
BannedApiAnalyzersの導入
まずは利用するルールを定めます。
今回はこのルールとして、Microsoftが公開しているBannedApiAnalyzersを利用することとします。
dllダウンロード
以下のURLのDownload Packages
からパッケージをDLし、解凍します。
(拡張子を.nupkg
→.zip
に変更すれば簡単に解凍できるかと思います。)
Unityへ導入
次に、↑で解凍したフォルダから以下2つのdllファイルをUnityプロジェクトのEditorフォルダ以下に配置してください。
analyzers/dotnet/cs/Microsoft.CodeAnalysis.BannedApiAnalyzers.dll
analyzers/dotnet/cs/Microsoft.CodeAnalysis.CSharp.BannedApiAnalyzers.dll
次に、2つのdllファイルを選択し、Inspector上からSelect Platforms for plugin
のチェックをすべて外します
その後、右下の栞マークをクリックしてRoslynAnalyzer
と入力しラベルを設定します。
これでBannedApiAnalyzersの導入は完了です。
設定ファイルの編集
次に、実際に警告文を出すコードを設定していきます。
まず、Assetsフォルダ直下にBannedSymbols.txt
を作成し、以下のように記述します。
(もちろん直下でなくとも大丈夫ですが、その場合は後述のcsprojへの設定を配置したパスで行ってください。)
M:UnityEngine.GameObject.Find(System.String);GameObject.Findは非推奨です
なお、このルールは以下のように記述します。
{Banしたい対象種別}:{対象の名前};{表示したいメッセージ}
なお、Banしたい対象種別には以下のように指定します
- T : 型
- M : メソッド
- F : メンバ変数(フィールド)
- P : プロパティ
- E : イベントハンドラ
より詳しくは以下を参考にしてください。
csprojへの設定
最後に、.csproj
へ設定ファイルを登録します。
プロジェクトのAssembly-CSharp.csproj
(adfを設定している場合はそれに対応する.csproj
ファイル)を開き、以下のように編集します。
※実際に導入する場合はCsprojModifierなどのパッケージを用いて設定してください。
<?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("")
を記述すると警告文が出るように
(必要ならリロードをかけてください)
最後に
非推奨な関数/クラスや記法などは各プロジェクトで異なりますが、それを関わっているプログラマ全員に周知させることは難しいです。
非推奨なコードが使われていたり記法が統一されていないことは、可読性の低下や将来的なバグなどの原因となります。
今回のようにRoslyn Analyzerを利用してルールをIDE上に表示してしまうことは、その解決策の一つとなるのではないでしょうか?
明日は@kanasaki_kenjiさんの記事です。