我如何保持场景之间的价值?

时间:2016-06-30 13:06:01

标签: c# audio unity3d

我一直试图在我的SoundManager中设置一个muteSound布尔值,然后切换到一个新场景并保留以前存储在muteSound中的值,但是我没有成功。

我尝试过DontDestroyOnLoad(这个);希望它能把它带到新的场景,但由于某种原因它不是。

你们中的任何人都知道我的问题是什么吗?我使用的是正确的功能吗?

谢谢,

4 个答案:

答案 0 :(得分:2)

有人会说使用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));
}

答案 1 :(得分:0)

您实际上可以将游戏对象从一个场景传递到另一个场景,并且在场景之间维护分配给该游戏对象的类的所有值。

您基本上只需创建一个存储经理脚本的空游戏对象,然后在加载时将游戏对象从一个场景传递到另一个场景。这应该保留附加到空游戏对象的脚本的值。

编辑:修正了一些拼写/语法错误。

答案 2 :(得分:-1)

这是我的解决方案:

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);
    }
}

虽然我认为我的问题是因为我将课程改为单身,但实际问题是还有另一个课需要成为单身人士。

由于剩下的代码不是我的共享,here is a tutorial帮助我理解了如果其他人遇到这类问题我做得更好。

答案 3 :(得分:-1)

而不是打字
DontDestroyOnLoad(this);类型

void Awake() { 
    DontDestroyOnLoad(gameObject); 
}

如果这不起作用,我建议您查看PlayerPrefs
当关卡完成后,请使用PlayerPrefs.SetFloat("pref name", variable);.SetInt();.SetBool();
当下一级加载时使用
value = PlayerPrefs.GetFloat("pref name");.GetInt();.GetBool();

此播放器prefs也可用作保存,因为它们存储在计算机注册表中。 如果您使用它来加载诸如金钱之类的东西并且您是第一次加载它,请执行以下操作:

if(PlayerPrefs.HasKey("money")) {

    money = PlayerPrefs.GetFloat("money");
} else {

    PlayerPrefs.SetFloat("money", 0);
    money = 0;
}

如果你不这样做,价值可能会变得很混乱。当我没有使用PlayerPrefs.HasKey();

时,我遇到了问题