LoginSignup
8
1

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-12-23

はじめに

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

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

今回作るもの

スクリーンショット.png
非推奨関数(or型など)に対し、IDE上から警告を出す。

環境

  • 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
スクリーンショット.png
スクリーンショット.png

次に、2つのdllファイルを選択し、Inspector上からSelect Platforms for pluginのチェックをすべて外します
その後、右下の栞マークをクリックしてRoslynAnalyzerと入力しラベルを設定します。
スクリーンショット.png
これでBannedApiAnalyzersの導入は完了です。

設定ファイルの編集

次に、実際に警告文を出すコードを設定していきます。
まず、Assetsフォルダ直下にBannedSymbols.txtを作成し、以下のように記述します。
(もちろん直下でなくとも大丈夫ですが、その場合は後述のcsprojへの設定を配置したパスで行ってください。)

BannedSymbols.txt
M:UnityEngine.GameObject.Find(System.String);GameObject.Findは非推奨です

なお、このルールは以下のように記述します。

{Banしたい対象種別}:{対象の名前};{表示したいメッセージ}

なお、Banしたい対象種別には以下のように指定します

  • T : 型
  • M : メソッド
  • F : メンバ変数(フィールド)
  • P : プロパティ
  • E : イベントハンドラ

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

csprojへの設定

最後に、.csprojへ設定ファイルを登録します。
プロジェクトのAssembly-CSharp.csproj(adfを設定している場合はそれに対応する.csprojファイル)を開き、以下のように編集します。
※実際に導入する場合は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

最後に

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

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

8
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
1