Start関数とUpdate関数を理解しよう【Unityスタートガイド6-3】

目次

この記事で学べること

  • Start関数とUpdate関数の実行タイミングの違いを理解できます
  • フレームとFPSの概念を学びます
  • 各関数をどのような場面で使うのかを知ることができます
  • 実際に動くサンプルコードで動作を確認できます

前提知識

この記事はスクリプトの実行タイミングについて解説します。以下の記事で基本を学んでおくと良いでしょう:

Start関数とUpdate関数の役割

Start関数:ゲーム開始時の初期化処理

Start関数は、スクリプトが動き始めるとき(最初のUpdateの直前)に1回だけ実行されます。シーンに最初から置いてあるオブジェクトなら、ゲーム開始時に呼ばれます。

void Start()
{
    Debug.Log("ゲームが始まりました!");
    // ここに初期化処理を書く
}

こんな時に使います:

  • ゲーム開始時の初期設定
  • 他のコンポーネントの参照を取得
  • 初期値の設定
  • 一度だけの処理(BGMの再生など)

Update関数:毎フレーム実行されるメイン処理

Update関数は、ゲームが実行されている間、毎フレーム繰り返し実行されます。

void Update()
{
    Debug.Log("毎フレーム実行されます");
    // ここにメインのゲーム処理を書く
}

こんな時に使います:

  • プレイヤーの入力処理
  • キャラクターの移動
  • アニメーションの更新
  • 時間の経過処理

フレームとは?FPSの概念

フレームの仕組み

ゲームは静止画を高速で切り替えて動いているように見せています。この1枚1枚の静止画をフレームと呼びます。

1秒間に何フレーム描くかは、パソコンの性能やモニター、設定によって変わります。60フレーム(60FPS)のこともあれば、144フレームのこともあります。つまり、Update関数が1秒間に何回呼ばれるかは、環境によって違うということです(ここは6-8の記事で大事になってきます)。

FPS(Frames Per Second)の重要性

FPSとは「1秒間に何フレーム表示できるか」を表す値です:

  • 60FPS:滑らかな動き(理想的)
  • 30FPS:少しカクつく
  • 15FPS:かなりカクつく

Update関数内で重い処理を書くとFPSが低下し、ゲームがカクカクになってしまいます。

注意点:本講座ではFPSを固定したゲーム開発は行いません。昨今のPCゲームではゲーミングPCなどで高FPS(120FPS以上)を実現するゲームも増えています。ただし、PC向けのゲームでフレームレートを固定しない場合、ゲーム起動直後にCPU使用率が高くなり、ファンがブン回ったりすることがありますので注意が必要です。また、モバイルアプリでは30FPSで固定されることが多いため、プラットフォームに応じた扱いに注意しましょう。

他のUpdate系関数:FixedUpdateとLateUpdate

UnityにはUpdate関数以外にも似た関数があります:

FixedUpdate:物理演算向け

void FixedUpdate()
{
    // 物理演算関連の処理
}
  • 実行タイミング:固定間隔(デフォルト0.02秒ごと)
  • 用途:Rigidbodyを使った物理演算
  • 特徴:FPSに関係なく安定した間隔で実行

LateUpdate:Update後の処理

void LateUpdate()
{
    // Update後の処理
}
  • 実行タイミング:全てのUpdate関数実行後
  • 用途:カメラの追従、Transformの最終調整
  • 特徴:他のUpdate処理が終わった後に実行

これらの関数は必要に応じて使いますが、まずはStartとUpdateを覚えましょう。

実践:回転するキューブを作ってみよう

サンプルコード

Update関数を使って、キューブを回転させるスクリプトを作成してみましょう:

using UnityEngine;

public class RotatingCube : MonoBehaviour
{
    void Start()
    {
        Debug.Log("回転するキューブが登場!");
    }

    void Update()
    {
        // Y軸を中心に、1秒間に90度のペースで回転
        transform.Rotate(0f, 90f * Time.deltaTime, 0f);
    }
}

