Unity ScriptableObjects和DontDestroyOnLoad

时间:2018-09-10 21:23:37

标签: unity3d

关于ScriptableObjects,我有几个小问题。

1)通过进行初步测试,似乎可以脚本化的对象资产永远不会加载到内存中(即反序列化),除非已经有对象在引用它。有没有一种方法可以使这些可脚本化对象在游戏开始时加载而无需任何硬引用?

2)我正在尝试使用hideflags.DontDestroyOnLoad在整个游戏中保持可脚本化对象的生命。我阅读了文档,您需要销毁这些对象以防止内存泄漏。我需要将其添加到OnDisable或类似的东西以在完成后杀死自己吗?我打算在重新打开游戏时再次使用相同的可脚本化对象,但我不确定是否每次关闭游戏时都完全有必要杀死这些对象。

谢谢,我试图准确地掌握可脚本化对象的功能以及使用它们时的一些最佳做法。

1 个答案:

答案 0 :(得分:1)

  1. 正如@Hellium在注释中指出的那样,如果没有内容引用它们,那么就没有任何东西可以使用它们。如果您的经理/公用事业机构拥有对所有这些机构的引用,那么您只需加载它。这样做的常见方法是仅使用Resources.Load并使用指向实用程序的prefab / ScriptableObject的硬编码路径。
  2. 在加载场景时,Unity会销毁所有场景对象。 DontDestroyOnLoad阻止它销毁特定对象。 ScriptableObject不是场景对象,因此它们不受这两种情况的影响。
  

我阅读了文档,您需要销毁这些对象以防止内存泄漏。我需要将其添加到OnDisable或类似的东西以在完成后杀死自己吗?

否,如果您尝试这样做,Unity实际上会抱怨。仅在引擎破坏ScriptableObject.OnDisable时才调用。不同于您可以随意启用和禁用它的MonoBehaviour。

  

我打算在重新打开游戏时再次使用相同的可脚本化对象,但我不确定是否每次关闭游戏时都完全有必要杀死这些对象。

当您再次加载游戏时,实用程序/管理器将加载与第一次相同的引用。

我不确定您说的是什么方式,但是有些人在编辑器中看到了它的工作方式(退出播放模式时,Unity撤消了对场景对象的所有更改,但是ScriptableObjects通常是不受影响的资产,因此它们数据将持续存在),他们错误地认为它在构建中的作用相同。它不是。在构建时,所有预制件/ ScriptableObjects /其他资产的值都固定在其中。每次运行该构建时,都将从与构建时相同的值开始,而不考虑上次运行游戏时所做的任何修改。 。您不能仅仅使用ScriptableObjects作为一种在运行时保存内容的简便方法(如果可以的话,那会很棒)。