【问题标题】:TotalScore system in unity game development统一游戏开发中的 TotalScore 系统
【发布时间】:2018-02-15 16:38:38
【问题描述】:

我已经编写了这个脚本来获得分数,这个脚本工作正常,但是每当我结束游戏或游戏结束时,得分计数会重置为 0,当我重新运行我的游戏时,它会再次从 0 开始计数,而我想要它记住我的最后一点,从我离开的地方开始数。我的意思是它应该像终生总分一样。

这是我的代码示例:

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

public class ShackUp : MonoBehaviour 
{

public Text scoreText;


private int scoreCount = 0;

private void Update () 
{
    if (Input.GetKeyDown (KeyCode.Escape))
        OnbackButtonPressed ();

    if (gameOver)
        return;

    if (Input.GetMouseButtonDown (0)) 
    {
        if (PT ())
        {               
            SpawnTile ();
            scoreCount++;
            scoreText.text = scoreCount.ToString ();
        }
        else
        {
            EndGame ();
        }
    }

}

【问题讨论】:

标签: c# unity3d unity5


【解决方案1】:

您有几种解决方案可以做到这一点。

最简单的方法是使用PlayerPrefs。 使用 PlayerPrefs,您可以让 Unity 将数据持久保存到磁盘。

要保存值,请执行以下操作:

PlayerPrefs.SetFloat("Score", scoreCount);
PlayerPrefs.Save();

稍后再读:

var score = PlayerPrefs.GetFloat("Score");

对于偏好值和小数据(如您的分数),这是一个很好的解决方案。

如果您需要存储更大的数据块,另一种解决方案是将数据保存到文件中。要获取 Unity 知道它可以访问的文件夹的路径,无论平台是什么,请像这样获取 persistantDataPath

Application.persistantDataPath

最后你可以考虑使用服务器或数据库,如果你真的有很多数据,或者如果你需要在线保存它,但我想这不是你现在要求的,所以我不会在这里开发它

编辑,例如在您的代码中,使用属性将 ScoreCount 保存在 playerPrefs 中

public class ShackUp : MonoBehaviour 
{

    public Text scoreText;


    private int ScoreCount 
    {
        get{ return PlayerPrefs.GetInt("Score", 0); }
        set{ PlayerPrefs.SetInt("Score", value); }
    }

    private void OnDestroy()
    {
        PlayerPrefs.Save();
    }

    private void Update () 
    {
        if (Input.GetKeyDown (KeyCode.Escape))
            OnbackButtonPressed ();

        if (gameOver)
            return;

        if (Input.GetMouseButtonDown (0)) 
        {
            if (PT ())
            {               
                SpawnTile ();
                ScoreCount++;
                scoreText.text = ScoreCount.ToString ();
            }
            else
            {
                EndGame ();
            }
        }

    }
}

编辑: 以下是您评论后的一些精确度

1) 为了让您了解 c# 属性: 是的,我们可以将脚本中的变量 scoreCount 替换为 PlayerPrefs.GetFloat("Score") 行。这会奏效。但是在这个例子中我做了一些不同的事情:我使用了一个属性。它是这样声明的:

    private int ScoreCount 
    {
        get{ return PlayerPrefs.GetInt("Score", 0); }
        set{ PlayerPrefs.SetInt("Score", value); }
    }

看,它就像一个变量:它是私有的,它是一个 int,它的名字是 ScoreCount(约定是在这些的开头使用大写字母,但不是强制性的) 然后,我没有给这个变量一个值,而是给它一个 accessors: 像这样get{ return PlayerPrefs.GetInt("Score", 0); } 这意味着任何时候你写像int a = ScoreCount 这样的东西,它实际上会调用PlayerPrefs.GetInt("Score", 0);你,所以你不必写它。

setter 的工作方式相同。在属性的 set 部分,您始终可以访问名为 value 的变量。因此,如果在您的代码中编写ScoreCount = 3,它实际上会调用set{ PlayerPrefs.SetInt("Score", value); },并在value 变量中使用数字3。

你可以阅读更多关于属性here

总之,您可以致电

scoreText.text = PlayerPrefs.GetInt("Score").ToString ()

但这也一样

scoreText.text = ScoreCount.ToString ()

2)

关于向字符串添加一些文本。这称为字符串连接 文档是here

总而言之,您可以通过以下两种方式做到这一点。

使用“+”运算符添加字符串。由于 "+" 是一个字符串,添加一个 int 并给出一个字符串,所以你不需要再写 toString 了:

scoreText.text = "+" + ScoreCount

如果您需要更复杂的字符串格式化,有点复杂但有用,请使用 string.Format method

scoreText.text = String.Format("+{0}", ScoreCount)

这会将 {0} 替换为 ScoreCount。您可以使用 {1}、{2} ...

添加更多变量

【讨论】:

  • 虽然 PlayerPrefs 在许多情况下被用作一种简单的存储方式,但它们也存储在不太理想的位置,例如在注册表系统中的 Windows 上,可以在其中对其进行编辑。但是对于一个小型的非在线实验,它们可以工作。
  • 是的,它们确实可以编辑,这就是为什么它适合偏好(无论如何用户都可以编辑)。如果需要,一些库也可以对其进行加密(例如,参见 github.com/rawandnf/SecurePlayerPrefs
  • 分数不是偏好。偏好是一种设置。您不能正常编辑您的乐谱,因为这会使它变得毫无用处。
  • @BasilePerrenoud 我没有正确理解它你能告诉我编辑我的代码吗?
  • @Doh09 是的,我知道,谢谢。不是很清楚 OP 想要一种简单的方法来坚持,并且 PlayerPrefs 是一个好的开始(就像你在评论中所说的那样)?你说它们并不理想,因为可编辑,我说它非常适合偏好。这是超出此问题范围的关于分数的讨论。在这种特定情况下,我们同意 OP 可以使用它,因为它很简单,如果需要,他可以使用加密的 playerprefs
猜你喜欢
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 2012-05-11
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
相关资源
最近更新 更多