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