Yah*_*ibi 0 c# unity-game-engine
我创建了一个足球比分计算器。我有一个可以更改场景的按钮,但是当我更改场景并重新打开它时,分数值将重置为 0。代码如下:
public class Main : MonoBehaviour {
public Text plusUp;
public int value = 0;
public void button(int sc)
{
SceneManager.LoadScene(sc);
}
public void plus()
{
value++;
plusUp.text = value.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
1.Object.DontDestroyOnLoad您可以在保存要保存的变量的对象上使用该方法。GameObject当加载另一个场景时,它将使该脚本保持活动状态:
void Awake()
{
DontDestroyOnLoad(this.gameObject);
}
Run Code Online (Sandbox Code Playgroud)
请参阅文档以获取更多信息
您也可以制作单例,但这种设计模式有点复杂,因为当您加载另一个场景时,Unity 会销毁它。您仍然需要在他们的GitHub 页面DontDestroyOnLoad上查看如何实现此模式
2.或者您可以在加载另一个场景之前将值保存在磁盘上,然后使用PlayerPrefs辅助方法加载该值:
public int value = 0;
void Awake()
{
//Load the saved score (this value will be saved even if you restart the app)
value = PlayerPrefs.GetInt("Score");
}
public void button1(int sc)
{
//Save your value before you load the scene
PlayerPrefs.SetInt("Score", value);
SceneManager.LoadScene(sc);
}
Run Code Online (Sandbox Code Playgroud)
有关类型的更多信息,请参阅文档。
有一些核心概念对于理解这个问题很有用。
范围:每个场景都在其自己的范围内运行。一个场景中发生的任何变量、对象或更改不会自动转移到另一场景。当启动场景时,场景中的所有对象都会被实例化和初始化,并且如果它们是 Monobehaviours,则会调用它们的 Awake()/Start() 方法。
初始化 - 当对象被实例化时,它会使用构造函数或默认值进行初始化。Monobehaviours 没有构造函数,因此任何变量都将推迟回默认值。
数据持久性 - 当您更改场景时,前一个场景中的所有游戏对象都会被销毁,而新场景中的所有对象都会被实例化和初始化。由于前一个场景中的所有对象都被销毁,因此在这些对象上设置的任何值都会消失。您可以使用 DoNotDestroyOnLoad() 防止游戏对象被销毁,但这不会覆盖新场景中定义的对象。通常不建议使用 DoNotDestroyOnLoad() 作为游戏逻辑的核心部分,因为它通常会导致场景相互依赖(“场景 1 必须定义 GameObject 的值并将其传递给场景 2可用”=不好的做法)。
看起来您希望分数始终作为一个值而不管场景如何。由于所有游戏对象和单体行为都在场景内,因此您可以:
使用Singleton 模式强制对象与场景相似。
当分数数据发生变化时,将其存储到文件中,并在 Start() 方法中从该文件中读取。
我推荐的方法:使用ScriptableObject来保存分数,并在更改分数和更新游戏对象时引用该对象。ScriptableObjects 的范围在项目级别,因此它们会自动在场景之间保留。