C# 7.0 以降ではメソッドの内部に入れ子としてメソッドを作成出来るようになっています。
メソッド内部に宣言するメソッドをローカル関数と呼びます。
メソッド内の入れ子である関数であるため、修飾子の宣言は出来ません(private のみ)が引数も戻り値も持たせることが出来ます。
C# 8.0 以降では、属性を付与したりすることも出来ます。
<抜粋>
// 経路表示の生成
StartCoroutine(GenerateCornerLineFromPath(transform.position, nextPos));
/// <summary>
/// 経路表示の生成
/// </summary>
/// <param name="startPos"></param>
/// <param name="endPos"></param>
IEnumerator GenerateCornerLineFromPath(Vector3 startPos, Vector3 endPos) {
// パスを取得するまで待機
yield return new WaitUntil(() => agent.hasPath);
Debug.Log(agent.hasPath);
Debug.Log(agent.isOnNavMesh);
NavMeshPath path = new NavMeshPath();
// 経路の情報を取得できているか確認
if (NavMesh.CalculatePath(startPos, endPos, NavMesh.AllAreas, path)) {
// 経路の座標情報取得
Vector3[] corners = path.corners;
// すでに移動中のアニメを再生している場合
if (coroutine != null) {
// アニメ再生を停止
StopCoroutine(coroutine);
coroutine = null;
}
// アニメ再生用のメソッド登録
coroutine = charaController.SetAnime(corners);
// 登録したアニメ再生用のメソッドを実行
StartCoroutine(coroutine);
// TODO 経路情報がある場合、経路表示用のゲームオブジェクト作成
// TODO 経路表示の作成
}
}
ローカル関数は通常の関数と同じように、実行命令を行うことで実行されます。
ただし、
利用する範囲(スコープ)が、ローカル関数が定義されているメソッド内部のみに限られます。
今回のケースであれば、GenerateCornerLineFromPath メソッドを SetPathAndMove メソッド内で宣言していますので、
GenerateCornerLineFromPath メソッドを呼び出す命令は、SetPathAndMove メソッド内でしか実行できません。
利用方法としては、メソッドの呼び出し命令が特定のメソッド内にのみにあり、かつ、他のメソッドからも呼ばれることのない処理をローカル関数として準備することが一般的です。
利用範囲を制限している分、処理が読みやすくなりますし、エラーも見つけやすくなります。(使い道が限られている処理をメソッド化し、メソッド内部に閉じ込めておくことで可読性が上がります。)
MicroSoft
ローカル関数
https://docs.microsoft.com/ja-jp/dotnet/csharp/pro...
.NET column 様
C#のローカル関数とは?使い方やメリット・ラムダ式との違いも紹介
https://www.fenet.jp/dotnet/column/language/3933/