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 に戻って動作を確認しましょう。

以上でこの短いチュートリアルは終了です。皆さんのお役に立てば幸いです。またお会いしましょう。

チュートリアルを検索

フレーズ、または複数のキーワードをカンマで区切って入力してください。

このウェブサイトは個人サイトであり、販売チャネルではありません。3Dモデルに関するページは、私の作品の一部を記録するためのものであり、販売案内、価格、購入方法、商用リンクは掲載していません。現在、カスタム制作、コンサルティング、その他の業務上の協力依頼は受け付けていません。


プライバシー及びクッキーの使用に関する拡張情報の通知