【问题标题】:How do I keep score between scenes in Unity dynamically?如何在 Unity 中动态保持场景之间的得分?
【发布时间】:2020-10-01 19:47:50
【问题描述】:

我有一个我无法弄清楚的 UI 错误。我希望能够将我的乐谱带到每个场景中,同时也让每个场景彼此独立。如果玩家选择在第 6 级开始游戏,他应该能够使用干净的记分牌这样做,就像从第 1 级开始一样。分数应该继续进行转移,直到玩家死亡,此时分数应该被退回到 0。为此,我已经预制了我的记分牌,并使用单例模式将其放入每个场景中,以确保场景中没有重复的记分牌。在尝试使用 UnityEngine.UI 访问我的 Text 类型的乐谱文本 UI 时,在加载新场景后调用类时收到空引用错误。以下是定义用于在 Unity 2019.4.1f1 中实现我的层次结构的功能和屏幕 sn-ps 的方法的 C# 类。我还附上了一个简短的 youtube 视频,向您展示分数在第一个场景中确实有效,但在之后的任何其他场景中都无效。我确实知道,如果有多个场景,我会在每个场景开始时破坏 Text UI。我不明白为什么嵌套在记分板画布下的文本 UI 没有在 Awake() 上为每个创建的实例找到它的引用,以及为什么它被称为 null。我真的很感谢任何人的帮助!

以下是按顺序排列的屏幕快照和视频:

  1. Youtube 的 bug 视频
  2. 记分板画布的层次结构
  3. 乐谱文本的层次结构
  4. Scoreboard 单例类(附加到 Scoreboard Canvas)/ ScoreText 类(附加到 ScoreText UI)
  5. 在 CollisionHandler 类中实现用于在完成关卡时添加分数的类

UI Bug Video

Hierarchy of Scoreboard Canvas

Hierarchy of ScoreText

Scoreboard Classes

CollisionHandler class used for implementation

如果这些没有帮助,这里是查看项目代码的 github 链接:

Github Project Files

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    将您的分数存储在调用DontDestroyOnLoad(this.gameObject);的单一行为中

    这将在场景更改之间保留该对象。 https://docs.unity3d.com/ScriptReference/Object.DontDestroyOnLoad.html

    【讨论】:

    • 记分板本身是 DontDestroyOnLoad()。这不是正确的做法吗?
    【解决方案2】:

    至于为什么它不起作用,我不太确定。 但我可以告诉你一些解决方法: 您可以尝试在 ScoreText 脚本中创建 ScoreText 的公共静态实例。

    public static ScoreText _instance;
    public static ScoreText instance { get { return _instance; } }
    private int score;
    private Text scoreText;
    
        private void Awake()
        {
            if (_instance != null && _instance != this)
            {
                Destroy(this.gameObject);
            }
            else
            {
                _instance = this;
            }
        }
    
        void Start()
        {
            score = 0;
            scoreText.text = score.ToString();
        }
    
    

    并通过以下方式访问其功能:

    ScoreText.instance.AddToScore();
    

    在我看来,它会更干净、更容易使用。 如果您想简化一点,您也可以在更新函数中更新 scoreText。但是由于您只在登陆这些绿色区域时添加积分,因此您的方式也可以正常工作。 希望我能帮上忙。

    【讨论】:

    • 我将尝试实现这一点,并在明天@Weedosaurus 回复您的结果。非常感谢你们帮助我,我真的很感激:)。我可以在检查这些答案后发布更新!
    • 了不起的人,唯一缺少的是引用文本 scoreText。太感谢了!它起作用了:) 你介意解释一下你做了什么吗?我是静态的新手,不了解 _instance 和实例成员变量。
    • 其实我也不是这方面的专家。我刚刚告诉你我一直使用单例的方式:用于池、GameManager、广告等。基础是创建 get 和 not set 脚本的公共静态实例。在清醒时确保它是唯一的。很高兴我能提供帮助:D 如果您有任何疑问或突然出现问题,请评论此线程,我会再次检查。附言。该实例将被使用,而 _instance 将在内部进行检查。或者可能不是。正如我所说,我也不太确定。啊
    • 好吧,我不太确定你在解决我研究了大约 8 个小时的问题方面做得很好。我发现的只是“使用 UserPrefs()”。不过,我不想将数据存储到机器上,这是人们不理解的。我需要一个方法来解决它,而你把它钉在了头上。我将研究为什么这是有效的,如果你不介意。我将在其他地方发布一个问题,询问社区为什么它会起作用,看看我是否可以获得深入的解释。再次感谢您,如果需要,我会在这里发信息。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多