【问题标题】:Unity 2D: PlayerPrefs Implementation for HighscoreUnity 2D:高分的 PlayerPrefs 实现
【发布时间】:2018-02-11 14:00:29
【问题描述】:

我需要一些帮助来实现节省的 HighScore。目前,我有一个分数,从 500,000 开始,每秒下降 150 分。这行得通,虽然当我死了它仍然继续,我需要修复。我有第二个 kmHighscore 文本,我希望它显示高分。现在它显示了我死亡的确切分数(例如 450,875),但是当我重新启动游戏时,我似乎无法保存它。我尝试使用 PlayerPrefs,但我不确定如何在我的代码中应用它。我希望它代表最低的分数,在这种情况下,它从 500,000 开始,是有史以来达到的分数。请注意:kmScore 和 kmHighscore 都只是数字,我在 Unity 窗口中的分数或高分之前没有文本。任何帮助将不胜感激!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class GameOver : MonoBehaviour {

    public GameObject gameOverScreen;
    public Text kmScore;
    public Text kmHighscore;
    float savedScore;
    bool gameOver;
    private float score = 500000;

    void Start () {
        FindObjectOfType<PlayerController>().OnPlayerDeath += OnGameOver;          
    }

    public void Update () {

        kmScore.text = GetScore().ToString("F0");

        if (gameOver)
        {
            if (Input.GetKeyDown (KeyCode.Space))
            {
                SceneManager.LoadScene(1);
            }
        }
    }


    float GetScore()
    {
        return score - (float)Time.timeSinceLevelLoad * 150;
    }


    void OnGameOver()
    {

        gameOverScreen.SetActive (true);
        kmHighscore.text = GetScore().ToString("F0");

    }
}

【问题讨论】:

    标签: unity3d unity3d-2dtools


    【解决方案1】:

    你应该把你的脚本改成这样:

    using UnityEngine;
    using UnityEngine.UI;
    using UnityEngine.SceneManagement;
    
    public class GameOver : MonoBehaviour {
        const string PLAYERPREFS_HIGHSCORE = "High Score";
        const int STARTING_SCORE = 500000, POINTS_PER_SECOND = 150;
        public GameObject gameOverScreen;
        public Text kmScore, kmHighscore;
        private int allTimeHighScore, actualScore;
        private bool gameOver;
    
        private void Start() {
            allTimeHighScore = PlayerPrefs.GetInt(PLAYERPREFS_HIGHSCORE, STARTING_SCORE);
            gameOver = false;
            FindObjectOfType<PlayerController>().OnPlayerDeath += OnGameOver;
            kmHighscore.text = allTimeHighScore.ToString("F0");
        }
    
        private void Update() {
            if (gameOver) {
                if (Input.GetKeyDown(KeyCode.Space)) {
                    SceneManager.LoadScene(1);
                }
            }
            else {
                kmScore.text = GetScore().ToString("F0");
            }
        }
    
        private int GetScore() {
            return actualScore = STARTING_SCORE - (int)Time.timeSinceLevelLoad * POINTS_PER_SECOND;
        }
    
        private void OnGameOver() {
            gameOverScreen.SetActive(true);
            if (allTimeHighScore > GetScore()) {
                kmHighscore.text = (allTimeHighScore = actualScore).ToString("F0");
                PlayerPrefs.SetInt(PLAYERPREFS_HIGHSCORE, allTimeHighScore);
            }
            gameOver = true;
        }
    }
    

    关于代码的几点说明:

    • 切勿在脚本中使用所谓的“幻数”,如果这些变量是不可变的,请利用 const 变量。
    • 我添加了gameOver 的使用,因为您将它声明为private,并且在课堂上的任何地方都没有使用它。这将在设置为 true 时停止计分。
    • 将分数类型更改为int,这样更合适。

    【讨论】:

    • 感谢您的宝贵时间!它没有给我任何错误,但是,重新启动后高分保持在 0。因此,如果我在 497,000 时死亡,它将显示为最高分,因为这是我的第一次通关,但在按下重新启动按钮后,重新加载场景后,最高分停留在:0。有什么想法吗?
    • 这不应该发生。您确定您没有在其他脚本中的任何地方使用PlayerPrefs.SetInt 吗?尝试在编辑器中运行一次游戏,然后打开 regedit 并检查 HKEY_CURRENT_USER\Software\Unity\UnityEditor\[CompanyName]\[ProductName] 是否正确保存了 High Score 值。 CompanyName 和 ProductName 在 Unity 的 Player 设置中找到
    • 我删除了它们并开始了一个新游戏。确实保存了正确的 HighScore。但是,它在我第一次死后显示为:0。在我的统一编辑器的文本窗口中,kmHighScore 元素带有文本:0。只是数字。也许这不是应该的样子?
    • 你说得对,我忘了更新Start()中的kmHighscore.text,我会编辑答案来修正错误。
    • 现在完美运行。谢谢!我非常感谢您提供了代码。我从未使用过 PlayerPrefs,我不得不承认,第一次尝试是一场灾难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多