UnityUnityメモ

Unityでプレイヤーを残したままシーンを切り替える方法【初心者向け解説】

Unity

はじめに

Unityでゲームを作っていると、「シーンを切り替えたいけどプレイヤーが消えてしまう!」と困ったことはありませんか?ゲームの進行中にプレイヤーの状態やオブジェクトを保持したままシーンを移動できると、よりスムーズで楽しいゲーム体験を作ることができます。

例えば、RPGゲームでプレイヤーが村からダンジョンへ移動するとき、プレイヤーのデータがそのまま維持されていることが求められます。これを実現するには、UnityのDontDestroyOnLoad機能を使うのがポイントです!

この記事では、Unity初心者でも簡単に「プレイヤーを消さずにシーンを切り替える方法」を解説します。サンプルコードや実際の操作手順を丁寧に説明するので、ぜひ最後まで読んで試してみてくださいね!

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




手順1: シーンの作成

Unityでゲームを作成する際、シーンを切り替える処理を行うためには、まず複数のシーンを準備する必要があります。この手順では、シーンの作成と基本的な設定を解説します。


1. 新しいシーンを作る

  1. シーンを作成する方法
    Unityのメニューから次の操作を行います:
    • 上部メニューの 「File」→「New Scene」 をクリック。
    • 新しいシーンが作成されます。
  2. シーンを保存する
    作成したシーンを保存します:
    • Ctrl + S(Macの場合は Command + S) を押して保存画面を開きます。
    • シーン名を「Scene01」と入力して保存してください。
    • 同様の手順で、もう1つのシーンを作成し「Scene02」と名前を付けて保存します。

2. Build Settingsでシーンを登録する

シーン切り替えを正しく行うには、すべてのシーンをBuild Settingsに登録する必要があります。

  1. Build Settingsを開く
    • メニューの 「File」→「Build Settings」 を選択します。
  2. Scenes In Buildに追加
    • 左下の「Add Open Scenes」をクリックすると、現在開いているシーンが登録されます。
    • 同様に「Scene01」「Scene02」の両方を登録してください。
    • 登録が完了すると、リストに「Scene01」と「Scene02」が表示されます。

3. シーンにテキストオブジェクトを配置

それぞれのシーンが正しく切り替わったことを確認しやすいように、テキストオブジェクトを配置します。

  1. テキストオブジェクトの作成
    • ヒエラルキー(Hierarchy)ウィンドウで右クリックし、「UI」→「Text」 を選択します。
  2. テキストの編集
    • Scene01には「01」、Scene02には「02」と入力してください。
    • テキストオブジェクトを適切な位置に移動して画面中央に表示されるように配置します。



手順2: プレイヤーとトリガーの作成

次にプレイヤー(Sphere)とプレイヤーが触れたらシーンを変更するトリガー用オブジェクト(Cube)を作成します。

これらはシーン1に配置します。


1. プレイヤー(Sphere)の作成

  1. Sphereを作成する
    • ヒエラルキー(Hierarchy)ウィンドウを右クリックします。
    • 「3D Object」→「Sphere」を選択します。
      これで球体のオブジェクトが作成されます。任意で色を変更してください。
  2. プレイヤーの位置を調整
    • ヒエラルキーで作成したSphereを選択します。インスペクター(Inspector)ウィンドウで「Transform」コンポーネントの「Position」値を調整します。
      例: X: 0, Y: 0.5, Z: 0と設定します。
  3. 物理特性の追加
  4. インスペクター画面の「AddComponent」ボタンをクリックします。
    • 「Rigidbody」を検索して追加します。
    • 「UseGravity」のチェックを外します。

2. トリガー(Cube)の作成

  1. Cubeを作成する
    • ヒエラルキー(Hierarchy)ウィンドウを右クリックします。
    • 「3D Object」→「Cube」を選択します。
      これでキューブ型のオブジェクトが作成されます。任意で色を変更してください。
  2. トリガーの設定
    • ヒエラルキーで作成したCubeを選択します。
    • インスペクター(Inspector)ウィンドウで「Box Collider」コンポーネントを探します。
    • 「Is Trigger」という項目にチェックを入れます。
      この設定により、Cubeが「触れるだけで反応する」オブジェクトになります。
  3. トリガーの位置とサイズを調整
    • ヒエラルキーでTriggerZoneを選択し、インスペクターの「Transform」コンポーネントで以下のように値を調整します。
      • Position: X: 3, Y: 0.5, Z: 0
      • Scale: X: 2, Y: 2, Z: 2
        これにより、トリガーゾーンが少し大きくなり、プレイヤーが触れやすくなります。



手順3: スクリプトの作成

次に、プレイヤーにアタッチするスクリプトを作成します。


1. スクリプトファイルを作成する

まず、プレイヤーを制御するためのスクリプトを作成します。

  1. プロジェクトウィンドウを右クリックします。
  2. メニューから「Create」→「C# Script」を選びます。
  3. 作成されたスクリプトに「SphereMove」という名前を付けます。

2. スクリプトにコードを書く

作成した「SphereMove」スクリプトをダブルクリックして開き、以下のコードを貼り付けてください。

1. 必要なライブラリの読み込み

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement; // シーン遷移に必要
  • using UnityEngine;
    Unityでゲームを作るときに必要な基本的な機能を使うためのコード。
  • using UnityEngine.SceneManagement;
    シーン(画面のようなもの)を切り替えるための機能を使うために必要です。

2. クラスの定義

