如何解锁关卡并从 Unity 2D 的获胜页面跳转到下一个场景?
how to unlock levels and jump to next scene from a win page in Unity 2D?
关卡完成后,将显示获胜屏幕。它有两个按钮继续并且 menu.i 已经设法停用按钮并且只保持第 1 级按钮解锁但是当我清除第 1 级时无法让第 2 级按钮解锁。我还希望继续按钮跳转到第 2 级在完成第 1 级后在下一个场景中显示。这个游戏是 breakout style one,这些是我无法解决的问题。我附上了我认为必要的相应脚本。如果你想要其他人,请在 comments.a 中询问他们所有脚本的完整列表在 end.i 非常感谢一些 help.i 肯定会尝试更多地解释我的问题,如果你问他们。所以请稍后再检查这个问题以检查更改。
下面的脚本附加到级别 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
我 认为 你的问题源于在离开你的 1 级场景之前没有更新你的 "levelReached" 玩家偏好值。
在您发布的 1 级脚本中:
public void BlockDestroyed()
{
breakableBlocks--;
if (breakableBlocks <= 0)
{
GetComponent<LevelSelector>().levelunlocked =
sceneloader.LoadWinScreen();
}
}
以下行应该会引发错误,因为您是 LoadWinScreen 函数 returns 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();
}
这需要一些单独的逻辑来跨场景传输游戏状态,有几种方法可以解决这个问题(请参阅下面的示例和相关的 Whosebug link):
- 使用 Unity DontDestroyOnLoad 函数的单例设计模式
- 用于在级别开始时存储和检索数据的 ScriptableObjects
- 用于在关卡开始时存储和检索数据的 PlayerPrefs
关卡完成后,将显示获胜屏幕。它有两个按钮继续并且 menu.i 已经设法停用按钮并且只保持第 1 级按钮解锁但是当我清除第 1 级时无法让第 2 级按钮解锁。我还希望继续按钮跳转到第 2 级在完成第 1 级后在下一个场景中显示。这个游戏是 breakout style one,这些是我无法解决的问题。我附上了我认为必要的相应脚本。如果你想要其他人,请在 comments.a 中询问他们所有脚本的完整列表在 end.i 非常感谢一些 help.i 肯定会尝试更多地解释我的问题,如果你问他们。所以请稍后再检查这个问题以检查更改。
下面的脚本附加到级别 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
我 认为 你的问题源于在离开你的 1 级场景之前没有更新你的 "levelReached" 玩家偏好值。
在您发布的 1 级脚本中:
public void BlockDestroyed()
{
breakableBlocks--;
if (breakableBlocks <= 0)
{
GetComponent<LevelSelector>().levelunlocked =
sceneloader.LoadWinScreen();
}
}
以下行应该会引发错误,因为您是 LoadWinScreen 函数 returns 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();
}
这需要一些单独的逻辑来跨场景传输游戏状态,有几种方法可以解决这个问题(请参阅下面的示例和相关的 Whosebug link):
- 使用 Unity DontDestroyOnLoad 函数的单例设计模式
- 用于在级别开始时存储和检索数据的 ScriptableObjects
- 用于在关卡开始时存储和检索数据的 PlayerPrefs