У меня проблемы с управлением сценами в UnityC#

Место общения программистов C#
Ответить
Anonymous
 У меня проблемы с управлением сценами в Unity

Сообщение Anonymous »

Я создаю игру под названием Gravity Shifter, и в настоящее время у меня есть четыре сцены. Первое - это главное меню, за которым следует PersistentScene, который содержит элементы пользовательского интерфейса, такие как кнопки и текст здоровья, позволяя пользовательскому интерфейсу сохраняться на всех уровнях. Тогда у меня есть уровень 1 и уровня2. Как я уже упоминал, за исключением основного меню, я хочу, чтобы PersistentScene присутствовал во всех других сценах (сцены уровня). Однако, когда я играю в игру и нажимаю кнопку перезапуска, игра перезагружается, но PersistentScene удаляется. Этого не должно произойти, потому что после перезапуска я не могу использовать элементы пользовательского интерфейса.
Теперь у меня есть некоторые коды, которые могут вызвать проблему. />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();
}
}

< /code>
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);
}
}

< /code>
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
}
}

< /code>
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();

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

< /code>
Это коды. Спасибо!>

Подробнее здесь: https://stackoverflow.com/questions/794 ... t-in-unity
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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