コードの解説:

  • transform.Rotate(X, Y, Z):オブジェクトを回転させる命令。カッコの中はX軸、Y軸、Z軸の回転角度
  • Time.deltaTime:前のフレームから何秒たったか(60FPSなら約0.016秒)
  • 90f * Time.deltaTime:「1秒で90度」を1フレーム分に割った角度
    • 1フレームごとに1度ずつ回すと、60FPSのパソコンでは1秒で60度、144FPSのパソコンでは1秒で144度と、速さが変わってしまいます。Time.deltaTimeを掛けておけば、どのパソコンでも1秒で90度になります
    • 詳しくは6-8の記事で説明します

実行結果の確認

このスクリプトをキューブにアタッチして実行すると、キューブがゆっくり回転し続けます。

実行順序の図解

Unityの1フレームでの実行順序を理解しておきましょう:

ゲーム開始
    ↓
Awake関数(オブジェクトが作られたときに1回)
    ↓
Start関数(最初のUpdateの前に1回)
    ↓
┌─ 1フレームの流れ(くり返し)───────────
│ FixedUpdate関数(決まった間隔ごと。1フレームに0回〜数回)
│     ↓
│ 物理演算(Rigidbodyの移動や衝突の計算)
│     ↓
│ Update関数(毎フレーム1回)
│     ↓
│ LateUpdate関数(全てのUpdateの後に1回)
│     ↓
│ 画面の描画
└──────────────────────────

物理演算はUpdateより前に行われます。まずは「Start→Updateの繰り返し」と覚えておけばOKです。Awakeは「Startよりさらに前に呼ばれる初期化用の関数」で、使い方は6-9の記事で紹介します。

スライム

関数がいっぱい出てきて、どれを使えばいいかわからない・・・

フェアリー

迷ったらStartとUpdate!物理(Rigidbody)で動かすときだけFixedUpdate、カメラの追いかけはLateUpdate、って覚えておけば大丈夫だよ

注意点やヒント

Start関数内で他のコンポーネントを参照するのが一般的です。例えば:

private Rigidbody rb;

void Start()
{
    rb = GetComponent<Rigidbody>(); // コンポーネントを取得
}

void FixedUpdate()
{
    rb.AddForce(Vector3.up); // 取得したコンポーネントを使う(物理の力はFixedUpdateで加える)
}

Startで取得しておけば、毎回探す必要がありません。Rigidbodyに力を加える処理は、物理演算と同じ間隔で呼ばれるFixedUpdateに書くのが基本です。GetComponentの使い方は6-9の記事で詳しく説明します。

よくあるエラーと対処法

エラー: Update関数が呼ばれない

  • 原因: スクリプトがアタッチされていない、またはゲームオブジェクトが非アクティブ
  • 対処法: Inspectorでスクリプトが表示されているか、オブジェクトが有効になっているかを確認

エラー: 処理が重すぎてFPSが低下する

  • 原因:Update関数の中で、毎フレームやる必要のない重い処理をしている(毎フレームオブジェクトを探す、大量のログを出すなど)
  • 対処法:ゲームビューのStatsでFPSを確認する。一度だけでいい処理はStartに移す、ログを減らす

エラー: Start関数でGetComponentがnullを返す

  • 原因: 参照したいコンポーネントが同じゲームオブジェクトにアタッチされていない
  • 対処法: Inspectorでコンポーネントが追加されているか確認

まとめ

  • Start関数:ゲーム開始時に1回だけ実行、初期化処理に最適
  • Update関数:毎フレーム実行、メインのゲーム処理に使用
  • フレーム:ゲームの1コマ。1秒間のフレーム数(FPS)は環境によって変わる
  • Time.deltaTime:前のフレームからの時間。動きの速さをそろえるのに使う
  • 実行順序を理解して適切な関数を選ぼう

Start関数とUpdate関数の違いが理解できたでしょうか?これでスクリプトの実行タイミングをコントロールできるようになりました!

次のステップ

基本的な関数の実行タイミングを理解したら、次はデータを保存する方法を学びましょう:

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメント一覧 (1件)

コメントする

目次