Почему сцена DontDestroyOnLoad остается при переключении обратно в главное меню? - PullRequest
0 голосов
/ 16 апреля 2020

Проблема в том, что когда я нажимаю escape на go baco в главном меню, я не могу уничтожить оригинальные объекты в главном меню, а также те же объекты в сцене DontDestroyOnLoad.

У меня в главном меню сцены 3 объекта Player, Game Manager, Scene Loader, к каждому из которых прикреплен скрипт DontDestroy:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DontDestroy : MonoBehaviour
{
    private void Awake()
    {
        if (GameManager.backToMainMenu == false)
        {
            DontDestroyOnLoad(transform);
        }
    }
}

В объекте Game Manager также прикреплен еще один скрипт:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameManager : MonoBehaviour
{
    public SceneLoader sceneLoader;
    public PlayerController playerController;
    public CamMouseLook camMouseLook;
    public static bool backToMainMenu = false;
    public static bool togglePauseGame;

    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.P))
        {
            PauseGame();
        }

        if (Input.GetKeyDown(KeyCode.Escape))
        {
            BackToMainMenu();
        }
    }

    public void PauseGame()
    {
        togglePauseGame = !togglePauseGame;

        if (togglePauseGame == true)
        {
            playerController.enabled = false;
            camMouseLook.enabled = false;
            Time.timeScale = 0f;
        }
        else
        {
            playerController.enabled = true;
            camMouseLook.enabled = true;
            Time.timeScale = 1f;
        }
    }

    private void BackToMainMenu()
    {
        sceneLoader.LoadScene(0);
        playerController.enabled = false;
        camMouseLook.enabled = false;
        Cursor.lockState = CursorLockMode.None;
        Time.timeScale = 0f;
        backToMainMenu = true;
    }
}

Когда я нажимаю клавишу выхода, он переключает сцены между 1 и 0 и загружает сцену 0 в главное меню. Но тогда результат таков:

Back to main menu

Так что я нажал escape и вернулся в главное меню, но DontDestroyOnLoad также все еще загружен не удален, поэтому у меня есть это 3 Объекты Player, Game Manager, Scene Loader продублированы.

Если я снова нажму на новую игру, сцена главного меню будет удалена, поэтому не будет дублирования, но когда вернется в главное меню, DontDestroyOnLoad останется.

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Да, объекты будут сохраняться при загрузке сцен. Это означает, что если в сцене уже есть некоторые из них, то после загрузки / перезагрузки сцены их будет несколько.

Я имею дело с созданием Init класса и объекта в каждой сцене, который проверяет переменная stati c и создает экземпляры объектов, которые должны сохраняться. Таким образом, вы можете начать игру с любой сцены.

class Init {
  public static bool hasInstantiatedController = false;
  public GameObject GameController;

  void Awake() {
   if (!hasInstantiatedController) {
     hasInstantiatedController = true;
     Instantiate (GameController, transform.position, transform.rotation);
   }
  }
}
1 голос
/ 16 апреля 2020

Это именно то, что DontDestroyOnLoad это должно сделать, сохранить GameObject для нескольких сцен. Ваш сценарий GameManager начинается с backToMainMenu со значением false, которое запускает выполнение DontDestroyOnLoad в функции Awake в первый раз, но не во второй (поскольку, когда вы go возвращаетесь к Главное меню, backToMainMenu установлено на true).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...