【问题标题】:How can I access an object's components from a different scene?如何从不同的场景访问对象的组件?
【发布时间】:2018-09-19 23:37:40
【问题描述】:

我有一个 Player 游戏对象,上面有一个脚本,其中保留了一些变量。我创建了一个充当主菜单的场景,其中包含“商店”部分,其中包含升级,基本上我需要从不同的场景访问玩家游戏对象的脚本,以便我可以从主菜单场景修改变量。我怎样才能做到这一点 ?

【问题讨论】:

  • 您可以将播放器中的这些变量保存在 playerPrefs 中,也可以检查 don't destroy on load 。但是 playerPrefs 在你的情况下可能会做得更好
  • 这实际上已经被问过很多次了。您有两种方法需要考虑,PlayerPrefs 和 DontDestroyOnLoad。我推荐第一个。静态经常被提及,但这并不是静态的本意,尽管它确实做到了。

标签: unity3d


【解决方案1】:

看看这个:

https://docs.unity3d.com/ScriptReference/Object.DontDestroyOnLoad.html

一旦你的播放器被加载,这将使他留在每个场景中,直到你选择释放他,这意味着当你加载你的菜单场景时,他将在那里访问。

现在既然我们知道他在那里,我们可以: (请注意,播放器是您的脚本,变量不是您的实际播放器)

ScriptName player = GameObject.FindObjectWithTag("yourtag").GetComponent<ScriptName>();

【讨论】:

    【解决方案2】:

    默认组件是类的实例。如果当前加载的场景中没有具有该组件的 GameObject,则没有可访问的内容。 如果我记得你现在可以一次加载多个场景。

    如果当前加载了带有该脚本的 GameObject,您可以使用: https://docs.unity3d.com/ScriptReference/Object.FindObjectsOfType.html

    甚至更好

    使用单例设计模式,以防您一次只有 1 个玩家。

    我猜你想保存这些升级以供下次运行游戏,所以你可以使用 PlayerPrefs https://docs.unity3d.com/ScriptReference/PlayerPrefs.html

    如果您想保存超过 50 个数据值,我建议您使用基于文件的数据库,例如 SQLite,它需要很少的时间来设置并且运行速度非常快。而且它比使用 PlayerPrefs 更具可读性。

    【讨论】:

    • 非常感谢,我想我会深入研究单例设计模式,一次加载多个场景以使用 GameObject 听起来很懒惰,第二个选项听起来更好。
    【解决方案3】:

    静态类呢?

    您可以将值保存在那里并从您想要的任何地方访问它:D

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-30
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      相关资源
      最近更新 更多