私のコーディング規約

## 変数
### 命名規則
**ローワーキャメルケース** : ローカル変数、private変数
**アッパーキャメルケース** : public変数、プロパティ(C#)、SerializeField(UnityC#)
**スネークケース** : enum変数
**コンスタントケース** : 定数

#### プリフィックス
**s_???** : 静的変数名
**p_???** : ポインタ変数名
**r_???** : 参照型変数名
**m_???** : メンバ変数名
**ms_??** : 静的メンバ変数名
**mp_??** : ポインタメンバ変数名

* 略語は**すべて大文字**
* bool型はisから始める(**is接頭語**)
* 配列やコンテナクラスは後ろにs/esをつける(**s接尾語**)

### その他
* メンバ変数の後は**必ず改行**
* private変数は**privateの記入禁止**(C#)
* SerializeField変数はコメントではなく、**Headerを使う**(UnityC#)
* ローカル変数はすべて型推論(C++は**auto**、C#は**var**)を使う
* また、明示的に型を定義する必要がある場合は、コメントを追記し、使用する

```C# : property.cs
/**
* 以下、プロパティのコーディング規約.
*/

// getterのみ.
public int GetHoge { get; private set; } = 0;

int hoge;

// setter込み(単一行).
public int Hoge
{
    get => hoge;
    set => hoge = value;
}

// setter込み(複数行).
public int Hoge
{
    get
    {
        // 処理.
        return hoge;
    }
    set
    {
        hoge = value;
        // 処理.
    }
}
```

## 四則演算
演算子の両隣はそれぞれ**半角スペース1つ**(隣が括弧の場合は適用外)

## if文
```C : if.c
/**
* 以下、if文のコーディング規約.
*/

if(hoge)
{
    // 処理.
}
else if(!fuga)
{
    // 処理.
}
else
{
    // 処理.
}
```

## while文
```C : while.c
/**
* 以下、while文のコーディング規約.
*/

// C/C++
while(1)
{
    // ループ終了用の条件式を明記.
    if(hoge)
    {
        break;
    }

    // 処理.
}

// C#
while(true)
{
    // ループ終了用の条件式を明記.
    if(hoge)
    {
        break;
    }

    // 処理.
}
```

## for/foreach文
```C++ : for.cpp
/**
* 以下、C/C++のfor/foreach文のコーディング規約.
*/

// C
for (int i = 0; i < 10; ++i)
{
    // 処理.
}

// C++
for (auto i = 0; i < 10; ++i)
{
    // 処理.
}

for (auto i : values)
{
    // 処理.
}
```

```C# : for.cs
/**
* 以下、C#のfor/foreach文のコーディング規約.
*/

// C#
for (var i = 0; i < 10; ++i)
{
    // 処理.
}

foreach (var i in values)
{
    // 処理.
}
```
## 構造体
### 命名規則
**アッパーキャメルケース**

## enum
### 命名規則
**コンスタントケース**
変数は**列挙体名と同名**

### その他
最初、またｈ最後に**NONE**という列挙定数を宣言すること

## switch文
```C : switch.c
/**
* 以下、switch文のコーディング規約.
*/

switch(hoge)
{
    default: // 書き忘れ防止.
        break;
    case 1:
        break;
    case 2:
        break;
}
```

## 関数
### 命名規則
* 関数名は**アッパーキャメルケース**
* 関数名は**動詞から始める**
* 引数名は_(アンダーバー)から始める(**_(アンダーバー)接頭語**)
* UnityのOnClickやInputSystemで呼び出される関数は、Onから始める(**On接頭語**)
* await/asyncを使用する関数は、後ろにAsyncをつける(**Async接尾語**)
* UniRxやR3などのRxを使用する関数は、後ろにAsObservableをつける(**AsObservable接尾語**)
* 成功した場合にのみ、何かを行う関数はTryから始める(**Try接頭語**)
* 成功した場合にのみ、取得できる関数はTryGetから始める(**TryGet接頭語**)

### その他
* private関数は**privateの記入禁止**(C#)
* Unityのイベント関数には**アクセス修飾は禁止**(UnityC#)
* Tryが接頭語になる関数は、**trueや値 or falseや型に応じた初期化値を戻り値とする**

```C# : expression-bodied.cs
/**
* 以下、C#の関数のコーディング規約.
*/

// 1行で記述可能であれば、=>で実装する.
string Hoge()
    => "hoge";
```

## コメント
* メンバ変数や関数には**XMLコメント**
* 処理中は // で
* 末尾には**必ず.(ピリオド)を記述する**

### コメントフォーマット(C/C++)
ファイルの一番上に以下を絶対に記述すること

```C++ : CommentFormat.cpp
/**
* 以下、C/C++(Doxygen)のコーディング規約.
*/

/**
* @file CommentFormat.cpp
* 
* @brief ファイルやクラスの概要
* 
* @date 作成日
*
* @author 作成者(チーム開発のみ)
*/
```

### アノテーションコメント
```C : AnnotationComment.c
/**
* 以下、アノテーションコメントのコーディング規約.
*/

// TODO:
// タスク事項を記述する

// TEMPORARY
// デバッグ等で、一時的な変数や関数を作成した場合に上の1行を追加する

// NOTE:
// 補足情報や注意事項を記述する
```

## 改行
メンバ変数、プロパティと中括弧の直後には改行

### Visual Studioでの設定
1. ツールタブ/オプションをクリック
1. テキストエディター/ C/C++ または C# /コードスタイル/書式設定/改行を開く
1. チェックを全てつける(C/C++の場合は全て「新しい行に追加」を選択)

### コードのクリーンアップ
1. ソリューションエクスプローラーを右クリック
1. コードのクリーンアップ/コード クリーンアップを実行
上記の手順を行うと、インデントや改行が設定通りに整えてくれる

## Github
### コミット時
コメントの前に、以下の5つの内どれかを必ず記述すること
* **Update** : 新しい機能を追加する場合
* **Improve** : 機能・コードの改善を行った場合
* **Style** : インデントなど、機能に関係しない変更を行った場合
* **Adjust** : 細かな調整を行った場合(SerializeField上での値変更など)
* **Fix** : バグを修正した場合

### プルリクエスト時
1. 題名には、大まかに何を行ったかを明記する
1. コメントは何のファイルにどのような変更/追加を行ったかを明記する

## その他
C/C++、C#ファイルは**UTF-8(BOM付き)にすること**
(Github上での文字化け防止)