Unityプロジェクトに .editorconfig を配置して、命名&スタイルを“自動で”そろえる話(FUnity対応)

FUnity Unity
FUnity

TL;DR
.editorconfigプロジェクトのルートに置くだけで、Rider / Visual Studio / VS Code が命名規約やコードスタイルを自動チェックしてくれます。
FUnity では private/protected フィールドは m_ + PascalCase を標準に。既存シリアライズは [FormerlySerializedAs] で安全に移行。


なぜ .editorconfig なの?

  • IDE横断(Rider / VS / VS Code すべて対応)
  • リポジトリ同梱で誰が触っても同じルール
  • C# の Roslyn アナライザーと連携して命名・スタイルを警告/提案
  • Unity特有の「シリアライズ名変更」も、運用ルール化しやすい

置き場所(最重要)

  • Unityプロジェクトのルート
    Assets/, Packages/, ProjectSettings/同じ階層.editorconfig を配置
    → 全サブフォルダへ自動適用されます
  • パッケージ側(FUnityリポジトリ)も同様にルートに配置
    → パッケージ単体開発のときも同じルールが効く

サブフォルダに別の .editorconfig を置けば上書きできます(例:Assets/FUnity/Editor だけ別ルール)。


FUnity推奨:命名の中核ルール

  • private/protected フィールドm_ + PascalCase(例:m_UIDocument, m_Ticker
  • public(クラス/メソッド/プロパティ/イベント/フィールド):PascalCase
  • 定数 / static readonly:PascalCase(Unity慣習に合わせ ALL_CAPSは使わない

既存フィールド名を変更する場合は、必ず [FormerlySerializedAs("旧名")] を付与してシリアライズ互換を維持します。


そのまま使える .editorconfig

プロジェクトのルートに保存してください(ファイル名は .editorconfig)。

# FUnity code style
# Place this file at the Unity project root (next to Assets/, Packages/, ProjectSettings/).
root = true

[*.cs]
charset = utf-8
indent_style = space
indent_size = 4
end_of_line = lf

# General C# style
dotnet_style_qualification_for_field = false:suggestion
dotnet_style_require_accessibility_modifiers = for_non_interface_members:suggestion
csharp_prefer_braces = true:suggestion
csharp_new_line_before_open_brace = all
csharp_style_var_elsewhere = true:suggestion
csharp_style_var_for_built_in_types = true:suggestion
csharp_style_var_when_type_is_apparent = true:suggestion

# ===== Naming rules =====
# Private/Protected instance fields must start with m_ and use PascalCase after it.
dotnet_naming_rule.private_fields_m_prefix.severity = warning
dotnet_naming_rule.private_fields_m_prefix.symbols  = private_fields
dotnet_naming_rule.private_fields_m_prefix.style    = m_prefix_style

dotnet_naming_symbols.private_fields.applicable_kinds           = field
dotnet_naming_symbols.private_fields.applicable_accessibilities = private, protected, protected_internal
dotnet_naming_symbols.private_fields.applicable_modifiers       =

dotnet_naming_style.m_prefix_style.required_prefix = m_
dotnet_naming_style.m_prefix_style.capitalization = pascal_case

# Public members should be PascalCase
dotnet_naming_rule.public_members_pascal.severity = suggestion
dotnet_naming_rule.public_members_pascal.symbols  = public_members
dotnet_naming_rule.public_members_pascal.style    = pascal_style

dotnet_naming_symbols.public_members.applicable_kinds           = field, property, method, event
dotnet_naming_symbols.public_members.applicable_accessibilities = public, internal
dotnet_naming_style.pascal_style.capitalization = pascal_case

# Constants: PascalCase (Unity convention; avoid ALL_CAPS)
dotnet_naming_rule.constants_pascal.severity = suggestion
dotnet_naming_rule.constants_pascal.symbols  = constant_fields
dotnet_naming_rule.constants_pascal.style    = pascal_style
dotnet_naming_symbols.constant_fields.applicable_kinds = field
dotnet_naming_symbols.constant_fields.applicable_accessibilities = *
dotnet_naming_symbols.constant_fields.required_modifiers = const

# Static readonly fields: PascalCase
dotnet_naming_rule.static_ro_pascal.severity = suggestion
dotnet_naming_rule.static_ro_pascal.symbols  = static_readonly_fields
dotnet_naming_rule.static_ro_pascal.style    = pascal_style
dotnet_naming_symbols.static_readonly_fields.applicable_kinds = field
dotnet_naming_symbols.static_readonly_fields.applicable_accessibilities = *
dotnet_naming_symbols.static_readonly_fields.required_modifiers = static, readonly

# (Optional) Encourage XML docs for public APIs (if StyleCop installed)
dotnet_diagnostic.SA1600.severity = suggestion
dotnet_diagnostic.SA1604.severity = suggestion

実際の運用(FUnity/プロジェクト両対応)

  • **FUnity(パッケージ側)**のリポジトリにも .editorconfig を置く
    → パッケージ単体で開発しても統一スタイル
  • **ゲームプロジェクト(FUnityProject)**側にも置く
    → プロジェクト全体のコンポーネントやゲームロジックも同じ規約で統一

どちらか一方にだけ置くと、もう一方の環境で規約適用漏れが起きやすいです。両方に置くのが堅実。


既存コードの“安全な”リネーム

  1. _foom_Foo などに変更
  2. シリアライズ互換のため、必ず [FormerlySerializedAs("_foo")] を付与
  3. Editor拡張で SerializedObject.FindProperty("uiDocument") のような旧名参照があれば新名に置換(例:"m_UIDocument"

これでシーンやPrefabの値が消えないまま、命名規約を段階導入できます。


IDE設定の反映

  • .editorconfig 保存後、IDEを再読み込み
    • Rider:File → Sync/Invalidate Caches
    • Visual Studio:ソリューション再読み込み
    • VS Code:再起動 or ウィンドウ再読み込み
  • 以後、命名違反があると波線や警告で気づけます

よくある質問

Q. 複数の .editorconfig があるとどれが効く?
A. もっとも近い階層の設定が優先。最上位で root = true を付けて“ここが起点”と宣言するのが定石。

Q. 既存の ALL_CAPS 定数は?
A. Unity慣習に合わせPascalCase推奨です。移行は影響範囲を見て段階的に(constの参照はビルド時展開されるため注意)。

Q. CIで落とせる?
A. dotnet format や Roslyn アナライザーによるスタイルチェックをCIに入れられます(プロジェクト構成に応じて導入)。


まとめ

  • .editorconfigルートに置けば、チーム全員のIDEで同じルールが効く
  • FUnity標準は m_ + PascalCase(private/protected フィールド)
  • 既存データは [FormerlySerializedAs]壊さず移行
  • FUnity と FUnityProject の両方に置いて、どの環境でも同じ開発体験に 🎯

コメント

タイトルとURLをコピーしました