Unity でシーン間をテレポートする方法
Unity のシーン間のテレポートは、プレイヤーを異なるレベルやエリア間で遷移させるのに便利な機能です。このチュートリアルでは、シーンの追加ロード、プレイヤー データの永続性の確保、テレポート後の古いシーンのアンロードを使用してシーン テレポートを実装する方法について説明します。このアプローチにより、プレイヤー データやオブジェクトを失うことなくスムーズな遷移が保証されます。
シーンとテレポートポイントの設定
まず、シーンを設定し、シーン内のテレポートポイントを指定します。
シーンの作成
- Unity で、
File > New Scene
に移動して新しいシーンを作成します。それをAssets
フォルダーに保存し、Scene1
という名前を付けます。 - このプロセスを繰り返して、
Scene2
という名前の別のシーンを作成します。 [ファイル] > [ビルド設定]
に移動し、[開いているシーンの追加]
をクリックして、両方のシーンをビルド設定に追加します。
テレポートポイントの指定
各シーンには、テレポート後にプレイヤーが現れる指定ポイントが必要です。
Scene1
で、空の GameObject を作成し、TeleportPoint1
という名前を付けます。たとえば、SpawnPoint
のように、適切なタグを付けます。Scene2
に、TeleportPoint2
という名前の別の空の GameObject を作成し、同様にタグ付けします。- これらのゲームオブジェクトは、シーン間の遷移時にスポーン場所として機能します。
テレポートスクリプトの作成
テレポート スクリプトはシーンの遷移を管理し、プレイヤーが新しいシーンの正しい場所に移動し、前のシーンをアンロードできるようにします。
テレポートスクリプト
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;
}
}
}
Scripts
フォルダーにTeleportation.cs
という名前の新しい C# スクリプトを作成します。- このスクリプトを、ドアやポータルなどのテレポート トリガーとして機能するオブジェクトに添付します。
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);
}
}
}
PlayerData.cs
という名前の新しい C# スクリプトを作成し、それをプレーヤー オブジェクトまたは別の GameObject にアタッチします。DontDestroyOnLoad(gameObject)
を使用して、シーン遷移中にこの GameObject が破棄されないようにします。
結論
Unity のシーン間のテレポート、特にシーンの追加ロードとアンロードにより、シームレスなエクスペリエンスが実現します。この方法では、プレイヤーなどの重要なゲーム オブジェクトが保持され、前のシーンをアンロードすることでリソースが効率的に管理されます。このようなアプローチは、大規模な環境や連続した環境を持つゲームで特に役立ちます。この設定をさらにカスタマイズして、状態データの維持や遷移中の視覚効果の追加など、特定のゲームプレイ要件に合わせます。