UnityUnityメモ

Unityで別シーンへ遷移!オブジェクトを指定座標へ移動させる方法を徹底解説

Unity

はじめに

Unityでゲームを作る際、シーンの切り替えはよく使われる重要な機能のひとつです。例えば、プレイヤーが特定の場所やオブジェクトに到達したときに次のステージに進む、タイトル画面からゲーム本編に移る、またはゲームオーバー画面に遷移する、などの場面でシーン遷移は欠かせません。


今回のチュートリアルでは、シーンを切り替えた際にオブジェクトを指定した座標へ移動させる方法について解説します。具体的には、以下のようなシナリオを想定します。

  • プレイヤーがキューブ(Cube)に触れると次のシーンへ移動。
  • 次のシーンでは、プレイヤーの位置が指定した座標に移動する。

この方法を学ぶことで、ゲームの進行に合わせてオブジェクトを自在に配置するスキルが身につきます。特にアクションゲームやRPGなど、プレイヤーの位置が重要になるゲームで活用できるテクニックです。

初心者の方でもわかりやすいよう、ステップごとに具体的な手順を説明します。コードの例や設定方法も丁寧に紹介するので、Unityに触れたばかりの方でも安心して進められます。

それでは、早速始めていきましょう!

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



2. シーン遷移の準備

Unityでシーン遷移を設定するためには、いくつかの準備が必要です。このステップでは、新しいシーンを作成し、それをUnityの「Build Settings」に登録する方法を解説します。

シーンの追加方法

  1. 新しいシーンを作成する
    • プロジェクトウィンドウで右クリックし、「Create」→「Scene」を選択します。
    • 作成したシーンにそれぞれ「Scene1」「Scene2」と名前を付けましょう。これにより、どのシーンがどの役割を持つかが明確になります。
  2. シーンを編集する
    • 作成したシーンをダブルクリックして開きます。
    • それぞれのシーンに必要なオブジェクト(例えば床やプレイヤーオブジェクトなど)を追加していきます。これについては次のセクションで詳しく説明します。

Build Settingsでのシーン登録

シーン遷移を実現するためには、Unityの「Build Settings」にシーンを登録する必要があります。以下の手順で設定を行いましょう。

  1. Build Settingsを開く
    • Unityのメインメニューから「File」→「Build Settings」を選択します。
  2. Scenes in Buildにシーンを追加する
    • 「Scenes in Build」リストに「Scene1」と「Scene2」が含まれていない場合、以下の手順で追加します:
      • 「Add Open Scenes」ボタンをクリックすると、現在開いているシーンが自動的にリストに追加されます。
      • リストに正しい順番でシーンが並んでいることを確認してください(例:最初に「Scene1」、次に「Scene2」)。
  3. 設定の保存
    • シーンを登録したら、「Ctrl+S」(Macでは「Cmd+S」)を押してプロジェクトを保存しておきましょう。

ここまでのポイント

  • シーンの作成と登録はシーン遷移の基礎です。
  • 必ず「Build Settings」に全てのシーンを登録しておくことで、エラーを防げます。

次のステップでは、シーン1に必要なオブジェクトを作成し、シーンの内容を具体的に構築していきます。



3. シーン1の作成

シーン1では、プレイヤーがキューブに触れるとシーンが切り替わる仕組みを作成します。以下の手順で進めていきましょう。


1. 床を作成する

  1. ヒエラルキーウィンドウを右クリックします。
  2. **「3D Object」→「Plane」**を選択して床を作成します。
    • 作成した床はシーンビューに表示されます。
  3. インスペクターウィンドウで以下の設定を行い、床のサイズを調整します:
    • Scale: (10, 1, 10)
      これで、広い床を作ることができます。

2. プレイヤーが触れるオブジェクト(キューブ)を作成する

  1. 再びヒエラルキーウィンドウを右クリックし、**「3D Object」→「Cube」**を選択します。
    • キューブが床の上に配置されます。
  2. インスペクターウィンドウでキューブのサイズや位置を調整します:
    • Position: (0, 0.5, 3)
    • Scale: (1, 1, 1)
  3. キューブが床の上に浮いているように配置されたことを確認します。
  4. 色を変更して、視認性を高めましょう:
    • プロジェクトウィンドウで右クリックし、**「Create」→「Material」**を選択して新しいマテリアルを作成します。
    • 作成したマテリアルの名前を「CubeMaterial」に変更します。
    • インスペクターウィンドウAlbedoの色を好きな色(例えば赤)に設定します。
    • キューブにドラッグ&ドロップしてマテリアルを適用します。

3. 設定を保存する

  1. **「File」→「Save As」**をクリックし、シーンを保存します。
  2. シーンの名前を「Scene1」として保存します。

これでシーン1の作成は完了です。次に進む準備が整いました!続けて、プレイヤーオブジェクトを設定していきましょう。



4. プレイヤーオブジェクトの設定

