在 Unity C# 中使用复选框和玩家偏好切换布尔值

时间:2021-03-11 09:10:19

标签: c# unity3d

我正在尝试在 Unity UI 中创建一个复选框,将布尔无尽游戏返回为“真”,如果是计时游戏,则返回“假”。我想用 PlayerPrefs 做到这一点。我知道 PP 只支持 int、float 和 string。我创建了一个为 1 的函数。

我有一个处理游戏整体状态的游戏管理器,这个游戏对象是我游戏中唯一一个不会在加载时被破坏的游戏对象。

到目前为止,游戏管理器有一个初始化为的 bool 'endless'

endless = PlayerPrefs.GetInt("Endless", 1) == 0;

在启动函数中。

现在我有一个包含复选框的选项菜单,在这个脚本中如下:

public void OnToggleEndless()
{
    if (endLessToggle.isOn)
    {
        PlayerPrefs.SetInt("Endless", manager.endless ? 1 : 0);
        
        print("Endless Button ticked");
    }
    else 
    {
        PlayerPrefs.SetInt("Endless", manager.endless ? 0 : 0);
        print("Endless Button unticked");            
    }
    
}

但是当我连接它,玩游戏并转到选项菜单并勾选“无尽游戏”时,没有任何反应。我试图把 OnToggleEndless(); Update 中的方法,但这只会给我无穷无尽的打印行(“Endless Button ticked”);消息,不保存 PlayerPrefs。我想知道复选框是否正确连接。这个我想不通!

1 个答案:

答案 0 :(得分:1)

<块引用>

不保存 PlayerPrefs

PlayerPrefs 的保存似乎有问题,您确定要实际检查 manager.endless 而不是 endLessToggle.isOn

因为 endLessToggle.isOn 的状态会根据您启用还是禁用复选框而变化。但是 manager.endless 的状态永远不会改变,并在游戏开始时设置为 true/false。

这会导致您在切换复选框时实际上并未更改 PlayerPrefs 变量。

示例:

private void Start() {
    // Check if we enabled or disabled the endlessToggle Checkbox last time we played
    // and set the checkbox accordingly.
    endLessToggle.isOn = (PlayerPrefs.GetInt("Endless", 1) == 0);
}

// Call when we toggle the Checkbox.
public void OnToggleEndless() {
    // Get the current state of our toggle button.
    int enable = endLessToggle.isOn ? 1 : 0;
    // Log result into console to test it.
    Debug.Log("We set Endless to: " + enable);
    // Set the PlayerPrefs equal to our current state.
    PlayerPrefs.SetInt("Endless", enable);
}

我认为无论如何您都不需要使用 GameManager 中的全局变量,因为您已经拥有了 PlayerPrefs,它可以为您做同样的事情。

此外,您需要在开始游戏时将 CheckBox 的状态设置为等于 PlayerPrefs