如何从Unity 2D中的获胜页面解锁关卡并跳转到下一个场景?

问题描述 投票:-2回答:1

在等级结束后,显示获胜屏幕。它有两个按钮继续和menu.i已设法停用按钮,只保持第一级按钮解锁,但当我清除级别1时无法获得2级按钮解锁。我也希望继续按钮跳到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);
}
}

这是构建设置: -

build settings

我有的脚本: - 1.Ball 2.Block 3.Level 4.LevelSelector 5.LoseCollider 6.Paddle 7.SceneLoader

c# unity3d 2d
1个回答
0
投票

我认为你的问题源于在离开你的1级场景之前没有更新你的“levelReached”播放器prefs值。

在您发布的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();
}

这需要一些单独的逻辑来跨场景承载游戏状态,有几种方法可以解决这个问题(参见下面的示例和相关的stackoverflow链接):

  • 使用Unity DontDestroyOnLoad函数的单例设计模式
  • ScriptableObjects用于在级别开始时存储和检索数据
  • PlayerPrefs在级别开始时存储和检索数据

Unity - pass data between scenes

© www.soinside.com 2019 - 2024. All rights reserved.