【问题标题】:Transfer variables between scenes [duplicate]在场景之间转移变量[重复]
【发布时间】:2019-10-03 12:57:25
【问题描述】:

我今天开始使用 Unity 进行 C# 编程。如何获取从 1st_Scene 到 2nd_Scene 的值的内容?

在第一个场景中,我必须使用 Vuforia 引擎识别一张图片。识别图片后,您可以在画布上看到输入文本字段、按钮“传输”、空文本字段和第二个按钮“下一步”。首先,我在文本字段中写下我的名字。单击第一个按钮“传输”,文本显示在空的文本字段中。然后我点击第二个按钮“下一步”。这将加载 2nd_scene。此外,第一个 Textfield 中的变量应显示在第二个场景中,也应显示在第二个场景中画布中的 Textfield 中,但不会。

我试图用一个静态变量和一个额外的静态类来做到这一点。但是 Unity 总是显示这个错误:

这是脚本。

public class Button_Event : MonoBehaviour {
    public InputField fInput;
    public Text txtEingabe;

    public void Setget() {
        txtEingabe.text = "Your name is: " + fInput.text;
    }

    public void SwitchScene() {
        DontDestroyOnLoad(this.gameObject); 
        SceneManager.LoadScene(1, LoadSceneMode.Single);
        txtEingabe.text = "Your name is: " + fInput.text;
    }
}

这是两个场景中物体的图片:

【问题讨论】:

  • 如果你想保持它的对象,那么使用DontDestroyOnLoad()。但是如果你想要场景中的值我建议你使用PlayerPrefs
  • @thirteen4054 我是否必须通过单击“下一步”按钮将其插入到调用的方法中?括号中的“this”?
  • 没有。您可以在StartAwake 中致电DontDestroyOnLoad()

标签: c# unity3d


【解决方案1】:

虽然 DontDestroyOnLoad 将允许您的游戏对象跨场景持久存在,但如果不将其设为单例,则新场景中的其他组件将无法轻松访问它。单例模式很有用,但对于纯数据传输,我建议查看 ScriptableObjects。它们的功能更像指针。这是一个细分:

ScriptableObject 保存场景范围之外的数据。由于 ScriptableObject 在场景之外持续存在,对它的引用类似于指针。如果一个场景在 ScriptableObject 上放置数据并立即结束(即场景发生变化),则 ScriptableObject 仍会保留放置在其上的数据。如果一个新场景启动并且一个新对象正在从同一个 ScriptableObject 中读取,那么该新场景可以读取放置在那里的数据。

这是一个很好的用例示例:

[CreateAssetMenu(fileName = "PlayerData", menuName = "Player Data", order = 1)]
public class PlayerData : ScriptableObject 
{
    public string name;
}
public class NameInput : Monobehaviour
{
    public InputField fInput;
    public PlayerData playerData;

    public void NameSubmission()
    {
        playerData.name = fInput.text;
    }
}
public class Character : Monobehaviour
{
    public PlayerData playerData;

    public void Start()
    {
        Debug.Log(playerData.name);
    }
}

当您在资产文件夹中创建 PlayerData ScriptableObject 时,您可以将其拖到场景中任何 Character 或 NameInput GameObject 的检查器上。数据现在位于 PlayerData 资产对象内,而不是在场景范围内。请注意,这不会在运行时之外保留数据,因此您无法关闭并重新启动游戏并期望名称保留。

【讨论】:

    【解决方案2】:

    你要找的是https://docs.unity3d.com/ScriptReference/Object.DontDestroyOnLoad.html

    只需在对象(附加脚本的对象)上调用此函数,该脚本及其值将保持不变。

    【讨论】:

    • 我很抱歉,但我不明白你想说什么。我创建了一个新脚本并在链接中添加了代码示例。之后我该怎么办?
    • @milosromantic asker 已经在这样做了
    猜你喜欢
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多