【发布时间】:2019-08-15 02:52:20
【问题描述】:
谁能告诉我我的方法的优点/缺点?
我有状态效果,作为脚本对象的技能,具有独特的字段,对于每个游戏中的角色都不同(如持续时间、伤害、施法时间,这都取决于个人角色的统计数据)。 此外,我在其中拥有大部分逻辑,即仅通过每个对象的 StatusController/SkillCastingController 中的事件进行控制。 所以我想出了使用: Object.Instantiate(分配的共享 ScriptableObject 实例) 为每个人提供单独的实例。
Object.Instantiate(ScriptableObject) 的内存开销大吗? 因为在运行时会大量使用这种方式(在运行时应用状态效果 = 使用 Object.Instantiate)。
我只是希望,以这种方式使用 ScriptableObjects 就像它们是简单的类一样工作,不同之处仅在于能够在编辑器中创建和编辑它们。 如果这个假设是真的—— Object.Instantiate(在检查器 StatusEffect/Skill ScriptableObject 中分配)与使用复制构造函数创建简单类的新实例相同(new StatusEffect(statuseffects[0]/Skills[0]))。如果这是真的 - 不应该有很多内存使用,对吧?
来自专业人士的引述,有什么想法吗?:
SO 只是一个为在 Unity 序列化中具有方便含义的数据而设计的类。如果您正在创建 SO 的运行时实例,这是确保运行时只读的常见模式,那么您只是在复制根 ScriptableObject 的内存。因为 Object.Instantiate 不会隐式复制任何子资产,如果它们被根引用,则克隆将保持对原始 Scriptable Object 子资产的引用。除非这些 ScriptableObjects 分配大量内存,否则重复的不利影响应该是微不足道的。
【问题讨论】:
-
通常 ScriptableObjects 在编辑模式下创建更有意义......在运行时......你不能简单地使用任何简单的类来代替
ScriptableObject吗? This thread 可能很有趣 -
哇,感谢大家的快速响应。这很不幸,实际上,不得不做更多的分离,我几乎认为以这种方式使用 SO 没有意义..
-
而 Object.Instantiate == GameObject.Instantiate?在内存使用方面。
-
ScriptableObject和GameObject都继承自Object。然而,正如所说的使用实例化游戏对象将其添加到场景中.. 在这种情况下,背景中可能会发生更多的事情,但这只是一个疯狂的猜测 -
SO 只是一个为在 Unity 序列化中具有方便含义的数据而设计的类。如果您正在创建 SO 的运行时实例,这是确保运行时只读的常见模式,那么您只是在复制根 ScriptableObject 的内存。因为 Object.Instantiate 不会隐式复制任何子资产,如果它们被根引用,则克隆将保持对原始 Scriptable Object 子资产的引用。除非这些 ScriptableObjects 分配大量内存,否则重复的不利影响应该是微不足道的。
标签: c# unity3d scriptable-object