Coroutines は、ゲームのメイン実行サイクルと並行して実行できる関数です。。。
このチュートリアルの動画版は現在この言語では利用できません。以下で字幕付きの英語版をご覧いただけます。動画の下には日本語に翻訳された文字起こしがあります。
動画の書き起こし
皆さん、こんにちは。
Unity で Coroutines を使用する基本的なチュートリアルへようこそ。
Coroutines は、ゲームのメイン実行サイクルと並行して実行できる関数です。
このチュートリアルでは、実用的な例を使ってこの概念を説明し、さらに WaitForSeconds 関数を紹介します。この関数を使用すると、指定した秒数だけ処理の実行を待機させることができます。
このチュートリアルは、Unity における C# プログラミングの基礎知識があることを前提としています。録画には Unity の 2022 バージョンを使用しましたが、Coroutines は多くのプログラミング言語や Unity の以前のバージョンでも利用可能です。
今回の目標は、外部イベントによって中断されるまで、cannon が 3 秒ごとに自動で cannonball の Prefab、つまりシンプルな黒い球体を発射し続けるようにすることです。

この場合の外部イベントは、ユーザーが S キー、Stop を押すことです。
まず最初に、cannon 用のスクリプトを作成し、「autoshoot」と名付けます。
メインクラス内で、cannon に対するボールの開始位置を指定するために 3 つの変数を定義します。
public GameObject spawnPrefab;
この public 変数には、Unity Editor 上で cannonball の prefab をリンクします。
Vector3 spawnPosition;
Quaternion spawnRotation;
この位置と初期の向きを計算済みなので、Start 関数内でこれら 2 つの値を初期化します。
spawnPosition = transform.position + new Vector3(-1.2f, 1.8f, 0f);
spawnRotation = Quaternion.Euler(-10f, -90f, 0f);


ここで明らかなのは、無限に繰り返されるループ、ただし外部イベントで中断される可能性がありますが、そのループを実装する必要があるということです。そして各反復の間に 3 秒の待機処理を含めます。
注意として、cannonball の prefab にはスクリプトが付属しており、起動時にボールへ前方への初速を与え、さらに 3 秒後に自動的に破棄されるよう設定されています。これは仮想空間やシステムメモリを cannonball でいっぱいにしないためです。
WaitForSeconds 命令を使うと、指定した時間だけ処理を一時停止できます。今回の場合は 3 秒です。
それでは、メインループを実行する WHILE ブロックを作成します。これは現在スクリプト内の空いている場所に書いています。
while(true) {
GameObject cannonBall = Instantiate(spawnPrefab, spawnPosition, spawnRotation, null);
yield return new WaitForSeconds(3);
}
では、この WHILE ブロックはどこに配置すればよいでしょうか。
Start の中には置けません。なぜなら、そこでは yield WaitForSeconds を使用できないからです。また、Update に置いても意味がありません。Update はゲームの毎フレーム呼び出されるため、待機処理が機能しません。
したがって、IEnumerator 型を返す「shoot」という関数を作成し、その中に WHILE ブロックを含める必要があります。
この関数を使用することで、StartCoroutine 命令を使って Coroutines を開始できます。パラメータとして関数名をダブルクォーテーションで指定します。
cannon はすぐに発射を開始する必要があるため、spawnPosition と spawnRotation の初期化直後に、Start 内で次のように記述します。
StartCoroutine("shoot");
スクリプトを保存し、この時点までに定義した内容をエディタで試してみましょう。
Coroutine を停止または再開できるようにするため、スクリプトに 2 つの文を追加します。

S キーが押されたかどうかを確認し、押された場合は StopCoroutine 関数に「shoot」をパラメータとして渡して Coroutine を停止できます。
同様に、R キーが押されたかどうかを確認し、「shoot」をパラメータとして StartCoroutine を呼び出すことで Coroutine を再開できます。
それでは、Update 内に次のように記述します。
if(Input.GetKeyDown(KeyCode.S)) StopCoroutine("shoot");
if(Input.GetKeyDown(KeyCode.R)) StartCoroutine("shoot");

これらの文を追加したら、スクリプトを保存し、Unity Editor に戻って動作を確認しましょう。
以上でこの短いチュートリアルは終了です。皆さんのお役に立てば幸いです。またお会いしましょう。