UnityUnityメモ

【Unity】Updateを使わずにくり返し処理を実行する簡単スクリプト

Unity

1. はじめに

Unityでオブジェクトの動きやゲームの進行を管理する際、多くの人がUpdate()メソッドを使用しますよね。Update()はフレームごとに呼び出される便利な仕組みですが、場合によっては使用しない方がコードがシンプルになることもあります。

この記事では、Update()を使わずに、while (true)コルーチンを活用してCubeを前後に動かす方法を解説します!
「ゲームオブジェクトを動かす方法をもっと知りたい」「新しいスクリプトの書き方を試したい」というUnity初心者の方にもわかりやすい内容にしています。

この方法を使うことで、コードをより明確にし、特定の時間間隔での動作制御も簡単に行えるようになります。それでは、実際にスクリプトを作成していきましょう!

Unityを触ったことがないという方はコチラの記事から見てみてください!



2. CubeMoveスクリプトの作成

この記事では、Update()を使わずにCubeを前後に動かすスクリプト「CubeMove」を作成します。以下の手順に従って進めてください!


① スクリプトの作成

まず、Unityエディターでスクリプトを作成します。

  1. プロジェクトウィンドウを右クリックします。
  2. メニューから「Create」→「C# Script」を選択します。
  3. スクリプト名を「CubeMove」に変更します。

これで新しいスクリプトファイルが作成されました。


② コードの記述

次に、作成した「CubeMove.cs」に以下のコードを書き込みます。

using System.Collections;
using UnityEngine;

public class CubeMove : MonoBehaviour
{
    // スタート時にコルーチンを開始する
    void Start()
    {
        StartCoroutine("CubeStart");  // コルーチンを開始
    }

    // Cubeを前後に動かすコルーチン
    IEnumerator CubeStart()
    {
        while (true) // 無限ループ
        {
            // Cubeを前に動かす
            for (int i = 0; i < 100; i++)
            {
                yield return new WaitForSeconds(0.01f); // 0.01秒ごとに
                transform.Translate(0, 0, 0.1f);       // Z軸方向に0.1ずつ移動
            }

            // 1秒間待つ
            yield return new WaitForSeconds(1.0f);

            // Cubeを後ろに動かす
            for (int k = 0; k < 100; k++)
            {
                yield return new WaitForSeconds(0.01f); // 0.01秒ごとに
                transform.Translate(0, 0, -0.1f);      // Z軸方向に-0.1ずつ移動
            }

            // 1秒間待つ
            yield return new WaitForSeconds(1.0f);
        }
    }
}

③ コードの解説

  1. Startメソッド
    Unityでゲームオブジェクトがシーンに読み込まれるときに一度だけ呼び出されるメソッドです。ここでStartCoroutineを使ってコルーチンを開始します。
  2. IEnumerator CubeStartメソッド
    このメソッド内で、無限ループ(while (true))を使い、Cubeを前後に動かす処理を記述しています。
  3. forループで移動
    transform.Translateを使用して、Cubeを0.1ずつ移動させています。前後の移動の間に1秒間の待機を加え、滑らかに動作するようにしています。
  4. WaitForSeconds
    yield return new WaitForSecondsを使うことで、一定時間待機する動作を実現しています。これにより、Cubeの動きをゆっくりとした動作にできます。

スクリプトが完成したら、次のステップでCubeオブジェクトにアタッチして動作確認を行います!



3. スクリプトのアタッチと動作確認

スクリプトが完成したら、次はそれをCubeオブジェクトにアタッチして動作確認を行いましょう。以下の手順に従って進めてください。

1. Cubeオブジェクトを作成する

  1. ヒエラルキーウィンドウで右クリックします。
  2. 表示されたメニューから 「3D Object」→「Cube」 を選択します。
  3. 新しいCubeがシーンに作成されます。

2. スクリプトをCubeにアタッチする

  1. プロジェクトウィンドウで先ほど作成した「CubeMove」スクリプトを見つけます。
  2. スクリプトをドラッグし、シーンビューまたはヒエラルキーウィンドウのCubeにドロップします。
  3. スクリプトがCubeにアタッチされていることを確認するには、Cubeをクリックし、インスペクターウィンドウの下部をチェックします。「CubeMove (Script)」というコンポーネントが表示されていれば成功です。

3. 動作確認を行う

  1. Unityエディターの上部にある 「Play」ボタン をクリックしてゲームを実行します。
  2. Cubeが以下のように動作しているか確認してください。
    • Z軸方向に前進(手前から奥に移動)する。
    • 1秒間静止する。
    • Z軸方向に後退(奥から手前に移動)する。
    • 再び1秒間静止する。
    • この動きが繰り返される。

もしCubeが正しく動かない場合は、以下を確認してください。

  • スクリプト内のコードにタイポやエラーがないか確認する。
  • Cubeに「CubeMove」スクリプトが正しくアタッチされているか確認する。

