PersistentsCene被删除的Wheb重新启动游戏

问题描述 投票:0回答:1
GameManager.cs

using UnityEngine; using UnityEngine.SceneManagement; // bu kod persistentSceneyi gerekli levellere eklemek icin var. public class GameManager : MonoBehaviour { public static GameManager instance; void Awake() { // Eğer GameManager'ın bir örneği henüz yoksa, bu örneği kalıcı yap if (instance == null) { instance = this; DontDestroyOnLoad(gameObject); // Bu GameObject ve bileşenleri sahne geçişlerinde kalır. } else { // Zaten bir örnek varsa, bu fazladan olanı yok et. Destroy(gameObject); return; } } void Start() { // PersistentScene zaten yüklenmemişse ve main menu sahnesinde degil isek o zaman yukleriz if (!SceneManager.GetSceneByName("PersistentScene").isLoaded && SceneManager.GetActiveScene().name != "MainMenu") { SceneManager.LoadScene("PersistentScene", LoadSceneMode.Additive); } Time.timeScale = 1f; // Level1'e girerken zaman ölçeğini sıfırlıyoruz } // Oyunu sıfırlama fonksiyonu Oyun restart oldugunda bu funcu restart game button scriptin de kullanicaz public void RestartGame() { // Zamanı normal hızda başlat oyun yeniden basladiginda bu deger 0 olursa oyun donar bunu engellemek icin de bunu 1 yapariz Time.timeScale = 1f; PlayerManager.Instance.ResetPlayerPosition(); } }

PlayerManager.cs

using UnityEngine;

public class PlayerManager : MonoBehaviour
{
    private static PlayerManager instance;

    public static PlayerManager Instance
    {
        get { return instance; }
    }

    public GameObject player;

    public Vector3 startingPosition; // starting position when game restarts or starts

    private void Awake()
    {
        // Singleton yapısı
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(gameObject);  // PlayerManager, sahne geçişlerinde yok edilmez
        }
        else
        {
            Destroy(gameObject); // Aynı PlayerManager birden fazla sahnede varsa, yalnızca biri kalır.
        }
    }

    public void ResetPlayerPosition()
    {
        if (player != null)
        {
            player.transform.position = startingPosition;  // Oyuncuyu sıfırla
        }
        else
        {
            Debug.LogWarning("Player object is not assigned.");
        }
    }

    // Oyuncuyu Don't Destroy'dan çıkar ve sil
    public void RemovePlayerFromDontDestroy() 
    {
        Destroy(gameObject);
    }
}

RestartGameButton.cs

using UnityEngine;
using UnityEngine.UI;

public class RestartGameButton : MonoBehaviour
{
    public GameObject backupCamera; // Yedek kamera referansı (Inspector'dan atanacak)
    public void RestartGameFromBeginning()
    {
        // Yedek kamerayı SceneLoader'a aktar
        SceneLoader.backupCamera = backupCamera;

        // Singleton üzerinden GameManager'a erişip RestartGame fonksiyonunu çağır
        if (GameManager.instance != null)
        {
            GameManager.instance.RestartGame();  // GameManager üzerinden oyunu sıfırla
        }
        else
        {
            Debug.LogError("GameManager instance is not found!");
        }

        SceneLoader.LoadScene(2);  // level1'i yuklemek icin 
    }
}

SceneLoader.cs

using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneLoader : MonoBehaviour
{
    public static GameObject backupCamera;  // Yedek kamera referansı
    private static string uiSceneName = "PersistentScene"; // UI'nin sahne adı

    public static void LoadScene(int sceneIndex)
    {
        // Eğer ana menüye dönülüyorsa, tüm sahneleri temizle
        if (sceneIndex == 1)
        {
            DestroyPersistentObjects();
            SceneManager.LoadScene(sceneIndex);
        }
        else
        {
            // Yeni sahneyi yükle (UI kaybolmaz)
            SceneManager.LoadScene(sceneIndex, LoadSceneMode.Single);

            // Eğer UI sahnesi yüklü değilse yükle
            if (!SceneManager.GetSceneByName(uiSceneName).isLoaded)
            {
                SceneManager.LoadScene(uiSceneName, LoadSceneMode.Additive);
            }

            // Yedek kamerayı aç
            if (backupCamera != null)
            {
                backupCamera.SetActive(true);
            }
        }
    }

    // Bu sadece ana menüye dönüş için kullanılır
    private static void DestroyPersistentObjects()
    {
        GameObject[] dontDestroyObjects = GameObject.FindObjectsOfType<GameObject>();

        foreach (GameObject obj in dontDestroyObjects)
        {
            if (obj.scene.buildIndex == -1)  // Eğer sahneye bağlı değilse (DontDestroyOnLoad)
            {
                Destroy(obj);
            }
        }
    }
}

我希望除主菜单以外的每个级别场景中都存在persistentscene。
谢谢你!

在您的

Restartgamebutton
课程之后返回

gameManager.instance.restartGame();

由于这一行之后,您的代码继续到此行
c# unity-game-engine user-interface
1个回答
0
投票

Sceneloader.loadscene(2);

该行将在单个模式下以索引2加载场景,这将删除所有加载场景

但是,如果要在索引2上加载加载场景,则必须更新场景加载程序以保存已加载的场景列表并首先卸载加载场景,然后加载新场景,然后执行此操作时,只需排除您的

PersistentsCene
stence

scene

在此的顶部,我建议您观看
本教程

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.