Unity でシーン間をテレポートする方法

Unity のシーン間のテレポートは、プレイヤーを異なるレベルやエリア間で遷移させるのに便利な機能です。このチュートリアルでは、シーンの追加ロード、プレイヤー データの永続性の確保、テレポート後の古いシーンのアンロードを使用してシーン テレポートを実装する方法について説明します。このアプローチにより、プレイヤー データやオブジェクトを失うことなくスムーズな遷移が保証されます。

シーンとテレポートポイントの設定

まず、シーンを設定し、シーン内のテレポートポイントを指定します。

シーンの作成

  1. Unity で、File > New Scene に移動して新しいシーンを作成します。それを Assets フォルダーに保存し、Scene1 という名前を付けます。
  2. このプロセスを繰り返して、Scene2 という名前の別のシーンを作成します。
  3. [ファイル] > [ビルド設定] に移動し、[開いているシーンの追加] をクリックして、両方のシーンをビルド設定に追加します。

テレポートポイントの指定

各シーンには、テレポート後にプレイヤーが現れる指定ポイントが必要です。

  1. Scene1 で、空の GameObject を作成し、TeleportPoint1 という名前を付けます。たとえば、SpawnPoint のように、適切なタグを付けます。
  2. Scene2 に、TeleportPoint2 という名前の別の空の GameObject を作成し、同様にタグ付けします。
  3. これらのゲームオブジェクトは、シーン間の遷移時にスポーン場所として機能します。

テレポートスクリプトの作成

テレポート スクリプトはシーンの遷移を管理し、プレイヤーが新しいシーンの正しい場所に移動し、前のシーンをアンロードできるようにします。

テレポートスクリプト

using UnityEngine;
using UnityEngine.SceneManagement;

public class Teleportation : MonoBehaviour
{
    public string sceneToLoad; // Name of the scene to load
    public string spawnPointTag = "SpawnPoint"; // Tag for identifying the spawn point

    private string currentSceneName; // To track the current scene

    void Start()
    {
        currentSceneName = SceneManager.GetActiveScene().name;
    }

    void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            DontDestroyOnLoad(other.gameObject); // Prevent player object from being destroyed

            SceneManager.LoadScene(sceneToLoad, LoadSceneMode.Additive); // Load new scene additively
            SceneManager.sceneLoaded += OnSceneLoaded; // Register callback for scene load completion
        }
    }

    void OnSceneLoaded(Scene scene, LoadSceneMode mode)
    {
        if (scene.name == sceneToLoad)
        {
            // Find the spawn point in the newly loaded scene
            GameObject spawnPoint = GameObject.FindWithTag(spawnPointTag);
            if (spawnPoint != null)
            {
                GameObject player = GameObject.FindWithTag("Player");
                if (player != null)
                {
                    // Teleport the player to the spawn point
                    player.transform.position = spawnPoint.transform.position;
                }
            }

            // Unload the previous scene
            SceneManager.UnloadSceneAsync(currentSceneName);

            // Update the current scene name and unregister the event handler
            currentSceneName = sceneToLoad;
            SceneManager.sceneLoaded -= OnSceneLoaded;
        }
    }
}
  1. Scripts フォルダーに Teleportation.cs という名前の新しい C# スクリプトを作成します。
  2. このスクリプトを、ドアやポータルなどのテレポート トリガーとして機能するオブジェクトに添付します。
  3. sceneToLoad を遷移先のシーンの名前に設定し、新しいシーンのテレポート ポイントが正しくタグ付けされていることを確認します。

シーン間でのプレイヤーデータの処理

ゲームでシーン間でプレイヤーデータ(インベントリ、ヘルスなど)を維持する必要がある場合は、データ永続化戦略を実装します。

永続的なプレイヤーデータ

using UnityEngine;

public class PlayerData : MonoBehaviour
{
    public static PlayerData instance;

    public int health = 100;

    void Awake()
    {
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }
}
  1. PlayerData.cs という名前の新しい C# スクリプトを作成し、それをプレーヤー オブジェクトまたは別の GameObject にアタッチします。
  2. DontDestroyOnLoad(gameObject) を使用して、シーン遷移中にこの GameObject が破棄されないようにします。

結論

Unity のシーン間のテレポート、特にシーンの追加ロードとアンロードにより、シームレスなエクスペリエンスが実現します。この方法では、プレイヤーなどの重要なゲーム オブジェクトが保持され、前のシーンをアンロードすることでリソースが効率的に管理されます。このようなアプローチは、大規模な環境や連続した環境を持つゲームで特に役立ちます。この設定をさらにカスタマイズして、状態データの維持や遷移中の視覚効果の追加など、特定のゲームプレイ要件に合わせます。