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);