Unity에서 장면 간 순간이동하는 방법

Unity에서 장면 간 순간이동은 플레이어를 다른 레벨이나 영역 간에 전환하는 데 유용한 기능입니다. 이 튜토리얼에서는 가산적 장면 로딩을 사용하여 장면 순간이동을 구현하고, 플레이어 데이터 지속성을 보장하고, 순간이동 후 이전 장면을 언로드하는 방법을 다룹니다. 이 접근 방식은 플레이어 데이터나 객체를 잃지 않고 원활한 전환을 보장합니다.

장면 및 순간이동 지점 설정

먼저, 장면을 설정하고 장면 내에서 순간이동 지점을 지정합니다.

장면 만들기

  1. Unity에서 파일 > 새 장면으로 이동하여 새 장면을 만듭니다. 자산 폴더에 저장하고 장면1이라는 이름을 지정합니다.
  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에서 장면 간 순간이동, 특히 부가 장면 로딩 및 언로딩은 매끄러운 경험을 제공합니다. 이 방법은 플레이어와 같은 중요한 게임 객체를 유지하고 이전 장면을 언로딩하여 리소스를 효율적으로 관리합니다. 이러한 접근 방식은 대규모 또는 연속적인 환경이 있는 게임에서 특히 유용합니다. 상태 데이터를 유지하거나 전환 중에 시각적 효과를 추가하는 것과 같이 특정 게임플레이 요구 사항에 맞게 이 설정을 추가로 사용자 정의합니다.