シーン遷移を実現するためには、シーン1にプレイヤーオブジェクト(今回はSphere)を作成し、操作可能にする必要があります。ここでは、プレイヤーオブジェクトの作成から操作スクリプトの設定までの手順を解説します。


1. プレイヤーオブジェクトの作成

  1. ヒエラルキーウィンドウで右クリックし、3D ObjectSphereを選択して球体のオブジェクトを作成します。
  2. 作成したSphereを選択した状態で、Inspectorウィンドウの名前欄を「Player」に変更します。
  3. Sphereの色を変更するには、以下の手順を実行します:
    • プロジェクトウィンドウで右クリックし、CreateMaterialを選択して新しいマテリアルを作成します。
    • マテリアルにわかりやすい名前(例: PlayerMaterial)を付け、Inspectorウィンドウで色を変更します。
    • このマテリアルをPlayerオブジェクトにドラッグ&ドロップします。

2. Rigidbodyコンポーネントの追加

Playerオブジェクトに物理挙動を追加するため、Rigidbodyコンポーネントを設定します。

  1. Playerオブジェクトを選択した状態で、Inspectorウィンドウの下部にあるAdd Componentボタンをクリックします。
  2. 検索ボックスにRigidbodyと入力し、リストからRigidbodyを選択して追加します。
  3. 必要に応じて以下のパラメータを設定します:
    • Mass(質量): 1(デフォルトで問題ありません)
    • Drag(抵抗): 必要であれば調整
    • Gravity: Use Gravityが有効になっていることを確認します。

3. プレイヤー操作スクリプトの作成

プレイヤーが移動できるようにするため、操作用スクリプトを作成してアタッチします。

  1. プロジェクトウィンドウで右クリックし、CreateC# Scriptを選択してスクリプトを作成します。
  2. スクリプトにわかりやすい名前(例: SphereMove)を付けます。
  3. 作成したスクリプトをダブルクリックして開き、以下のコードを入力します:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class SphereMove : MonoBehaviour
{

    void Start()
    {
        DontDestroyOnLoad(gameObject);
    }

    void Update()
    {
        float dx = Input.GetAxis("Horizontal") * Time.deltaTime * 3.0f;
        float dz = Input.GetAxis("Vertical") * Time.deltaTime * 3.0f;

        transform.position = new Vector3(
            transform.position.x + dx, transform.position.y, transform.position.z + dz
            );
    }

    void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.name == "Cube")
        {
            SceneManager.LoadScene("Scene2");
            this.transform.position = new Vector3(0, 1, 8);
        }
    }
}
  • このスクリプトをPlayerオブジェクトにドラッグ&ドロップしてアタッチします。

4. コードの解説

上記のコードのポイントを説明します。

  1. DontDestroyOnLoad
    DontDestroyOnLoad(gameObject); を使用することで、オブジェクトがシーン遷移時に破棄されるのを防ぎます。このスクリプトがアタッチされているSphere(プレイヤー)が、次のシーンでも保持されます。
  2. プレイヤーの移動
    Update() 内でキーボードの矢印キー(または WASD キー)を使ってプレイヤーを移動させる処理を行っています。
  3. 衝突時の処理
    OnCollisionEnter() メソッドで、Cubeという名前のオブジェクトに衝突した場合、SceneManager.LoadScene("Scene2"); を使って次のシーンに遷移します。その際、this.transform.position = new Vector3(0, 1, 8); によって、プレイヤーを指定した座標 (0, 1, 8) に移動させます。

5. 確認

Unityエディタでゲームを実行し、キーボードの矢印キーまたはW/A/S/DキーでSphereがスムーズに移動することを確認します。これでプレイヤーオブジェクトの設定は完了です!

次のステップでは、シーン遷移時にプレイヤーの位置を指定座標に移動させる方法を解説します。



5.シーン2の作成

シーン2では、プレイヤーがシーン遷移後に移動する場所を設定します。以下の手順に従って、シーン2を作成しましょう。


1. 床(Plane)を追加する

  1. ヒエラルキーウィンドウで右クリックし、「3D Object」→「Plane」を選択します。
  2. Inspectorウィンドウで「Position」を (0, 0, 0) に設定し、床の位置を中央に配置します。

2. ライティングの設定を行う

  1. メニューバーから「Window」→「Rendering」→「Lighting」を開きます。
  2. 「Lighting」タブの「Generate Lighting」をクリックしてライティングを生成します。
    • これにより、シーンが暗くならず、適切な明るさを確保できます。

3. シーンの保存

  1. メニューバーから「File」→「Save As」を選択します。
  2. シーンを「Scene2」という名前で保存します。

次にゲームを実行して、シーン1からシーン2への遷移が正しく動作するかを確認しましょう。シーン2にプレイヤーオブジェクトが指定座標 (0, 1, 8) に移動していれば成功です。



6. テストプレイとデバッグ

