EditorConfig は、異なるIDE間でもコーディングスタイルや静的解析の設定を共有できる仕組みです。 JetBrains Riderをはじめ、多くのIDE/ エディタでサポートされています。
本稿では、筆者の使用している設定を紹介します。
Roslynの.editorconfig
元にしているのはRoslynの.editorconfigファイルです。RoslynはC# 6.0から導入された.NETコンパイラプラットフォームの通称で、MITライセンスで公開されています。
roslyn/.editorconfig at main · dotnet/roslyn · GitHub
このファイルそのままで、Unity社の公開しているコードスタイルガイド『Use a C# style guide for clean and scalable game code』に準拠したコードフォーマットが得られます。 同ガイドのサンプルコードをこの.editorconfigでフォーマットしてみたところ、行末やコメントのスペースと一部の空行を除いて差分は出ませんでした。
なお、file_header_template にはライセンス表記が入っています。ここだけはプロジェクトに応じて修正が必要です。
スタイルの変更
個人的な好みで、いくつか追加しています。詳細はキーで検索すればJetBrainsのページが見つかりますのでそちらを参照してください。
なお、.editorconfigはファイルパスごとにセクションが分かれています。[*.{cs,vb}] の下に追加してください。
フィールドなどと属性を別の行にする
csharp_place_type_attribute_on_same_line = false csharp_place_method_attribute_on_same_line = false csharp_place_accessorholder_attribute_on_same_line = false csharp_place_field_attribute_on_same_line = false
SerializeField 属性などを別の行に書きたいので次の定義を追加しています。
すべての属性ではなく、たとえば Values 属性のように引数につけるものは除外しています。
連続した行のコメントの開始位置をそろえる
resharper_csharp_int_align_comments = true
C#8.0以降の構文をサジェストしない
resharper_convert_to_using_declaration_highlighting = none resharper_convert_to_null_coalescing_compound_assignment_highlighting = none resharper_merge_into_logical_pattern_highlighting = none resharper_use_negated_pattern_in_is_expression_highlighting = none
筆者がメンテナンスしているUPMパッケージがUnity 2019 LTSをサポートしているため、Unity 2020.2以降で使用できる構文はサジェストされないように設定しています。
コードインスペクションの設定
switch文にenumを使用するとき、すべての値をcaseで列挙することを強制する
resharper_switch_statement_handles_some_known_enum_values_with_default_highlighting = warning
類似の設定に resharper_switch_statement_missing_some_enum_cases_no_default_highlighting がありますが、こちらは default がないときに検出されるものです。
一方この resharper_switch_statement_handles_some_known_enum_values_with_default_highlighting は、default があってもすべての値を case に書かないと検出されます。
ゲームの開発中や運用中、enum が追加されたときの対応漏れを検知できます*1。
リグレッションの原因として割と怖いものなので、error でもいいかもしれません。
BannedApiAnalyzersによる禁止をエラーにする
dotnet_diagnostic.RS0030.severity = error
BannedApiAnalyzers ではデフォルトの重大度が warning なのですが、チームで禁止にするなら error でいいはずです。
テストコード向け設定
テストコードは /Tests/ を含むパスに置くようにしているので、以下は [**/Tests/**/*.cs] と指定することでテストコードにのみ適用させています。
親クラスに定義されたstaticメソッドを許容する
resharper_access_to_static_member_via_derived_type_highlighting = none
一般的な例では、GameObject.FindAnyObjectByType<T>() と書くと検出されます(Objectクラスのメソッドなので)。
Unity Test Framework を使っていると、制約モデルの Is クラスを拡張することがあるのですが、それを使うときに煩わしいので none にしています。
複数のAssertを許容する
dotnet_diagnostic.NUnit2045.severity = none
テストメソッドに複数のアサーションを書くことは原則しないのですが、たとえば生成されたオブジェクトのプロパティを検証するときなど例外はあります。
NUnit.Analyzers ではこのとき Assert.Multiple を使うようサジェストするのですが、これはUnity Test Frameworkでは使用できないため、抑止しています*2。
サンプル.editorconfig
以上を取り込んだ.editorconfigファイルが『Unity Test Framework完全攻略ガイド』*3のサンプルプロジェクト(MITライセンス)に置いてあります。
なお、file_header_template にはライセンス表記が入っています。ここだけはプロジェクトに応じて修正が必要です。
UnityTestExamples/.editorconfig at master · nowsprinting/UnityTestExamples · GitHub
また、上記のほかに次の差分があります。ご注意ください。
spelling_exclusion_pathを削除:Riderの辞書を使っているためcharsetをutf-8-bomからutf-8に変更:Windowsを使っている場合はBOMつけたままでいいと思います