如何保存 2D 游戏的高分
How can I save the high score for a 2D game
我有一个脚本不会自动保存高分,在我按下重新启动按钮之前,我的高分是在没有任何代码的情况下保存的。我希望即使玩家重新开始游戏也能保存高分。这是我的 SCORE 代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Score : MonoBehaviour
{
public int score;
public Text ScoreText;
public int highscore;
public Text highScoreText;
void Start()
{
highscore = PlayerPrefs.GetInt("HighScore: " + highscore);
}
void Update()
{
ScoreText.text = "Score: " + score;
highScoreText.text = highscore.ToString();
if (score > highscore)
{
highscore = score;
PlayerPrefs.SetInt("HighScore: ", highscore);
}
}
void OnTriggerEnter(Collider other)
{
Debug.Log("collider is working");
if (other.gameObject.tag == "Score: ")
{
score++;
}
}
}
这是重启按钮的代码:
using UnityEngine;
using UnityEngine.SceneManagement;
using System.Collections;
public class RestartGame : MonoBehaviour
{
public void RestartsGame()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().name); // loads current scene
}
}
您对 PlayerPrefs
使用的密钥有疑问:
void Start()
{
highscore = PlayerPrefs.GetInt("HighScore");
}
void Update()
{
ScoreText.text = "Score: " + score;
highScoreText.text = highscore.ToString();
if (score > highscore)
{
highscore = score;
PlayerPrefs.SetInt("HighScore", highscore);
}
}
如 Draco18s 所述
you shouldn't be using player prefs to save game data (such as
highscore).
如果需要,您可以按照以下方法将其保存在 json 文件中。它还增加了更多的灵活性,以防您想要添加诸如前 10 名之类的东西。
using UnityEngine;
using System.IO;
public class HighestScoreJson
{
/// <summary>
/// //Returns the path to the highestScoreFile
/// </summary>
/// <returns></returns>
public static string GetPathToHighestScore() {
return Path.Combine(Application.persistentDataPath, "HighestScore.json"); //You can look for info about the unity streamingAssets folder in the unity documentation
}
/// <summary>
/// Get the highestScore
/// </summary>
/// <returns></returns>
public static HighestScore GetHighestScore() {
string path = GetPathToHighestScore();
if (!File.Exists(path)) //Checks if the file exists
{
HighestScore highestScore = new HighestScore();
string jsonObj = JsonUtility.ToJson(highestScore);
//Debug.Log("SavedJsonFile: " + jsonObj);
FileInfo defaultFile = new FileInfo(path);
defaultFile.Directory.Create(); // If the directory already exists, this method does nothing.
File.WriteAllText(path, jsonObj);
}
string file = File.ReadAllText(path);
HighestScore highestScoreJson = JsonUtility.FromJson<HighestScore>(file);
//Debug.Log(highestScoreJson.highestScore); //here you can check the value on the debug if you want
return highestScoreJson;
}
/// <summary>
/// Save a new highestScore
/// </summary>
/// <param name="highestScore"></param>
public static void SaveHighestScore(int highestScoreValue) {
string path = GetPathToHighestScore();
HighestScore highestScore = new HighestScore();
highestScore.highestScore = highestScoreValue;
string jsonObj = JsonUtility.ToJson(highestScore);
//Debug.Log("SavedJsonFile: " + jsonObj);
FileInfo file = new FileInfo(path);
file.Directory.Create(); // If the directory already exists, this method does nothing.
File.WriteAllText(path, jsonObj);
}
}
/// <summary>
/// This class holds the highestScore
/// </summary>
public class HighestScore
{
public int highestScore;
//You can also create a list if you want with the top 10 or something like that
}
那你就这样用
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Score : MonoBehaviour
{
public int score;
public Text ScoreText;
public int highscore;
public Text highScoreText;
void Start()
{
highscore = HighestScoreJson.GetHighestScore().highestScore;
}
void Update()
{
ScoreText.text = "Score: " + score;
highScoreText.text = highscore.ToString();
if (score > highscore)
{
highscore = score;
HighestScoreJson.SaveHighestScore(highscore);
}
}
void OnTriggerEnter(Collider other)
{
Debug.Log("collider is working");
if (other.gameObject.tag == "Score: ")
{
score++;
}
}
}
如果您取消更新并仅在比分发生变化时更改您的短信,您可能可以优化您的通话。
void Update() //Don't need it
{
}
void OnTriggerEnter(Collider other)
{
Debug.Log("collider is working");
if (other.gameObject.tag == "Score: ")
{
score++;
ScoreText.text = "Score: " + score;
highScoreText.text = highscore.ToString();
if (score > highscore)
{
highscore = score;
HighestScoreJson.SaveHighestScore(highscore);
}
}
}
我有一个脚本不会自动保存高分,在我按下重新启动按钮之前,我的高分是在没有任何代码的情况下保存的。我希望即使玩家重新开始游戏也能保存高分。这是我的 SCORE 代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Score : MonoBehaviour
{
public int score;
public Text ScoreText;
public int highscore;
public Text highScoreText;
void Start()
{
highscore = PlayerPrefs.GetInt("HighScore: " + highscore);
}
void Update()
{
ScoreText.text = "Score: " + score;
highScoreText.text = highscore.ToString();
if (score > highscore)
{
highscore = score;
PlayerPrefs.SetInt("HighScore: ", highscore);
}
}
void OnTriggerEnter(Collider other)
{
Debug.Log("collider is working");
if (other.gameObject.tag == "Score: ")
{
score++;
}
}
}
这是重启按钮的代码:
using UnityEngine;
using UnityEngine.SceneManagement;
using System.Collections;
public class RestartGame : MonoBehaviour
{
public void RestartsGame()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().name); // loads current scene
}
}
您对 PlayerPrefs
使用的密钥有疑问:
void Start()
{
highscore = PlayerPrefs.GetInt("HighScore");
}
void Update()
{
ScoreText.text = "Score: " + score;
highScoreText.text = highscore.ToString();
if (score > highscore)
{
highscore = score;
PlayerPrefs.SetInt("HighScore", highscore);
}
}
如 Draco18s 所述
you shouldn't be using player prefs to save game data (such as highscore).
如果需要,您可以按照以下方法将其保存在 json 文件中。它还增加了更多的灵活性,以防您想要添加诸如前 10 名之类的东西。
using UnityEngine;
using System.IO;
public class HighestScoreJson
{
/// <summary>
/// //Returns the path to the highestScoreFile
/// </summary>
/// <returns></returns>
public static string GetPathToHighestScore() {
return Path.Combine(Application.persistentDataPath, "HighestScore.json"); //You can look for info about the unity streamingAssets folder in the unity documentation
}
/// <summary>
/// Get the highestScore
/// </summary>
/// <returns></returns>
public static HighestScore GetHighestScore() {
string path = GetPathToHighestScore();
if (!File.Exists(path)) //Checks if the file exists
{
HighestScore highestScore = new HighestScore();
string jsonObj = JsonUtility.ToJson(highestScore);
//Debug.Log("SavedJsonFile: " + jsonObj);
FileInfo defaultFile = new FileInfo(path);
defaultFile.Directory.Create(); // If the directory already exists, this method does nothing.
File.WriteAllText(path, jsonObj);
}
string file = File.ReadAllText(path);
HighestScore highestScoreJson = JsonUtility.FromJson<HighestScore>(file);
//Debug.Log(highestScoreJson.highestScore); //here you can check the value on the debug if you want
return highestScoreJson;
}
/// <summary>
/// Save a new highestScore
/// </summary>
/// <param name="highestScore"></param>
public static void SaveHighestScore(int highestScoreValue) {
string path = GetPathToHighestScore();
HighestScore highestScore = new HighestScore();
highestScore.highestScore = highestScoreValue;
string jsonObj = JsonUtility.ToJson(highestScore);
//Debug.Log("SavedJsonFile: " + jsonObj);
FileInfo file = new FileInfo(path);
file.Directory.Create(); // If the directory already exists, this method does nothing.
File.WriteAllText(path, jsonObj);
}
}
/// <summary>
/// This class holds the highestScore
/// </summary>
public class HighestScore
{
public int highestScore;
//You can also create a list if you want with the top 10 or something like that
}
那你就这样用
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Score : MonoBehaviour
{
public int score;
public Text ScoreText;
public int highscore;
public Text highScoreText;
void Start()
{
highscore = HighestScoreJson.GetHighestScore().highestScore;
}
void Update()
{
ScoreText.text = "Score: " + score;
highScoreText.text = highscore.ToString();
if (score > highscore)
{
highscore = score;
HighestScoreJson.SaveHighestScore(highscore);
}
}
void OnTriggerEnter(Collider other)
{
Debug.Log("collider is working");
if (other.gameObject.tag == "Score: ")
{
score++;
}
}
}
如果您取消更新并仅在比分发生变化时更改您的短信,您可能可以优化您的通话。
void Update() //Don't need it
{
}
void OnTriggerEnter(Collider other)
{
Debug.Log("collider is working");
if (other.gameObject.tag == "Score: ")
{
score++;
ScoreText.text = "Score: " + score;
highScoreText.text = highscore.ToString();
if (score > highscore)
{
highscore = score;
HighestScoreJson.SaveHighestScore(highscore);
}
}
}