【问题标题】:how can i retain my player score to a new scene?如何将我的玩家分数保留到新场景?
【发布时间】:2019-01-07 13:57:19
【问题描述】:

我有一个简单的脚本来计算玩家的分数,我如何获取这个值并将其显示在游戏结束场景上?

这是我的评分脚本:

public class scoreScript : MonoBehaviour {

 public static int scoreValue = 0;
 Text score;

 // Use this for initialization
 void Start () {
     score = GetComponent<Text>();
 }

 // Update is called once per frame
 void Update () {
     score.text = "Score:" + scoreValue;
 }

}

【问题讨论】:

标签: c# unity3d


【解决方案1】:

简单,只需在游戏结束场景中所需的任何脚本中调用“scoreScript.scoreValue”

【讨论】:

  • 我能举个例子说明如何称呼它抱歉
【解决方案2】:

在退出当前场景时将其存储在 PlayerPrefs 中,并将其保存在 playerpref 中,例如:

PlayerPrefs.Setint(" CurrentScore",scoreValue);

然后在新场景中检索它:

scoreValue = PlayerPrefs.Getint(" CurrentScore");

【讨论】:

  • 我试过了,但我认为它不起作用,我找不到将它附加到我的乐谱文本的位置
  • 如果你仔细观察,其他答案都没有真正回答这个问题,但这个答案可以!
【解决方案3】:

你已经做到了public static,剩下的就是在你的游戏中写下场景的文本字段脚本:

gameOverText.text = "Score: " + scoreScript.scoreValue;

假设gameOverText 是Text。

您不需要创建实例来访问静态成员,您应该使用类名(在您的情况下为scoreScript)访问它们。

但是,将存储全局分数和用于显示它的 textField 混合在一个类中并不好,因为当您向游戏添加新功能时,所有全局变量将位于不同的类中,您会越来越关注在修改代码时。为避免这种情况,您可以使用静态类作为存储所有全局变量的“核心”。这是第一次。

DontDestroyOnLoad 与GameObjects 一起使用,因此在加载新场景时它们不会被破坏。如果您在脚本中调用它,您的得分计数 GameObject 将保留,文本字段也将保留,因为它是该对象的组成部分,并且会出现在游戏结束场景中,所以不要这样做。

【讨论】:

  • 我认为我将它正确添加到代码中并且编译时没有错误,但它似乎没有做任何提示?
  • 您的游戏结束标签脚本应该已启用并位于已启用的 GameObject 上。您可以在其中添加Debug.Log("..."); 以查看该函数是否被调用。
  • 我得到一个错误,说我没有调用脚本分数变量,我如何实际实例化它?
【解决方案4】:

在加载新场景时,带有“scoreScript”的游戏对象会丢失。为了将相同的游戏对象转移到新场景(这很有意义,以免丢失脚本携带的信息),您需要使用“DontDestroyOnLoad”方法。 您只需在您的单一行为的 Awake 方法中调用该方法,然后您的游戏对象(连同脚本中的数据)将持续加载新的场景。 以下是相关文档: https://docs.unity3d.com/ScriptReference/Object.DontDestroyOnLoad.html

这是一个代码示例:

public class scoreScript : MonoBehaviour {
    public static int scoreValue = 0;
    Text score;

    void Awake(){
        DontDestroyOnLoad(this.gameObject);
    }

    void Start () {
        score = GetComponent<Text>();
    }

    void Update () {
        score.text = "Score:" + scoreValue;
    }
}

【讨论】:

  • 此外,使用静态值进行记分使全局访问变得容易,但您可能需要考虑使用事件来更新您的分数值(即,当发生某些事情时,会引发事件并且分数管理器通过增加分数来响应该事件)这样您也不需要总是重复“score.text =”Score:“+ scoreValue;”在更新方法中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多