
C# コードをフォーマットする正しい方法は 1 つとは限りませんが、チーム全体で一貫したスタイルにすることで、よりクリーンで読みやすく、スケーラブルなコードベースを実現できます。よく整理されたスタイルガイドは、一貫性のある最終製品を生み出すために、不一致を抑えるのに役立ちます。
変数、クラス、メソッドの名前は単なるラベルではありません。それらは重みと意味を持ちます。優れた命名スタイルは、プログラムを読む人が伝えようとしているアイデアを理解する方法に影響を与えます。
このページでは、独自のスタイルガイドを作成する際に、命名規則とコードフォーマットについて留意すべきヒントと主な考慮事項を紹介します。
注:ここで紹介する推奨事項は、Microsoft が提供する推奨事項に基づいています。最適なコードスタイルガイドのルールは、チームのニーズに最も適したルールです。
コード スタイル ガイドの例はこちらから、または完全な e ブック「Use a C# style guide for clean and scalable game code (Unity 6 edition)」をダウンロードしてください。
識別子とは、型 (クラス、インタフェース、構造体、デリゲート、列挙型)、メンバー、変数、または名前空間に割り当てる任意の名前です。
C# では特殊文字(バックスラッシュ、記号、Unicode 文字)の使用が許可されていますが、識別子には使用しないでください。これらは、特定の Unity コマンドラインツールと干渉する可能性があります。ほとんどのプラットフォームとの互換性を確保するために、珍しいキャラクターは避けましょう。
C# では識別子を区切るためにスペース文字が使用されるため、名前にスペースを含む変数を定義することはできません。ケーシングスキームは、ソースコードで複合名やフレーズを使用しなければならない問題を軽減できます。
よく知られている命名規則とケーシング規則をいくつか紹介します。
キャメルケース(camelCase)
キャメルケースはキャメルキャップとも呼ばれ、スペースや句読点を使わずにフレーズを記述する手法です。単語を大文字 1 文字で区切ります。最初の文字は小文字です。ローカル変数とメソッドのパラメーターはキャメルケースです。例:
examplePlayerController
maxHealthPoints
endOfFile
パスカルケース (PascalCase)
パスカルケースはキャメルケースのバリエーションで、最初の文字を大文字にします。Unity 開発では、クラス名、パブリックフィールド名、メソッド名に使用します。例:
ExamplePlayerController
MaxHealthPoints
EndOfFile
スネークケース (snake_case)
この場合、単語間のスペースはアンダースコア文字に置き換えられます。例:
example_player_controller
max_health_points
end_of_file
ケバブケース (kebab-case)
ここでは、単語間のスペースはダッシュに置き換えられます。ダッシュの「串」に刺さる言葉。例:
example-player-controller
Max-health-points
end-of-file
naming-conventions-methodology
ケバブケースはウェブ技術、特に CSS で広く使用されています。UI Toolkit USS との併用もおすすめです。
ハンガリー記法
変数名や関数名は、多くの場合、その意図や型を示します。例:
int iCounter
string strPlayerName
ハンガリアン記法は古い規則であり、Unity 開発では一般的ではありません。
変数とフィールドについては、次の規則を考慮してください。

列挙型は、名前付き定数のセットによって定義される特殊な値型です。デフォルトでは、定数は 0 から数えて整数です。
列挙型の名前と値にはパスカルケースを使用します。クラスの外側に public 列挙型を配置してグローバル化できます。列挙型の名前は、取りうる値のセットから 1 つの値を表すため、名詞は単数形を使用します。プレフィックスやサフィックスは付けないでください。
注:System.FlagsAttribute アトリビュートでマークされたビット単位の列挙型はこの規則の例外です。通常、これらは複数の型を表すため、複数形になります。
クラスとインターフェースに名前を付けるときは、以下の標準ルールに従ってください。
C# では、実行されるすべての命令はメソッドのコンテキストで実行されます。
注:Unity 開発では、「関数」と「メソッド」はしばしば同じ意味で使用されます。しかし、C# のクラスに関数を組み込まないと書けないので、「メソッド」という言葉が使われています。
メソッドはアクションを実行するので、以下の規則を適用して適切な名前を付けます。
C# のイベントはオブザーバーパターンを実装します。このソフトウェアデザインパターンは、サブジェクト(またはパブリッシャー)である 1 つのオブジェクトが、オブザーバー(またはサブスクライバー)と呼ばれる依存オブジェクトのリストに通知できる関係を定義します。そのため、サブジェクトは関連するオブジェクトを緊密に結合することなく、ステートの変化をオブザーバーにブロードキャストできます。Unity プロジェクトでのオブザーバーやその他のデザインパターンの使用方法の詳細については、e ブック「Level up your code with design patterns and SOLID」を参照してください。
イベントには動詞句で名前を付けます。状態の変化を正確に伝える名前を選択します。現在分詞または過去分詞を使って、イベントが「前」であるか「後」であるかを示します。例えば、ドアを開ける前のイベントには「OpeningDoor」、開けた後のイベントには「DoorOpened」を指定します。
ほとんどの場合、Action デリゲートはゲームプレイに必要なイベントを処理できます。戻り値の型が void の場合、型の異なる 0 から 16 の入力パラメーターを渡すことができます。定義済みのデリゲートを使用すると、コードが保存されます。
注:EventHandler デリゲートまたは EventHandler デリゲートを使用することもできます。全員がイベントをどのように実装するかについてチームで合意する。
イベントを呼び出すサブジェクトは、通常、「On」というプレフィックスが付いたメソッドから実行します(例:「OnOpeningDoor」または「OnDoorOpened」です。
サブジェクトの名前が「GameEvents」の場合、オブザーバーには「GameEvents_OpeningDoor」または「GameEvents_DoorOpened」というメソッドを含めることができます。これは「イベント処理メソッド」と呼ばれます。EventHandler デリゲートと混同しないでください。
カスタム EventArgs は必要に応じてのみ作成します。イベントにカスタムデータを渡す必要がある場合は、System.EventArgs またはカスタム構造体から継承された新しいタイプの EventArgs を作成します。
名前空間を使用して、クラス、インターフェース、列挙型などが他の名前空間やグローバル名前空間の既存のものと競合しないようにします。名前空間は、アセットストアのサードパーティ製アセットとの競合を防ぐこともできます。
名前空間を適用する場合:
コードでは、これらのクラスはそれぞれ Enemy.Controller1 および Enemy.Controller2 と呼ばれます。using 行を追加して、プレフィックスの入力を節約します。
using Enemy;
コンパイラーがクラス名 Controller1 および Controller2 を見つけると、Enemy.Controller1 および Enemy.Controller2 のことと解釈します。
スクリプトが異なる名前空間の同じ名前のクラスを参照する必要がある場合は、プレフィックスを使用して区別します。たとえば、Player 名前空間に Controller1 クラスと Controller2 クラスがある場合、Player.Controller1 クラスと Player.Controller2 クラスを記述して競合を回避できます。そうしないと、コンパイラーはエラーを報告します。
using Enemy;
一般的なフォーマットの詳細については、こちらをご覧いただくか、e ブック全文をご覧ください。コードスタイルガイドの例もご覧ください。