Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity中的playerRef未正确更改_C#_Unity3d - Fatal编程技术网

C# Unity中的playerRef未正确更改

C# Unity中的playerRef未正确更改,c#,unity3d,C#,Unity3d,我对Unity有点陌生,所以如果您认为这是不够的代码,或者是一个非常简单的错误,请不要生气。所以,我有一个按钮,上面写着自动重新启动。当我单击它时,它应该从false变为true。事实并非如此。这里是截图和代码。非常感谢。如果您需要更多代码,请告诉我,但我认为您不需要 之前: 单击Autorestart:false后,它应该已变为Autorestart:true 这里有一些代码 using UnityEngine; using UnityEngine.UI; public class mana

我对Unity有点陌生,所以如果您认为这是不够的代码,或者是一个非常简单的错误,请不要生气。所以,我有一个按钮,上面写着自动重新启动。当我单击它时,它应该从false变为true。事实并非如此。这里是截图和代码。非常感谢。如果您需要更多代码,请告诉我,但我认为您不需要

之前:

单击Autorestart:false后,它应该已变为Autorestart:true

这里有一些代码

using UnityEngine;
using UnityEngine.UI;
public class manageautorestart : MonoBehaviour {
    public Text text;
    void Start(){
        if (PlayerPrefs.HasKey ("autorestart")) {
            text.text = "Autorestart: " + PlayerPrefs.GetString ("autorestart");
        } else {
            PlayerPrefs.SetString ("autorestart", "false");
            text.text = "Autorestart: " + PlayerPrefs.GetString ("autorestart");
        }
    }
    public void Change(){

        if (PlayerPrefs.GetString ("autorestart") == "false") {
            PlayerPrefs.SetString ("autorestart", "true");
        }
        if (PlayerPrefs.GetString ("autorestart") == "true") {
            PlayerPrefs.SetString ("autorestart", "false");
        } else {
            PlayerPrefs.SetString ("autorestart", "false");
        }

        PlayerPrefs.Save ();
    }
    void FixedUpdate(){
        PlayerPrefs.Save ();
        text.text = "Autorestart: " + PlayerPrefs.GetString ("autorestart");
    }
}

我的第一个选择不是使用字符串来存储布尔值

您可以使用:

public class manageautorestart : MonoBehaviour 
{
    public Text text;
    void Start()
    {
        SetText();
    }
    public void Change()
    {
        bool autorestart = GetAutorestart();
        // flip the value 
        autorestart = !autorestart;
        SetAutorestart(autorestart );
        SetText();
    }

    private bool GetAutorestart()
    {
        // Get stored value, 0 if none
        int temp = PlayerPrefs.GetInt("autorestart", 0);
        // convert 0/1 to false/true
        autorestart = (temp == 1) ? true : false;
        return autorestart;
    }

    private void SetAutorestart(bool value)
    {
        // store it as int
        PlayerPrefs.SetInt("autorestart", value ? 1 : 0);
    }

    private void SetText()
    {
        text.text = "Autorestart: " +  GetAutorestart();
    }
}

现在有三种不同的方法来设置/获取值并将其放置在文本中。Change方法使用了这三种方法。

我的第一选择不是使用字符串来存储布尔值

您可以使用:

public class manageautorestart : MonoBehaviour 
{
    public Text text;
    void Start()
    {
        SetText();
    }
    public void Change()
    {
        bool autorestart = GetAutorestart();
        // flip the value 
        autorestart = !autorestart;
        SetAutorestart(autorestart );
        SetText();
    }

    private bool GetAutorestart()
    {
        // Get stored value, 0 if none
        int temp = PlayerPrefs.GetInt("autorestart", 0);
        // convert 0/1 to false/true
        autorestart = (temp == 1) ? true : false;
        return autorestart;
    }

    private void SetAutorestart(bool value)
    {
        // store it as int
        PlayerPrefs.SetInt("autorestart", value ? 1 : 0);
    }

    private void SetText()
    {
        text.text = "Autorestart: " +  GetAutorestart();
    }
}

现在有三种不同的方法来设置/获取值并将其放置在文本中。Change方法利用了这三种方法。

您何时调用
Change()
?请查看您的逻辑。如果该值为“false”,则将其设置为“true”。到目前为止还不错,但是。。。下一个块在两个代码路径上无条件地将其设置为“false”。您可能需要一个
else if
,但会丢失最后一个else。@RetiredInja这应该是答案;)一般来说,我更喜欢使用
GetInt
SetInt
来存储布尔标志(0/1)而不是字符串,但这可能只是一个味道的问题。你不需要调用
PlayerPrefs.Save
,通常它是自动保存的。在固定更新期间调用
PlayerPrefs.Save()
是一个奇怪的想法。您只能在进行更改后调用它。您何时调用
change()
?请查看您的逻辑。如果该值为“false”,则将其设置为“true”。到目前为止还不错,但是。。。下一个块在两个代码路径上无条件地将其设置为“false”。您可能需要一个
else if
,但会丢失最后一个else。@RetiredInja这应该是答案;)一般来说,我更喜欢使用
GetInt
SetInt
来存储布尔标志(0/1)而不是字符串,但这可能只是一个味道的问题。你不需要调用
PlayerPrefs.Save
,通常它是自动保存的。在固定更新期间调用
PlayerPrefs.Save()
是一个奇怪的想法。你应该在做了更改后再打电话给它。但是我可以问一下我的代码有什么问题吗,我还是不明白。对不起,代码的错误在于逻辑,首先检查是否为false,然后设置为true,接下来检查是否为true,然后设置为false。意思是你从错误开始,到了正确,又回到错误。如果以true开头,那么它将变为false(将第一个If语句跳过为false)。其他部分可能永远不会发生。但我可以问一下我的代码出了什么问题,我还是不明白。对不起,代码的错误在于逻辑,首先检查是否为false,然后设置为true,接下来检查是否为true,然后设置为false。意思是你从错误开始,到了正确,又回到错误。如果以true开头,那么它将变为false(将第一个If语句跳过为false)。其他部分可能永远不会发生。