【问题标题】:Unity Highscore using PlayerPrefs not working使用 PlayerPrefs 的 Unity Highscore 不起作用
【发布时间】:2019-06-10 21:15:52
【问题描述】:

这可能是一个非常简单的解决方案和问题,但我一直在为此绞尽脑汁。每次我统一测试时,如果我得到的分数低于高分,高分无论如何都会改变。这是我的代码。如果您需要更多,请告诉我。

脚本 1:

using UnityEngine;
using UnityEngine.SceneManagement;
public class CheckConeDeath : MonoBehaviour {
    public PlayerMovement movement;

    void OnCollisionEnter(Collision CollisionInfo){
        if(CollisionInfo.collider.tag=="Cone"){
            movement.enabled = false;
            GetComponent<Rigidbody>().constraints = RigidbodyConstraints.None;
            Invoke ("EndGame", 1.5f);
        }
    }
    void EndGame(){
        PlayerPrefs.SetFloat ("finalScore", Mathf.RoundToInt(FindObjectOfType<DistanceScore>().plrz));
        PlayerPrefs.Save ();

        Debug.Log (PlayerPrefs.GetFloat("finalScore"));
        SceneManager.LoadScene (SceneManager.GetActiveScene ().buildIndex + 1);
    }
}

脚本 2:

using UnityEngine;
using UnityEngine.UI;
public class finalscore : MonoBehaviour {
    public Text text;

    public Text highscore;
    void Start(){
        Debug.Log (Mathf.Round (PlayerPrefs.GetFloat ("finalScore")));
        Debug.Log (PlayerPrefs.GetInt ("hs", 0));
        Debug.Log (Mathf.Round (PlayerPrefs.GetFloat ("finalScore")) > PlayerPrefs.GetInt ("hs", 0));
//      PlayerPrefs.SetFloat ("hs", Mathf.Round(PlayerPrefs.GetFloat("finalScore")));
        highscore.text = "All time High Score: "+Mathf.Round (PlayerPrefs.GetFloat ("finalScore")).ToString ();
        text.text = "Final Score: " + Mathf.Round(PlayerPrefs.GetFloat("finalScore"));
        if(Mathf.Round(PlayerPrefs.GetFloat("finalScore"))<PlayerPrefs.GetInt("hs",0)){
            PlayerPrefs.SetFloat ("hs", Mathf.Round (PlayerPrefs.GetFloat ("finalScore")));
            highscore.text = "All time High Score: "+Mathf.Round (PlayerPrefs.GetFloat ("finalScore")).ToString ();
        }
    }
}

这是发生了什么的屏幕截图:

之前:

之后:

我的高分怎么可能下降!? 非常感谢您的宝贵时间!

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    我认为你在这里提出了错误的逻辑,假设finalScore 是在该级别获得的分数,hs 是历史最高分

    您在 脚本 2

    中编写了这一行
    (Mathf.Round(PlayerPrefs.GetFloat("finalScore"))<PlayerPrefs.GetInt("hs",0)
    

    改成这个

    (Mathf.Round(PlayerPrefs.GetFloat("finalScore"))>PlayerPrefs.GetInt("hs",0)
    

    注意大于号

    【讨论】:

      【解决方案2】:
      1. 问题在于您的条件检查。

      在这里,您正在检查最终分数是否低于高分,然后您将其设置为高分。

      if(Mathf.Round(PlayerPrefs.GetFloat("finalScore"))<PlayerPrefs.GetFloat("hs",0))
      

      只要反转条件,它就会起作用

       if(Mathf.Round(PlayerPrefs.GetFloat("finalScore")) > PlayerPrefs.GetFloat("hs",0))
      
      1. 还要确保在(设置和获取)高分中使用相同的浮点数/整数。

      【讨论】:

        【解决方案3】:

        你的问题在这里:

        highscore.text = "All time High Score: "+Mathf.Round (PlayerPrefs.GetFloat ("finalScore")).ToString ();
        

        您使用的是从 PlayerPrefs 中提取的“finalScore”值,而不是“hs”值。

        此外,正如 AstroBoy 在下面的评论中指出的那样,您的 if 语句是倒退的:

        if(Mathf.Round(PlayerPrefs.GetFloat("finalScore")) < PlayerPrefs.GetInt("hs",0)){
        

        只有当最终分数小于高于最高分数时,您才修改“hs”。

        我也不知道您为什么不使用 SetInt() 来表示您显然将其视为整数的值。

        【讨论】:

        • 我使用 setint 因为 z 并不总是 int
        • 还有,就是在if语句中,只有在hs小于finalScore的时候才会运行。而且 hs 总是 0
        • @AstroBoyR 可能不是,但你总是将它四舍五入为一个 int,所以在这一点上,它是一个 int。您对 if 语句也是正确的。一开始我无法梳理清楚,因为代码非常密集。
        • 好的,我今天可以试试,谢谢。我会告诉你它是否有效!
        【解决方案4】:

        尝试将您的 finalScore PlayerPref 更改为 int 而不是 float。有时 Unity 在做这种数学时很有趣。理想情况下,在需要比较或计算时尽量保持相同类型。

        无论如何,您已经将其转换为 int,在这里:

        PlayerPrefs.SetFloat("finalScore", Mathf.RoundToInt(FindObjectOfType<DistanceScore>().plrz));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多