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();
由于这一行之后,您的代码继续到此行
Sceneloader.loadscene(2);
该行将在单个模式下以索引2加载场景,这将删除所有加载场景stence但是,如果要在索引2上加载加载场景,则必须更新场景加载程序以保存已加载的场景列表并首先卸载加载场景,然后加载新场景,然后执行此操作时,只需排除您的
PersistentsCene
scene
在此的顶部,我建议您观看本教程