实例化ScriptableObjects

时间:2019-08-14 08:29:53

标签: c# unity3d scriptable-object

谁能告诉我我的方法的优缺点?

我具有状态效果,可脚本编写对象的技能,具有独特的字段,对于每个游戏角色(例如持续时间,伤害,施法时间,都取决于各个角色统计)有所不同。 此外,我在其中拥有大多数逻辑,即仅通过每个对象的StatusController / SkillCastingController中的事件进行控制。 所以我想出了使用:     Object.Instantiate(分配的共享ScriptableObject实例)  为每个人拥有单独的实例。

Object.Instantiate(ScriptableObject)是否需要很大的内存成本? 因为它将在运行时中大量使用(在运行时中应用状态效果=使用Object.Instantiate)。

我只是希望,以这种方式使用ScriptableObjects就像它们是简单的类一样,不同之处仅在于能够在编辑器中创建和编辑它们。 如果这个假设是正确的- Object.Instantiate(在检查器StatusEffect / Skill ScriptableObject中分配)与使用复制构造函数创建新的简单类实例(新StatusEffect(statuseffects [0] / Skills [0]))相同。如果是这样-不应占用大量内存,对吧?

有专业人士的话吗?

SO只是针对数据的类,这些数据在Unity的序列化中具有方便的含义。如果要创建SO的运行时实例(这是确保运行时只读的一种常见模式),则只需复制根ScriptableObject的内存即可。因为Object.Instantiate不会隐式复制任何子资产,如果子资产被根引用,则克隆将维护对原始可编写脚本对象的子资产的引用。除非这些ScriptableObjects分配了大量的内存,否则重复的负面影响应该很小。

1 个答案:

答案 0 :(得分:0)

SO-可编写脚本的对象。

创建SO比创建类要消耗更多的内存,最通常的情况是,如果您在播放模式下实例化它们,则简单地实例化一个类要好得多,因此您省去了大部分SO开销。

通常,SO最适合在播放之前以编辑器模式创建。

要更深入地了解SO,并找到SO与GameObject之间的最佳策略,您还可以阅读this question