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