Мой игрок исчезает при перезапуске игры в UnityC#

Место общения программистов C#
Anonymous
 Мой игрок исчезает при перезапуске игры в Unity

Сообщение Anonymous »

Я создаю игру под названием Gravity Shifter, и в своей игре, когда я перезапускаю ее, игрок из сцены DontDestroyonLoad исчезает. В результате я получаю ошибки, и игра останавливается. < /P>
Вот мой код, который может вызвать ошибки.

Код: Выделить всё

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
Код начинается в главном меню. Затем, когда мы нажимаем кнопку воспроизведения, мы входим в сцену уровня1, где мы можем играть в игру.

Подробнее здесь: https://stackoverflow.com/questions/794 ... e-in-unity

Вернуться в «C#»