この記事で学べること
- Start関数とUpdate関数の実行タイミングの違いを理解できます
- フレームとFPSの概念を学びます
- 各関数をどのような場面で使うのかを知ることができます
- 実際に動くサンプルコードで動作を確認できます
前提知識
この記事はスクリプトの実行タイミングについて解説します。以下の記事で基本を学んでおくと良いでしょう:
- 初めてのスクリプト作成:Hello Unityを表示しよう:スクリプトの基本的な書き方
- 再生モードでゲームをテストしよう:ゲームの実行について
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関数の違いが理解できたでしょうか?これでスクリプトの実行タイミングをコントロールできるようになりました!
次のステップ
基本的な関数の実行タイミングを理解したら、次はデータを保存する方法を学びましょう:
- 変数でデータを保存しよう:データを保存・管理する方法
- Unityスタートガイド 目次
コメント
コメント一覧 (1件)
[…] Start関数とUpdate関数を理解しよう:関数の実行タイミング […]