Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何跨场景保存某些变量的数据?_C#_Unity3d - Fatal编程技术网

C# 如何跨场景保存某些变量的数据?

C# 如何跨场景保存某些变量的数据?,c#,unity3d,C#,Unity3d,我正在做一个涉及玩家得分的游戏。此分数始终显示在屏幕上。但是,当我更改场景时,分数重置回0。我怎样才能在我所有的场景中保存分数 我在网上查了好几个小时,但我没能用那种方式修复它。我遇到的两个主要问题是: 静态变量 DontDestroyOnLoad 虽然我确信这些可以解决我的问题,但我不知道如何在代码中实现它们。我要写新剧本吗?我是否将它们放在现有脚本中?如果是,哪一个?如果变量是静态的,如何调用它们 提前感谢您的帮助 好的,这里有一个最小的例子 保存数据对象: using UnityEngin

我正在做一个涉及玩家得分的游戏。此分数始终显示在屏幕上。但是,当我更改场景时,分数重置回0。我怎样才能在我所有的场景中保存分数

我在网上查了好几个小时,但我没能用那种方式修复它。我遇到的两个主要问题是:

静态变量

DontDestroyOnLoad

虽然我确信这些可以解决我的问题,但我不知道如何在代码中实现它们。我要写新剧本吗?我是否将它们放在现有脚本中?如果是,哪一个?如果变量是静态的,如何调用它们


提前感谢您的帮助

好的,这里有一个最小的例子

保存数据对象:

using UnityEngine;

public class SaveDataHere : MonoBehaviour {

    public string myData;

    public static string staticData = "Static data is still here";

    // Use this for initialization
    void Start () {
        DontDestroyOnLoad(this);

        myData = "I didn't get destroyed haha";

    }
}
在新场景中:

using UnityEngine;
public class InNewScene : MonoBehaviour {

    // Use this for initialization
    void Start () {
        var saveData = FindObjectOfType<SaveDataHere>();
        Debug.Log("instance data is " + saveData.myData);
        Debug.Log("static data is " + SaveDataHere.staticData);
    }
}

如果您只是试图跨屏幕访问简单数据,那么静态变量似乎是最简单的解决方案。如果你以前从未使用过它们,那也没关系,一旦你习惯了,它们就很容易使用了

首先要做的是创建一个类来保存静态变量是的,这意味着要编写一个新脚本并将其放入脚本文件夹中。在已经使用的类上添加新的静态变量是可能的,但如果您只是在学习,我建议您将这类变量分开,这样会更有条理

public class GameValues {

    public static int score { get; set; }

    // You can add other static variables here.

}
请注意,我不是从MonoBehavior继承的。这很好,因为我们不需要将这个脚本添加到游戏对象中,它只是用来存储我们的数据。现在如果我们需要更改或读取分数,我们可以这样做

public class Example : MonoBehaviour {

    public int scoreLimit = 100;

    private void Update () {

        /* 
         * When accessing static members of a class, no object reference is needed.
         * Instead you access it as though it were a member of the class.
         */
        int currentScore = GameValues.score;

        if (Input.GetKeyDown (KeyCode.Space) && (currentScore < scoreLimit)) {

            GameValues.score += 1;

        }
    }
}
显然,这是一个相当愚蠢的例子,但你明白了。如果你想做一些进一步的阅读,是关于静态关键字的微软官方文档


快乐编码

您有两个选择

1玩家参考

Unity有一个名为PlayerPrefs的内置保存过程,它将在场景和游戏重新启动之间存储数据

//存储分数值 PlayerPrefs.SetIntScore,Score; //检索分数值(如果有) 如果PlayerPrefs.HasKeyScore { 分数=PlayerPrefs.GetIntScore; } 2统一单身汉

Unity Singleton与普通编程语言略有不同,它使用DontDestroyOnLoad来保持游戏对象在场景之间保持活动状态

公共类UnitySingleton:单一行为 { 公共静态UnitySingleton实例{get;private set;} 公共整数分数{get;set;} 私人空间觉醒 { 如果实例!=null&&Instance!=this { 破坏游戏对象; } 其他的 { 实例=此; DontDestroyOnLoadgameObject; } } } 用法

//存储分数 UnitySingleton.Instance.Score=值; //检索分数,否则将返回0 Score=UnitySingleton.Instance.Score;
谢谢我应该在DontDestroyOnLoad中添加什么来代替这个?在场景之间要保留的任何对象。如果在包含跨场景数据的对象上放置DontDestroyOnLoad,则可以将其保留为ThisOK cool!在第二个脚本中,我是否需要在这里输入任何内容:FindObjectOfType;?或者干脆让它空着。您需要一些方法来找到保存数据的对象。由于您正在加载另一个场景中的对象,因此无法从“检查器”中将这两个对象链接在一起。非常感谢,这就是我要查找的内容。一个跟我说话的人,就像我是一个初学者,几乎什么都不懂,事实就是这样再次感谢!我们不能用它来存储数组吗?@SakunaMadushanka什么数组?在场景之间保存并使用数据数组,如highestTopScores[100,89,…]是的,你可以使用Singleton方法在场景之间保存值,但对于在应用程序会话之间存储值,我建议查看如何保存持久数据的方法。这将非常有用。提前感谢您的支持。