【问题标题】:Instantiating ScriptableObjects实例化 ScriptableObjects
【发布时间】: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?在内存使用方面。
  • ScriptableObjectGameObject 都继承自 Object。然而,正如所说的使用实例化游戏对象将其添加到场景中.. 在这种情况下,背景中可能会发生更多的事情,但这只是一个疯狂的猜测
  • SO 只是一个为在 Unity 序列化中具有方便含义的数据而设计的类。如果您正在创建 SO 的运行时实例,这是确保运行时只读的常见模式,那么您只是在复制根 ScriptableObject 的内存。因为 Object.Instantiate 不会隐式复制任何子资产,如果它们被根引用,则克隆将保持对原始 Scriptable Object 子资产的引用。除非这些 ScriptableObjects 分配大量内存,否则重复的不利影响应该是微不足道的。

标签: c# unity3d scriptable-object


【解决方案1】:

SO - 可编写脚本的对象。

创建 SO 比创建类消耗更多的内存,而且通常情况下,如果您在播放模式下实例化它们,则简单地实例化一个类要好得多,这样您就可以消除大部分 SO 开销。

一般来说,SO 最适合在播放前在编辑器模式下创建。

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

【讨论】:

  • 而 Object.Instantiate == GameObject.Instantiate?在内存使用方面。
  • GameObject.Instantiate 不应用于 SO。就逻辑而言,如果将它们应用于游戏对象,它们会做同样的事情。但是 Object.Instantiate 返回一个对象,因此之后您可能需要强制转换。 Object.Instantiate - Manualprefab instatiation - manual 中的更多信息。
  • 是的,我知道,我的意思是GameObject.Instantiate很昂贵,我想也许,Object.Instantiateay几乎等于new Object()
  • 如果您使用 new Object(),您将无法正确初始化 GameObject。它需要被实例化(或 Object.Instantiate 做同样的事情)。
  • Thread 是关于在 SO 上使用 Object.Instantiane 以及它的性能与 c# 复制构造函数有何不同
猜你喜欢
  • 1970-01-01
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
  • 1970-01-01
  • 2011-06-10
  • 2014-10-05
相关资源
最近更新 更多