Вот мой код, который может вызвать ошибки.
Код: Выделить всё
PlayerManager.csКод: Выделить всё
using UnityEngine;
public class PlayerManager : MonoBehaviour
{
public 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.
}
}
// bu playeri yeniden baslatir (restart veya level sceneleri gecisleri icin)
public void RestartPlayer()
{
if (player != null)
{
Destroy(player); // Eski player'ı sil
}
// Yeni player'ı oluştur ve başlat
Instantiate(player, startingPosition, Quaternion.identity);
}
// Oyuncuyu Don't Destroy'dan çıkar ve sil (main menuye donerken cikartilir)
public void RemovePlayerFromDontDestroy()
{
Destroy(gameObject);
}
}
< /code>
GameManager.csКод: Выделить всё
using UnityEngine;
using UnityEngine.SceneManagement;
public class GameManager : MonoBehaviour
{
public static GameManager instance;
private NavMeshRebuilder navMeshRebuilder;
[HideInInspector]
public PlayerHealthUI playerHealthUI; // Tüm sahneler için ortak UI
void Awake()
{
if (instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject);
SceneManager.sceneLoaded += OnSceneLoaded; // Sahne yüklendiğinde çağrılacak
}
else
{
Destroy(gameObject);
return;
}
}
private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
if (scene.name != "MainMenu")
{
navMeshRebuilder = FindObjectOfType();
RestartLighting();
}
else
{
navMeshRebuilder = null;
}
}
void Start()
{
Time.timeScale = 1f;
}
private void RestartLighting()
{
DynamicGI.UpdateEnvironment();
RenderSettings.ambientIntensity = 1f;
LightmapSettings.lightmapsMode = LightmapsMode.CombinedDirectional;
}
public void RestartGame()
{
Debug.Log("RestartGame() çağrıldı!"); // Debug için ekledim
PlayerManager.instance?.RestartPlayer();
EnemyManager.instance?.ClearEnemies(); // Önce düşman listesini temizle
EnemyManager.instance?.ResetEnemies();
navMeshRebuilder?.RebuildNavMeshes();
RestartLighting();
Time.timeScale = 1f;
}
private void OnDestroy()
{
SceneManager.sceneLoaded -= OnSceneLoaded; // Hafıza sızıntısını önlemek için event'ten çık
}
}
< /code>
RestartGameButton.csКод: Выделить всё
using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;
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;
GameManager.instance.RestartGame();
StartCoroutine(RestartCoroutine());
}
private IEnumerator RestartCoroutine()
{
yield return PersistentSceneLoader.instance.StartCoroutine(PersistentSceneLoader.EnsurePersistentSceneLoaded());
yield return SceneLoader.instance.StartCoroutine(SceneLoader.LoadSceneCoroutine(2));
}
}
< /code>
SceneLoader.csКод: Выделить всё
using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;
public class SceneLoader : MonoBehaviour
{
public static GameObject backupCamera; // Yedek kamera referansı
public static SceneLoader instance; // Singleton instance
private void Awake()
{
if (instance == null)
{
instance = this;
}
else
{
Destroy(gameObject);
}
}
public static void LoadScene(int sceneIndex)
{
instance.StartCoroutine(LoadSceneCoroutine(sceneIndex));
}
// LoadScene functionu oyuna ozel yapilmis sceneload yapan functur bu funcu leavegamebutton, restartbutton vb. leri icin olusturulmustur.
public static IEnumerator LoadSceneCoroutine(int sceneIndex)
{
if (sceneIndex == 1) // MainMenu'ye dönüş
{
DestroyPersistentObjects();
yield return PersistentSceneLoader.instance.StartCoroutine(PersistentSceneLoader.UnloadPersistentScene());
SceneManager.LoadScene(sceneIndex);
}
else
{
yield return instance.StartCoroutine(UnloadAllLevels());
yield return PersistentSceneLoader.instance.StartCoroutine(PersistentSceneLoader.EnsurePersistentSceneLoaded());
yield return SceneManager.LoadSceneAsync(sceneIndex, LoadSceneMode.Additive);
if (backupCamera != null)
{
backupCamera.SetActive(true);
}
}
}
private static IEnumerator UnloadAllLevels()
{
for (int i = 0; i < SceneManager.sceneCount; i++)
{
Scene scene = SceneManager.GetSceneAt(i);
if (scene.name != "PersistentScene" && scene.name != "MainMenu")
{
yield return SceneManager.UnloadSceneAsync(scene);
}
}
}
private static void DestroyPersistentObjects()
{
GameObject[] dontDestroyObjects = GameObject.FindObjectsOfType();
foreach (GameObject obj in dontDestroyObjects)
{
if (obj.scene.buildIndex == -1)
{
Destroy(obj);
}
}
}
}
< /code>
The GameManagerПодробнее здесь: https://stackoverflow.com/questions/794 ... e-in-unity