Как я могу сделать еще один клик по клавише Escape, которая вернется в игру? - PullRequest
0 голосов
/ 01 октября 2019
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class BackToMainMenu : MonoBehaviour
{
    public PlayerCameraMouseLook cammouselook;

    // Update is called once per frame
    void Update ()
    {
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex - 1);
            PlayerCameraMouseLook.mouseLookEnable = false;
            cammouselook.enabled = true;
        }
    }
}

Теперь при нажатии клавиши Escape загружается сцена главного меню. И в главном меню у меня есть кнопка НОВАЯ ИГРА, но нет кнопки RESUME.

Вместо создания кнопки возобновления я хочу, чтобы при повторном нажатии клавиши выхода после загрузки сцены главного меню она вернулась в игру к текущему состоянию. Положение это. Либо если он находится в середине катсцены, либо просто бездействует в игре.

Так что при повторном нажатии клавиши Escape он вернется к игре и продолжится с последней точки.

Другой подпунктвопрос: я должен использовать: LoadSceneMode.Additive? Или при переключении между игровой сценой и главным меню следует удалить текущую активную сцену, а затем загрузить следующую?

SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex - 1, LoadSceneMode.Additive);

Сцена главного меню находится в индексе 0, игровая сцена - в индексе 1.

Main Menu

Что я пробовал:

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

public class BackToMainMenu : MonoBehaviour
{
    // Variables
    private bool _isInMainMenu = false;
    public GameObject mainGame;
    public PlayerCameraMouseLook cammouselook;

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            if (!_isInMainMenu)
            {
                SceneManager.LoadScene(0, LoadSceneMode.Additive);
                PlayerCameraMouseLook.mouseLookEnable = false;
                cammouselook.enabled = true;

                // -- Code to freeze the game
                mainGame.SetActive(false);
            }
            else
            {
                SceneManager.UnloadSceneAsync(0);
                // -- Code to unfreeze the game
                mainGame.SetActive(true);
            }

            _isInMainMenu = !_isInMainMenu;
        }
    }
}

И Иерархия:

Скрипт прилагается кВернуться в главное меню игрового объекта. И все игровые объекты находятся в Главной игре.

Hierarchy

Первый раз при нажатии клавиши выхода происходит загрузка в главное меню и сцена главного меню виерархия. Во второй раз, когда вы нажимаете клавишу выхода, она запускает игру заново, как новая игра, и удаляет выгрузку главного меню.

В обоих случаях игровая сцена остается в иерархии.

1 Ответ

0 голосов
/ 01 октября 2019

Я предложу вам добавить main menu scene с флагом Additive, как вы упомянули.

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

public class BackToMainMenu : MonoBehaviour
{
    // Variables
    private bool _isInMainMenu = false;
    public PlayerCameraMouseLook cammouselook;

    // Update is called once per frame
    void Update ()
    {
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            if (!_isInMainMenu)
            {
                SceneManager.LoadScene(0, LoadSceneMode.Additive);
                PlayerCameraMouseLook.mouseLookEnable = false;
                cammouselook.enabled = true;

                // -- Code to freeze the game

            }
            else
            {
                SceneManager.UnloadSceneAsync(0);
                // -- Code to unfreeze the game
            }

            _isInMainMenu = !_isInMainMenu;
        }
    }
}

Посмотрите на переменную _isInMainMenu: она будет отслеживать, если вы находитесь вГлавное меню или нет. В зависимости от значения, Клавиша Escape будет вести себя по-разному.

Примечание: Я предлагаю вам ввести текущий индекс сцены в LoadScene / UnloadSceneAsync, если только выможет захотеть изменить свой индекс. В этом сценарии введите имя сцены (перегруженные методы).

Теперь, что я имею в виду под // -- Code to freeze the game, зависит от вашей игры:

  • У вас может быть уникальный GameObject, содержащий вседругие GameObjects имеют вашу сцену, и Enable / Disable it
myBigGameObject.SetActive(true/*or false*/);
  • В MonoBehaviour есть логика заморозить игру, пока вы находитесь в главном меню. Например, вы можете использовать bool _isInMainMenu в Update () , чтобы помешать им выполнять свою работу;

Например, в этом MonoBehaviour, который я создал в качестве примера:

public class ExampleMonoBehaviour : MonoBehaviour
{
    private void Update ()
    {
        if (_isInMainMenu)
            return;
        print("I'm running !");
    }
}
  • Иметь коллекцию (список в качестве примера), в которой хранятся каждые top hierarchy GameObjects и включать / отключать их все по мере необходимости, чтобы они вели себя так же, как указано выше.

Зависитна то, как ваш код, есть много других вариантов. Я настоятельно рекомендую вам сделать вариант первый или третий , если у вас нет лучшего подхода.

Дело в том, что если вы хотите вернуться кГлавное меню, оно не должно быть слишком обширным (время загрузки, использование памяти и т. д.), поэтому вы можете отключить GameObject из main scene (третий пункт), чтобы быстро восстановить его после выхода из main menu без перезагрузкився сценаЭто приведет к использованию сериализации и десериализации.


Отредактировано: Typo

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