【问题标题】:Keeping Scores in Unity and pass to next scene在 Unity 中保持分数并传递到下一个场景
【发布时间】:2014-05-16 18:36:01
【问题描述】:

在阅读并尝试了许多不同的示例之后,我仍然被这个相当简单的问题所困扰,即在 Unity 中从一个级别到下一个级别。

我有一个 C# 脚本来处理我的关卡游戏逻辑:

首先,我设置我的关卡变量:

    public class GameLogic : MonoBehaviour {

public GUIText countText;
public GUIText targetCity;
public GUIText gameOverText;
public GUIText endScoreText;
public GUIText timerText;
public Texture2D bgImage;
private int count;
public GameObject cityPrefab;
List<MyCity> mycities;
public float finalScore; // I Want this value to be available when my next scene loads
private float startTime;

在此之后,我的关卡代码执行良好,直到满足 GameOver 条件(时间到了)。然后,这段代码执行:

    public void GameOver ()
{
    gameOverText.text = "time is up!";
    endScoreText.text = "You have found " + count.ToString() + " cities. Good wrok!";
    Destroy (GameObject.FindWithTag("EmptyCity"));
    Destroy (GameObject.FindWithTag("City"));
    Destroy (GameObject.FindWithTag("TargetCity"));
    finalScore = count; // SO AT THIS STAGE, MY FINAL SCORE IS SET AND READY TO BE PASSED TO THE NEXT SCENE. QUESTION IS HOW?




    StartCoroutine(Wait());

}



IEnumerator Wait() {

    yield return new WaitForSeconds(7);
    Application.LoadLevel (3);
}

所以,我以公共浮动“finalScore”中的更新值结束我的关卡。到目前为止,一切都很好。现在我的问题开始了:3 级加载,2 级的所有游戏对象都被销毁。在我的游戏中,关卡 3 是一个简单的 Unity 场景,我祝贺玩家的表现。我想从我之前的场景(level2)中访问那个公共浮动 finalScore。

我知道我必须在某处使用 Dontdestroyonload。但我不知道怎么做。如何以及在哪里创建一个包含公共浮动“finalScore”的游戏对象?如何在我的新关卡中调用该游戏对象,以便我可以在我的新关卡中执行类似的操作:

    public GUIText ContratsOnScore;

    void SetContratsText() {

    CongratsOnScore = "Congratulations, you scored" + (finalScoreFloatValue from Previous level).ToString(); 

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    DontDestroyOnLoad 方法可以在 对象 上调用,而不是在单个变量上。它代表了需要从您的实际场景中“导出”的此类值的最佳方法。

    不过,您也可以使用PlayerPrefs。它们旨在用于“更高”持久性级别的信息,例如解锁级别的标志、排名系统的最终分数或可自定义角色的属性。这就是为什么 DontDestroyOnLoad 方式更适合(对于您的“临时”得分),但您也可以使用这个方式。基本上,PlayerPrefs 是存储在操作系统注册表中的信息。

    在退出实际场景之前,这样保存分数:

    PlayerPrefs.SetInt("Player Score", finalScore);
    

    并且,当下一个场景开始时,通过检索该信息来初始化 score 的变量:

    finalScore = PlayerPrefs.GetInt("Player Score");
    

    here 类似帖子)

    【讨论】:

    • 好的,知道了,谢谢。但是,如果我创建一个单独的空游戏对象并将其添加到我的场景中呢?我把这段代码放在 GameObject 上: using UnityEngine;使用 System.Collections;公共类 LastLevelScore : MonoBehaviour { void Awake() { DontDestroyOnLoad(transform.gameObject);那么,如何将 public float finalSocre 的值添加到该 Gameobject 中?其次,我如何在新场景中调用该 GameObject 及其值? (不知道为什么我的代码没有在 cmets 中格式化)
    • 以这种方式创建的“空”游戏对象必须将分数变量显示为暴露变量。然后,从您的其他对象中,您可以通过GetComponent() 调用从中检索该变量。我平时用Unityscript写,对C#不熟悉:所以不能给你一个完整的例子,抱歉……
    • 谢谢安德里亚。让我发疯的是,这样一个基本的简单概念在这种情况下实际上是如此复杂。我会看看我能在 Unityscript 上找到什么。
    • 很高兴你解决了。 :-) 是的,乍一看它可能很“复杂”,但请记住,Unity 为您提供了一系列用于此目的的可能性。您还可以设置一个纯文本文件并从中读取值! DontDestroyOnLoad 和 PlayerPrefs 方法只是更智能的解决方案,是引擎的“加号”。祝您学习阶段好运!
    • 谢谢伙计。我选择了玩家偏好路线。现在就像一个魅力!
    【解决方案2】:

    别人说,我无耻地引用,在 C# 类中为您的数据使用静态变量,然后就可以了...

    (我还是更愿意将参数传递给 LoadLevel 本身,但这是另一回事)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多