我如何在场景之间保持一个值
本文关键字:一个 何在场 在场 之间 | 更新日期: 2023-09-27 17:53:37
我一直试图在这里设置一个muteSound布尔值在我的SoundManager,然后切换到一个新的场景,并保持之前存储在muteSound的值,但我没有成功。
我尝试了DontDestroyOnLoad(this);希望它能把它带到新的场景,但由于某种原因,它没有。
你们有人知道我的问题是什么吗?我用对函数了吗?
谢谢,
有人会说用static
。这是可行的,但要避免这样做,因为你会遇到其他问题。你需要的是PlayerPrefs
。在退出时保存该值。游戏开始时读取该值。你可以在你的SoundManager
脚本中这样做。
bool muteSound = false;
//Load the value when game starts (default is false)
void Start()
{
muteSound = intToBool(PlayerPrefs.GetInt("muteSound", 0));
}
int boolToInt(bool val)
{
if (val)
return 1;
else
return 0;
}
bool intToBool(int val)
{
if (val != 0)
return true;
else
return false;
}
//Save on Exit
void OnDisable()
{
PlayerPrefs.SetInt("muteSound", boolToInt(muteSound));
}
你可以将一个游戏对象从一个场景传递到另一个场景,分配给该游戏对象的所有类值在场景之间保持不变。
你基本上只是创建一个空的游戏对象来存储你的管理器脚本,然后在加载它们时将游戏对象从一个场景传递到另一个场景。这将保留附加到空游戏对象的脚本的值。
编辑:修正了一些拼写/语法错误。
不输入DontDestroyOnLoad(this);
type
void Awake() {
DontDestroyOnLoad(gameObject);
}
如果这不起作用,我建议你检查一下PlayerPrefs。
当关卡完成时,使用
PlayerPrefs.SetFloat("pref name", variable);
或.SetInt();
或.SetBool();
下一级加载时使用
value = PlayerPrefs.GetFloat("pref name");
或.GetInt();
或.GetBool();
这个播放器偏好也可以用作保存,因为它们存储在计算机注册表中。如果你用这个来加载东西,比如钱,并且你是第一次加载它,这样做:
if(PlayerPrefs.HasKey("money")) {
money = PlayerPrefs.GetFloat("money");
} else {
PlayerPrefs.SetFloat("money", 0);
money = 0;
}
如果不这样做,这些值会变得很乱。当我没有使用PlayerPrefs.HasKey();
我的解决方案是:
public class SoundManager : MonoBehaviour {
public static SoundManager instance = null;
protected virtual void Awake()
{
if (instance == null)
instance = this;
else if (instance != this)
Destroy(gameObject);
DontDestroyOnLoad(gameObject);
}
}
虽然我认为我的问题是因为我将类更改为单例,但实际问题是还有另一个类需要成为单例。
由于其余的代码不是我的分享,这里有一个教程,帮助我了解我在做什么,如果其他人遇到这种类型的问题更好。