как разблокировать уровни и перейти к следующей сцене со страницы победы в Unity 2D? - PullRequest
0 голосов
/ 14 марта 2019

после завершения уровня отображается экран выигрыша. у которого есть две кнопки продолжения и меню. Мне удалось деактивировать кнопки и оставить только кнопку 1-го уровня разблокированной, но не могу получить кнопку уровня 2, чтобы разблокировать ее, когда я очищаю уровень 1. также я хочу, чтобы кнопка продолжения перешла на уровень 2 после нее показывается в следующей сцене при завершении уровня 1. Эта игра в стиле прорыва, и это проблемы, которые я не могу решить. Я приложил соответствующие сценарии, которые я считал необходимыми. если вы хотите, чтобы другие, пожалуйста, попросите их в комментариях. Полный список всех сценариев находится в конце. Я был бы очень признателен за некоторую помощь. Я обязательно постараюсь объяснить мою проблему немного больше, если вы попросите их. поэтому, пожалуйста, проверьте этот вопрос позже, чтобы проверить изменения.

скрипт ниже прикреплен к уровню 1: -

{
[SerializeField] int breakableBlocks;  // Serialized for debugging purposes
SceneLoader sceneloader;

private void Start()
{
    sceneloader = FindObjectOfType<SceneLoader>();
}

public void CountBreakableBlocks()
{
    breakableBlocks++;
}

public void BlockDestroyed()
{
    breakableBlocks--;
    if (breakableBlocks <= 0)
    {
        GetComponent<LevelSelector>().levelunlocked = 
        sceneloader.LoadWinScreen();
    }
}
}

Скрипт ниже привязан к селектору уровней: -

{
    public Button[] levelButtons;
    public int levelunlocked = 1;
    private void Start()
    {
        int levelReached = PlayerPrefs.GetInt("levelReached", levelunlocked);
        for (int i = 0; i < levelButtons.Length; i++)
        {
            if (i + 1 > levelReached)
            {
                levelButtons[i].interactable = false;
            }
        }
    }
}

Сценарий загрузчика сцены: -

public class SceneLoader : MonoBehaviour {


public void LoadNextScene()
{
    int currentSceneIndex = SceneManager.GetActiveScene().buildIndex;
    SceneManager.LoadScene(currentSceneIndex + 1);
}
public void LoadStartScene()
{
    SceneManager.LoadScene(0);
}
public void LoadLevelSelectScreen()
{
    SceneManager.LoadScene(1);
}
public void LoadWinScreen()
{
    SceneManager.LoadScene(5);
}
public void LoadGameOverScreen()
{
    SceneManager.LoadScene(6);
}
public void QuitGame()
{
    Application.Quit();
}
public void Level1()
{
    SceneManager.LoadScene(2);
}
public void Leve2()
{
    SceneManager.LoadScene(3);
}
}

это настройка сборки: -

настройки сборки

Сценарии, которые у меня есть: - 1.Ball 2.Block 3.Level 4.LevelSelector 5.LoseCollider 6.Paddle 7.SceneLoader

1 Ответ

0 голосов
/ 15 марта 2019

I думаю ваша проблема связана с тем, что вы не обновили значение преференций игрока "levelReached", прежде чем покинуть сцену 1-го уровня.

В опубликованном вами сценарии 1-го уровня:

public void BlockDestroyed()
    {
        breakableBlocks--;
        if (breakableBlocks <= 0)
        {
            GetComponent<LevelSelector>().levelunlocked = 
            sceneloader.LoadWinScreen();
        }
    }

Следующая строка должна выдавать ошибку, так как функция LoadWinScreen возвращает void:

GetComponent<LevelSelector>().levelunlocked = 
            sceneloader.LoadWinScreen();

Попробуйте изменить этот фрагмент кода следующим образом:

if (breakableBlocks <= 0)
{
    PlayerPrefs.SetInt("levelReached", 2);
    sceneloader.LoadWinScreen();
}

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

if (breakableBlocks <= 0)
{
    if(PlayerPrefs.GetInt("levelReached") < GameManager.currentLevel + 1)
        PlayerPrefs.SetInt("levelReached", GameManager.currentLevel + 1);
    sceneloader.LoadWinScreen();
}

Для этого требуется некоторая отдельная логика для переноса состояния игры черезсцен и есть несколько способов сделать это (см. примеры и соответствующую ссылку на стекопоток ниже):

  • Шаблон проектирования Singleton с использованием функции Unity DontDestroyOnLoad
  • ScriptableObjects для хранения и извлечения данных вначало уровня
  • PlayerPrefs для хранения и извлечения данных при запуске уровня

Unity - передача данных между сценами

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