public class SphereMove : MonoBehaviour
  • SphereMove
    このスクリプトの名前で、「球を動かすスクリプト」という意味でつけられています。
  • MonoBehaviour
    Unityのスクリプトはこの「MonoBehaviour」というクラスを継承(親から引き継ぐ)ことで、ゲームオブジェクトに取り付けられるようになります。

3. 変数の宣言

private float speed = 3.0f;
  • private
    この変数はこのクラスの中だけで使えます。他のスクリプトからは触れません。
  • float speed
    球の移動スピードを設定する変数です。値は 3.0 に設定されています。

4. Startメソッド

void Start()
{
DontDestroyOnLoad(gameObject); // シーンを切り替えても削除しない
}
  • Startメソッド
    ゲームが始まったときに1回だけ実行される処理です。
  • DontDestroyOnLoad(gameObject);
    シーンが切り替わっても、このスクリプトが付いているオブジェクトを削除しないようにしています。
    例えば、最初のシーンから次のシーンに移った後も球が消えずに残ります。

5. Updateメソッド

void Update()
{
float moveX = Input.GetAxis("Horizontal") * Time.deltaTime * speed;
float moveZ = Input.GetAxis("Vertical") * Time.deltaTime * speed;
transform.position = new Vector3(
transform.position.x + moveX,
transform.position.y,
transform.position.z + moveZ
);
}
  • Updateメソッド
    毎フレーム(1秒間に何十回も)呼び出される処理です。球を動かす部分です。
  • Input.GetAxis("Horizontal")
    キーボードの「左右矢印キー」や「A」「D」を押したときに、値(-1~1)が返されます。
  • Input.GetAxis("Vertical")
    キーボードの「上下矢印キー」や「W」「S」を押したときに、値(-1~1)が返されます。
  • Time.deltaTime
    前のフレームから今のフレームまでにかかった時間。この値をかけることで、動きがコンピュータの性能に依存せず一定になります。
  • transform.position
    オブジェクト(この場合は球)の現在の位置。
  • Vector3
    「x、y、z」の3つの値を持つ3次元の座標を扱うクラスです。ここで位置を更新しています。

6. OnTriggerEnterメソッド

void OnTriggerEnter(Collider other)
{
if (other.gameObject.name == "Cube")
{
SceneManager.LoadScene("Scene02");
}
}
  • OnTriggerEnter(Collider other)
    球が他のオブジェクト(トリガー付き)に触れたときに呼び出されます。
  • if (other.gameObject.name == "Cube")
    触れたオブジェクトの名前が「Cube」なら以下の処理を実行します。
  • SceneManager.LoadScene("Scene02");
    シーンを「Scene02」に切り替えます。

このスクリプト全体の流れ

  1. 球が動く
    キーボードの矢印キーや「WASDキー」を使って球を動かせます。
  2. 他のオブジェクトに触れるとシーンが変わる
    球が「Cube」という名前のオブジェクトに触れると、次のシーン(Scene02)に切り替わります。
  3. 球はシーンをまたいでも消えない
    DontDestroyOnLoadを使っているため、球の状態は次のシーンに引き継がれます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement; // シーン遷移に必要

public class SphereMove : MonoBehaviour
{
    private float speed = 3.0f; // プレイヤーの移動速度

    void Start()
    {
        DontDestroyOnLoad(gameObject); // シーンを切り替えても削除しない
    }

    void Update()
    {
        // キーボード入力でプレイヤーを移動
        float moveX = Input.GetAxis("Horizontal") * Time.deltaTime * speed;
        float moveZ = Input.GetAxis("Vertical") * Time.deltaTime * speed;

        transform.position = new Vector3(
            transform.position.x + moveX, 
            transform.position.y, 
            transform.position.z + moveZ
        );
    }

    void OnTriggerEnter(Collider other)
    {
        // Cubeに接触したらScene02へ移動
        if (other.gameObject.name == "Cube")
        {
            SceneManager.LoadScene("Scene02");
        }
    }
}

3. スクリプトをSphereにアタッチ

次に、このスクリプトをプレイヤーの役割を持つSphereにアタッチします。

  1. ヒエラルキーウィンドウで「Sphere」を選択します。
  2. 作成した「SphereMove」スクリプトをプロジェクトウィンドウからドラッグ&ドロップして、Sphereにアタッチします。



手順4: 実行

  1. プレイモードを開始
    Unityエディターの上部にある「再生ボタン(▶)」をクリックして、プレイモードを開始します。
  2. プレイヤー(Sphere)を操作
    キーボードの矢印キーや「W」「A」「S」「D」キーを使ってSphereを移動させます。SphereをCube(トリガーゾーン)に接触させましょう。
  3. シーンが切り替わることを確認
    Cubeに触れると「Scene01」から「Scene02」に自動的に切り替わります。シーンが変わった後もSphere(プレイヤー)は削除されず、そのまま残っていることを確認してください。

この方法を使えば、ゲーム内でシームレスにシーンを切り替えながらプレイヤーを操作する仕組みが作れます。Unity初心者の方でも手順通り進めるだけで簡単に実現できますので、ぜひ挑戦してみてください!不明点があれば「よくある質問」も参考にしてみてくださいね。それでは、楽しいゲーム開発ライフを! 😊



よくある質問 (FAQ)

Q
Sphereが削除されてしまいます。どうすればいいですか?
A

スクリプトのDontDestroyOnLoadが正しく記述されているか確認してください。

Q
他のシーンにもオブジェクトを追加できますか?
A

はい、他のシーンに必要なオブジェクトを自由に追加してみてください。

Q
トリガーが機能しません。
A

Cubeオブジェクトの「Is Trigger」がオンになっているか確認してください。また、SphereとCubeが接触しているかチェックしてください。