【问题标题】:Confusion regarding scriptableObject关于 scriptableObject 的困惑
【发布时间】:2020-03-06 23:48:42
【问题描述】:

当我们仍然制作 ScriptableObject 的多个副本/实例时,它对内存优化有什么好处?

过去,脚本附加到预制件上,在实例化时,每个脚本都用于在内存中创建/保留自己的插槽,这是一种不好的方法,因为同一脚本有多个副本。

我们在可编写脚本的对象中所做的是: 创建一个可编写脚本的对象,从 Asset>Create> 创建其多个实例,在这些实例中提供数据并在需要时访问数据。 它与在预制件上附加脚本并实例化它或制作包含数据的 ScriptableObject 的多个副本并从中访问数据有何不同。毕竟我们也在 scriptableobject 中制作了多个副本。

请解释一下 ScriptableObject 的多个副本与实例化的预制件的多个副本如何对内存友好的区别。?

【问题讨论】:

  • 我认为 scritbleObject 没有 MonoBehavior 成本。比较简单,把它当成设置文件就好了。
  • @TimChang 我认为我们不会从 monobehaviour 继承它只是为了告诉 unity 这个脚本不能附加到任何游戏对象,但它仍然使用 monobehavior 函数。
  • Prefabs 和 SO 有不同的用途,prefabs 可能会使用 SO 作为数据提供者(sprite、其他 prefabs、数据)。您可以使用相同的 SO 拥有多个预制件(这是内存消耗的来源)。 SO 不是 MonoBehaviour,它们没有生命周期(开始、更新……),它们主要用于存储数据或事件。您可以将它们视为可以在编辑器中使用的高级 C# 类。
  • 如果您在运行时创建所有 SO,那么您可能应该使用“普通”类并在运行时创建实例。否则,正如 Everts 已经说过的那样:目的完全不同。 SO 可以看作是序列化的 DataContainer,因此您可以在其中存储信息并引用,尤其是在需要时交换它们。 Prefabs 是您想要实例化到场景中的游戏对象或层次结构的整个部分的模板。不幸的是,Unity 有一些令人困惑的名称,例如 SO 的 OnEnable Awake,但它们的行为与 MonoBehaviour 不同!
  • 谢谢大家,现在一切都清楚了:)

标签: c# unity3d optimization encoding scriptable-object


【解决方案1】:

ScriptableObjectsMonoBehaviours 更轻量级,因为它们没有要处理的所有GameObject 数据。是的,与System.Object 相比,它们仍然有一些Unity.Object 开销,并且有几个可用的生命周期挂钩,但它们也不会被放入像Update 队列这样的东西中。

您应该将 ScriptableObjects 视为纯数据对象(例如,设置/配置),供您的设计师在 Unity 中进行编辑。

【讨论】:

    猜你喜欢
    • 2019-05-17
    • 2016-03-16
    • 2013-07-27
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多