【问题标题】:Unity Pattern For Moving Some Objects Between Scenes?用于在场景之间移动某些对象的统一模式?
【发布时间】:2016-11-30 16:08:51
【问题描述】:

我正在寻找一种在场景之间转换的模式,将对象的一个​​实例移动到下一个场景,然后将其返回到前一个场景,但不会破坏前一个场景中的其他对象。这是上下文:

  • 当我的游戏加载时,它会连接到我的服务器以获取玩家可以控制的角色列表,并从预制件中动态实例化它们。
  • 加载脚本将每个角色游戏对象移动到主场景,然后加载该场景。
  • 主场景现在有了可以互动的角色。到现在为止还挺好。其中一个命令是选择一个特定的角色并将他们发送到一个任务中,该任务有自己的任务场景。
  • 我可以将该角色移动到任务场景,并在任务完成后将其移回。但是,由于主场景已卸载,其他不在任务中且不应出现在任务场景中的角色现在已被销毁。

我正在寻找一种模式来实现这一点。我读过的大部分内容都建议使用 DontDestroyOnLoad,但这实际上会将所有角色移动到所有场景中,这会导致任务场景中的角色过多。另一种选择可能是创建一个包含所有角色信息的游戏对象,在场景之间传递信息,并在每个场景中使用逻辑来重新实例化该场景中的适当角色。这感觉像是很多开销,因为我没有其他理由不断擦拭和重新创建它们。也许第三种选择是重组我的游戏,以便将任务场景添加到主场景并显示为某种覆盖/捕获输入的覆盖。这听起来很混乱,并且可能存在性能问题(针对 Android)。

有人对此有好的模式吗?

【问题讨论】:

  • 每个角色需要多个实例吗?只要您不需要 2 个“弓箭手”或其他任何东西,静态声明就可以做到。
  • 是的,我需要多个字符,这就是我遇到这个问题的原因——移动一个字符相对简单。每个角色都是一个探索者。你,玩家,可以雇佣他们(导致不止一个),你可以派他们去冒险。每次冒险只能有一个探险者进行,其他探险者在不冒险时需要留在主场景中。
  • 静态列表 应该可以工作。在创建它们时,将它们添加到列表中。
  • 是的,我知道有多个字符。我假设每个角色类型都有 1 个职业,但每个职业可能只有 1 个实例(1 个巫师、1 个弓箭手、1 个小偷等)。
  • 啊,不,我有一个资源管理器类,其中可能有 n 个实例(可能达到一个合理的数字,例如 10 —— 太多的嘴不能喂饱!)。

标签: unity3d


【解决方案1】:

使用场景管理器,您可以创建一个空场景,在这个空场景中放置您想要保留的所有对象。

在您卸载第一个场景(不是您创建的场景)并加载下一个场景之后。

当你的下一个场景被加载时,你将所有对象从你创建的场景转移到你刚刚加载的场景。

PS:您同时有多个场景加载,请查看此链接以获取更多信息: https://docs.unity3d.com/ScriptReference/SceneManagement.SceneManager.html

【讨论】:

    【解决方案2】:

    将 cmets 变成答案。

    可以从任何场景访问静态变量。根据您需要的每种类类型的数量,您可以实例化静态类或类的静态列表/数组。将对象添加到其中后,您可以从任何地方访问它们。

    只要这不会成为内存问题(例如数千个大对象),这应该可以很好地满足您的目的(无论如何,一些角色需要在整个游戏中持续存在)。

    【讨论】:

    • 但静态变量的目的并非如此。此外,它会导致数据丢失。游戏对象的集合将无法在重新加载后继续存在。所以不,这不是一个合适的答案。
    • 我总是在发帖前进行研究,除非真的很傻。这是我发帖前的参考。 answers.unity3d.com/questions/41891/…
    • 好吧,尽管有 20 多票赞成,但这并不正确。我假设其中有 19 个来自初学者,他们很高兴有一个可行的解决方案。但它并没有使它正确。静态有不同的用途。 PlayerPrefs 和 DontDestroyOnLoad 的目的是在场景或会话中保存数据。
    • 我并不是说您的信息不正确。我只是“展示我的作品”来展示我是如何想到它的。根据答案,它似乎被接受且准确。
    • 仅供参考 - 我没有按字面意思 100% 接受答案。我在我的单例 GameManager(基本上是状态机)中有一个我的资源管理器列表,对于每个场景,我都会实例化资源管理器预制件并在 GameManager 中引用该资源管理器的统计信息。到目前为止工作得很好。 List 本身不是静态的,但它是单例的一部分。
    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多