Cách dịch chuyển giữa các cảnh trong Unity

Dịch chuyển tức thời giữa các cảnh trong Unity là một tính năng hữu ích để chuyển đổi người chơi giữa các cấp độ hoặc khu vực khác nhau. Hướng dẫn này đề cập đến cách triển khai dịch chuyển tức thời cảnh bằng cách sử dụng tải cảnh bổ sung, đảm bảo tính liên tục của dữ liệu người chơi và dỡ bỏ cảnh cũ sau khi dịch chuyển tức thời. Cách tiếp cận này đảm bảo quá trình chuyển đổi diễn ra suôn sẻ mà không làm mất dữ liệu hoặc đối tượng của người chơi.

Thiết lập bối cảnh và điểm dịch chuyển tức thời

Đầu tiên, chúng ta sẽ thiết lập bối cảnh và chỉ định các điểm dịch chuyển tức thời trong bối cảnh đó.

Tạo cảnh

  1. Trong Unity, hãy vào File > New Scene để tạo một cảnh mới. Lưu nó vào thư mục Assets của bạn, đặt tên là Scene1.
  2. Lặp lại quy trình để tạo một cảnh khác có tên Scene2.
  3. Thêm cả hai cảnh vào cài đặt bản dựng bằng cách vào Tệp > Cài đặt bản dựng và nhấp vào Thêm cảnh mở.

Chỉ định điểm dịch chuyển tức thời

Mỗi cảnh cần có một điểm được chỉ định nơi người chơi sẽ xuất hiện sau khi dịch chuyển tức thời.

  1. Trong Scene1, tạo một GameObject trống và đặt tên là TeleportPoint1. Gắn thẻ thích hợp, ví dụ, là SpawnPoint.
  2. Trong Scene2, tạo một GameObject trống khác có tên TeleportPoint2 và gắn thẻ tương tự.
  3. Các GameObject này sẽ đóng vai trò là địa điểm xuất hiện khi chuyển đổi giữa các cảnh.

Tạo một tập lệnh dịch chuyển tức thời

Tập lệnh dịch chuyển tức thời quản lý quá trình chuyển cảnh, đảm bảo người chơi di chuyển đến đúng vị trí trong cảnh mới, sau đó dỡ bỏ cảnh trước đó.

Kịch bản dịch chuyển tức thời

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. Tạo một tập lệnh C# mới có tên Teleportation.cs trong thư mục Scripts.
  2. Đính kèm tập lệnh này vào một vật thể có chức năng kích hoạt dịch chuyển tức thời, chẳng hạn như cửa hoặc cổng.
  3. Đặt sceneToLoad thành tên của cảnh chuyển tiếp và đảm bảo điểm dịch chuyển tức thời trong cảnh mới được gắn thẻ chính xác.

Xử lý dữ liệu người chơi trên nhiều cảnh

Nếu trò chơi của bạn yêu cầu duy trì dữ liệu người chơi (như hàng tồn kho, sức khỏe, v.v.) trên nhiều cảnh, hãy triển khai chiến lược lưu trữ dữ liệu.

Dữ liệu người chơi liên tục

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. Tạo một tập lệnh C# mới có tên PlayerData.cs và đính kèm nó vào đối tượng người chơi hoặc một GameObject riêng biệt.
  2. Đảm bảo GameObject này không bị phá hủy trong quá trình chuyển cảnh bằng cách sử dụng DontDestroyOnLoad(gameObject).

Phần kết luận

Việc dịch chuyển tức thời giữa các cảnh trong Unity, đặc biệt là với việc tải và dỡ cảnh bổ sung, mang lại trải nghiệm liền mạch. Phương pháp này giữ lại các đối tượng quan trọng trong trò chơi như người chơi và quản lý tài nguyên hiệu quả bằng cách dỡ cảnh trước đó. Cách tiếp cận như vậy đặc biệt hữu ích trong các trò chơi có môi trường lớn hoặc liên tục. Tùy chỉnh thiết lập này thêm để phù hợp với các yêu cầu chơi trò chơi cụ thể, như duy trì dữ liệu trạng thái hoặc thêm hiệu ứng hình ảnh trong quá trình chuyển đổi.