Я создаю игру под названием 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
У меня проблемы с управлением сценами в Unity ⇐ C#
Место общения программистов C#
-
Anonymous
1738857376
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>
Это коды. Спасибо!>
Подробнее здесь: [url]https://stackoverflow.com/questions/79418562/i-have-problem-with-scene-managment-in-unity[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия