如何从Unity 2D的获胜页面解锁级别并跳至下一场景?

时间:2019-03-14 11:00:22

标签: c# unity3d 2d

级别完成后,将显示获胜屏幕。它有两个按钮continue和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.球 2.块 3.等级 4.LevelSelector 5,LoseCollider 6.桨 7.SceneLoader

1 个答案:

答案 0 :(得分:0)

认为,您的问题源于在离开1级场景之前未更新“ levelReached”玩家偏好值。

在您发布的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函数的单一设计模式
  • 用于在级别开始时存储和检索数据的脚本对象
  • PlayerPrefs在级别开始时存储和检索数据

Unity - pass data between scenes