これまでの設定が完了したら、実際にゲームを動かして、シーン遷移やオブジェクトの移動が正しく動作するか確認しましょう。以下の手順に従ってテストプレイを行い、問題がある場合はデバッグを行います。


1. ゲームを実行する

  1. Unityのエディター上部にある「Play」ボタン(▶)をクリックします。
  2. シーン1が表示されることを確認します。
  3. キーボードの矢印キーまたはW/A/S/Dキーを使ってプレイヤー(Sphere)を動かします。

2. シーン遷移を確認する

  1. SphereをCubeにぶつけてみましょう。
  2. Cubeに衝突したタイミングで、シーンが「Scene2」に切り替わることを確認します。
  3. Scene2に遷移後、Sphereが指定した座標(例: 0,1,8)に移動していることをチェックします。

3. 問題があった場合のデバッグ

もし以下のような問題が発生した場合、原因を特定し、修正しましょう。


ケース1: シーンが切り替わらない

  • 原因1: 「Build Settings」にScene1とScene2が正しく追加されていない。
    • 対処法: Unityのメニューバーから「File」→「Build Settings」を開き、「Scenes in Build」に両方のシーンが登録されているか確認しましょう。
  • 原因2: Cubeの名前がスクリプト内の「Cube」と一致していない。
    • 対処法: ヒエラルキーウィンドウでCubeオブジェクトの名前を「Cube」に修正してください。

ケース2: Sphereが指定した座標に移動しない

  • 原因1: スクリプト内の「transform.position」コードにミスがある。
    • 対処法: スクリプトを確認し、以下の行が正しく記述されているかチェックしてください:csharpコードをコピーするthis.transform.position = new Vector3(0, 1, 8);
  • 原因2: 「DontDestroyOnLoad」が適切に動作していない。
    • 対処法: スクリプトのStart関数でDontDestroyOnLoad(gameObject);が正しく記述されているか確認してください。

ケース3: Sphereが動かない

  • 原因1: Rigidbodyコンポーネントが追加されていない。
    • 対処法: ヒエラルキーウィンドウでSphereを選択し、インスペクターにRigidbodyが追加されているか確認してください。
  • 原因2: 入力が反応していない。
    • 対処法: Unityの「Edit」→「Project Settings」→「Input Manager」を確認し、「Horizontal」と「Vertical」の設定が有効か確認しましょう。

4. 再度テストプレイを行う

問題を修正したら、再び「Play」ボタンを押してゲームを実行し、すべてが正しく動作するか確認してください。


これでテストプレイとデバッグは完了です!問題なく動作していれば、次のステップに進みましょう。ゲーム制作では、テストと修正を繰り返すことで、より完成度の高いプロジェクトが作れます!



よくある質問

Q
シーン遷移がうまくいかないのですが、原因は何ですか?
A

主な原因は以下の3つが考えられます。

  1. Build Settingsにシーンが登録されていない
    「File」→「Build Settings」から、「Scenes in Build」に必要なシーンが追加されていることを確認してください。
  2. シーン名のスペルミス
    SceneManager.LoadScene("Scene2"); の部分で、指定したシーン名が正確であることを再確認してください。シーン名は大文字・小文字を区別します。
  3. スクリプトが正しくアタッチされていない
    作成したスクリプトが正しいオブジェクトにアタッチされていることを確認してください。
Q
指定した座標に移動しません。どこを確認すれば良いですか?
A

まず以下を確認してください。

  1. 座標の指定が正しいか
    スクリプト内のthis.transform.position = new Vector3(0, 1, 8);で指定した座標が適切であることを確認してください。
  2. スクリプトの実行順序
    シーン遷移後に座標を設定する処理が実行される必要があります。DontDestroyOnLoadを正しく設定し、オブジェクトが遷移後も保持されているか確認してください。
  3. コリジョンの設定
    座標移動が別の物体と衝突して制限されていないか確認しましょう。
Q
オブジェクトの名前が一致しない場合、どうなりますか?
A

スクリプト内のif (collision.gameObject.name == "Cube")の条件で、名前が一致しない場合、シーン遷移が発生しません。以下を確認してください:

  1. オブジェクト名の正確さ
    Hierarchyウィンドウで「Cube」の名前が変更されていないか確認してください。
  2. 名前比較の代替方法
    複数のオブジェクトに対応する場合は、タグを使うのがおすすめです。タグを利用する場合は、以下のように条件を変更してください:
    if (collision.gameObject.CompareTag("TargetTag"))

おすすめのアセット

「Advanced Scene Manager」は、Unityでシーン管理を効率化するツールです。シンプルなUIで、複数のシーンを一括管理し、シームレスなロードや遷移が可能です。シーンのプリセットやローディング画面のカスタマイズもサポートしており、複雑なプロジェクトにも柔軟に対応できます。特にプロジェクトが大規模になるほど、その便利さが際立ちます。ゲーム開発者にとって、作業効率を大幅に向上させる強力なアセットです。