これでスクリプトのアタッチと動作確認は完了です!次のセクションでは、コードの仕組みについてさらに深掘りしていきます。コルーチンとwhile (true)の使い方をマスターしましょう!



4. コードの仕組みを深掘り

このセクションでは、今回のコード「CubeMove.cs」で使われている重要な仕組みや概念を解説します。Unity初心者の方でも理解しやすいように、わかりやすく説明していきます!


コルーチン (Coroutine) とは?

コルーチンは、Unityの特殊なメソッドの一つで、時間経過やフレーム間で処理を分割して実行するために使われます。通常のメソッドは呼び出されるとすぐに終了しますが、コルーチンでは処理を一時停止したり、後で再開したりできます。

今回のコードでは、IEnumeratorを使ってコルーチンを定義しています。

IEnumerator CubeStart()
{
// 処理内容
}

ポイント:

  • yield return を使うことで、処理を一時停止し、指定した条件(時間経過など)で再開できます。
  • StartCoroutine("コルーチン名") でコルーチンを開始します。

無限ループの実現:while (true)

while (true) は条件が常に「真」であるため、永遠に繰り返し処理を実行するループ構文です。ここでは、Cubeを前後に動かす動作を永遠に繰り返すために使っています。

while (true)
{
// 前に動かす処理
// 後ろに動かす処理
}

注意点:

  • 無限ループは誤った使い方をするとプログラムが停止してしまう原因になります。しかし、コルーチン内で実行すると適切に制御されます。
  • yield return を含めない無限ループは避けましょう。Unityエディターがフリーズする原因になります。

Cubeを動かす:transform.Translate()

transform.Translate() は、オブジェクトを特定の方向に移動させるためのメソッドです。このコードでは、Z軸方向にCubeを移動させています。

transform.Translate(0, 0, 0.1f); // Z軸方向に0.1移動
  • (0, 0, 0.1f) の各値は、それぞれ X軸、Y軸、Z軸方向の移動量を示します。
  • 正の値で前進、負の値で後退します。

時間制御:WaitForSeconds()

WaitForSeconds() を使うことで、一定時間処理を一時停止できます。このコードでは、0.01秒ごとにCubeを少しずつ動かしています。

yield return new WaitForSeconds(0.01f);

ポイント:

  • このように小さな間隔を設定することで、Cubeがスムーズに動くように見えます。
  • 1秒間の待機を設定する場合は次のように記述します。csharpコードをコピーするyield return new WaitForSeconds(1.0f);

前後の動きを分ける:forループ

前後の動きを作るために、forループで一定回数だけtransform.Translate()を実行しています。

for (int i = 0; i < 100; i++)
{
yield return new WaitForSeconds(0.01f);
transform.Translate(0, 0, 0.1f);
}
  • for (int i = 0; i < 100; i++): ループを100回繰り返します。
  • 1回のループでCubeが「0.1」ずつ移動し、全体で「10」だけ移動します(0.1 × 100)。

全体の流れ

  1. Cubeが前に進む(100回繰り返し)。
  2. 1秒間停止。
  3. Cubeが後ろに戻る(100回繰り返し)。
  4. 1秒間停止。
  5. この動きを永遠に繰り返します。

まとめ

  • コルーチンは処理を分割し、滑らかに実行するための重要な仕組みです。
  • while (true)WaitForSeconds() を組み合わせることで、ゲーム内で自然な動きを実現できます。
  • 小さなステップを積み重ねることで、大きな動作を作り出すのがポイントです!



よくある質問

Q
コルーチンを使ったプログラムが動かないのですが、どうすればいいですか?
A

コルーチンが動かない原因として以下の点を確認してください。

  • StartCoroutineを呼び出していない: スクリプトのStartメソッド内でStartCoroutineを正しく呼び出しているか確認してください。
  • スクリプトがアタッチされていない: 作成したスクリプトがCubeオブジェクトにアタッチされているか確認してください。
  • スペルミス: コルーチン名やメソッド名にスペルミスがないか確認してください。
Q
while (true)を使うと無限ループでゲームが止まることはありませんか?
A

無限ループによるフリーズは、yield returnを使わない場合に発生します。今回のスクリプトではyield returnで一定時間待つ処理を挟んでいるため、ゲームが止まることはありません。ただし、コードを書く際には必ずyield returnを入れることを忘れないようにしてください。

Q
コルーチンの実行を途中で止めることはできますか?
A

コルーチンを途中で止めるには、StopCoroutineを使用します。例えば、StopCoroutine("CubeStart");のようにコルーチン名を指定することで、その処理を止めることが可能です。また、すべてのコルーチンを一度に止めたい場合は、StopAllCoroutinesを使う方法もあります。

おすすめのアセット

「HyperCasual – Puzzle Game Engine」は、Unityでパズルゲームを簡単に作成できるツールキットです。このエンジンは、スタックソートグリッドベースのパズルゲームの作成に最適で、8種類のゲームテンプレートが含まれています。初心者から上級者まで、あらゆるレベルの開発者に対応しており、直感的に使えるカスタマイズ機能を備えています。