やらなイカ?

たぶん、iOS/Androidアプリの開発・テスト関係。

Unityプロジェクト向け .editorconfigサンプル

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でフォーマットしてみたところ、行末やコメントのスペースと一部の空行を除いて差分は出ませんでした。

unity.com

github.com

なお、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の辞書を使っているため
  • charsetutf-8-bom から utf-8 に変更:Windowsを使っている場合はBOMつけたままでいいと思います

関連

www.nowsprinting.com

www.nowsprinting.com

www.nowsprinting.com

www.nowsprinting.com

*1:Unityでも record や record struct が使えるようになったら変わっていくとは思いますが

*2:サジェストがなければ警告させて、例外となるテストだけ個別にサプレスすべきだとは思うのですが

*3:夏に改版予定です