我如何在场景之间保持一个值

本文关键字:一个 何在场 在场 之间 | 更新日期: 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);
    }
}

虽然我认为我的问题是因为我将类更改为单例,但实际问题是还有另一个类需要成为单例。

由于其余的代码不是我的分享,这里有一个教程,帮助我了解我在做什么,如果其他人遇到这种类型的问题更好。

相关文章: