统一游戏开发中的TotalScore系统

时间:2018-02-14 12:35:18

标签: c# unity3d unity5

我写了这个脚本来获得分数,这个脚本工作正常,但每当我结束游戏或游戏结束时,分数重置为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 ();
        }
    }

}

1 个答案:

答案 0 :(得分: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#属性: 是的,我们可以用行PlayerPrefs.GetFloat("Score")替换脚本中的变量scoreCount。这会奏效。但是在这个例子中我做了一些不同的事情:我使用了属性。它声明如下:

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

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

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

您可以阅读有关属性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)

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

添加更多变量