Unity'de Sahneler Arasında Nasıl Işınlanılır

Unity'deki sahneler arasında ışınlanma, oyuncuların farklı seviyeler veya alanlar arasında geçiş yapması için kullanışlı bir özelliktir. Bu eğitim, sahne ışınlanmasının ek sahne yüklemesi kullanılarak nasıl uygulanacağını, oyuncu veri kalıcılığının nasıl sağlanacağını ve ışınlanmadan sonra eski sahnenin nasıl boşaltılacağını ele alır. Bu yaklaşım, oyuncu verisi veya nesneleri kaybetmeden sorunsuz bir geçiş sağlar.

Sahneleri ve Işınlanma Noktalarını Ayarlama

Öncelikle sahneleri oluşturup sahneler içerisinde ışınlanma noktalarını belirleyeceğiz.

Sahneler Oluşturma

  1. Unity'de, yeni bir sahne oluşturmak için Dosya > Yeni Sahne'a gidin. Bunu Varlıklar klasörünüze kaydedin ve adını Sahne1 olarak belirleyin.
  2. Aynı işlemi tekrarlayarak Sahne2 adında başka bir sahne oluşturun.
  3. Her iki sahneyi de derleme ayarlarına eklemek için Dosya > Derleme Ayarları yolunu izleyin ve Açık Sahneler Ekle seçeneğine tıklayın.

Işınlanma Noktalarının Belirlenmesi

Her sahnenin, oyuncunun ışınlandıktan sonra belireceği belirli bir noktaya ihtiyacı vardır.

  1. Scene1'da boş bir GameObject oluşturun ve adını TeleportPoint1 olarak belirleyin. Uygun şekilde etiketleyin, örneğin, SpawnPoint.
  2. Scene2 içerisinde TeleportPoint2 adında boş bir GameObject daha yaratın ve benzer şekilde etiketleyin.
  3. Bu GameObject'ler sahneler arasında geçiş yaparken spawn lokasyonları olarak görev yapacak.

Bir Işınlanma Komut Dosyası Oluşturma

Işınlanma betiği sahne geçişini yönetir, oyuncunun yeni sahnede doğru yere gitmesini sağlar ve ardından önceki sahneyi boşaltır.

Işınlanma Komut Dosyası

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 klasöründe Teleportation.cs adında yeni bir C# betiği oluşturun.
  2. Bu betiği, bir kapı veya portal gibi ışınlanma tetikleyicisi görevi görecek bir nesneye ekleyin.
  3. Geçiş yapılacak sahnenin adını sceneToLoad olarak ayarlayın ve yeni sahnedeki ışınlanma noktasının doğru şekilde etiketlendiğinden emin olun.

Sahneler Arası Oyuncu Verilerinin İşlenmesi

Oyununuzun sahneler arasında oyuncu verilerinin (envanter, sağlık vb.) tutulmasını gerektirmesi durumunda, bir veri kalıcılığı stratejisi uygulayın.

Kalıcı Oyuncu Verileri

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 adında yeni bir C# betiği oluşturun ve bunu oyuncu nesnesine veya ayrı bir GameObject'e ekleyin.
  2. DontDestroyOnLoad(gameObject) kullanarak bu GameObject'in sahne geçişleri sırasında yok edilmediğinden emin olun.

Çözüm

Unity'deki sahneler arasında ışınlanma, özellikle ek sahne yükleme ve boşaltma ile, sorunsuz bir deneyim sağlar. Bu yöntem, oyuncu gibi önemli oyun nesnelerini korur ve önceki sahneyi boşaltarak kaynakları verimli bir şekilde yönetir. Böyle bir yaklaşım, özellikle büyük veya sürekli ortamlara sahip oyunlarda faydalıdır. Bu kurulumu, geçişler sırasında durum verilerini korumak veya görsel efektler eklemek gibi belirli oyun gereksinimlerine uyacak şekilde daha da özelleştirin.