为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕斯709654 2022-10-23 16:36:54
关卡完成后,将显示获胜屏幕。其中有两个按钮继续和菜单。我已经设法停用按钮,只保持第一级按钮解锁,但当我清除 1 级时无法解锁 2 级按钮。我也希望继续按钮在它之后跳转到 2 级在完成关卡 1 时显示在下一个场景中。这个游戏是突围风格,这些是我无法解决的问题。我附上了我认为必要的相应脚本。如果你想要其他人请在评论中询问他们。所有脚本的完整列表在最后。我真的很感激一些帮助。如果你要求他们,我一定会尝试更多地解释我的问题。所以请稍后再检查这个问题以检查更改。下面的脚本附加到第 1 级:-{[SerializeField] int breakableBlocks;  // Serialized for debugging purposesSceneLoader 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;            }        }    }}
查看完整描述

1 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

我认为您的问题源于在离开您的 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 函数的单例设计模式

  • ScriptableObjects 在关卡开始存储和检索数据

  • PlayerPrefs 在关卡开始时存储和检索数据

unity - 在场景之间传递数据


查看完整回答
反对 回复 2022-10-23
  • 1 回答
  • 0 关注
  • 149 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号