当用 new 创建 MonoBehaviour 时究竟会发生什么?

What exactly happens when a MonoBehaviour is created with new?

我知道这是“不允许的”;我这样做是偶然的,它将彻底从我的最终版本中删除。显然,这条规则有充分的理由。

奇怪的是,它在一个单元测试组件中,尽管有警告,它仍然可以完美运行。我正在用继承自 MonoBehaviour 的 class 的几个构造实例填充一个列表,只是为了确保一个函数正在做我想要它做的事情,我收到了这个警告;但测试似乎 运行 没问题。此外,这是一个警告,而不是真正的错误,这可能也是有原因的。

出于好奇,由于我的理解显然不完整,有人可以解释一下,并且如果可能的话,提供 link 文档解释,为什么 Unity 不允许它显然非常有能力的行为的?为什么它禁止这样做,如果忽略警告,会有什么缺点?

感谢您完成我对它的理解。

Unity 具有基于组件的架构。存在于场景中的任何对象都由 GameObject 表示,其中附加了一个或多个 Component 个对象。

组件经常更改它们所附加到的游戏对象的行为或外观。在某些情况下,组件还相互引用或依赖。例如,RigidBodyCollider 组件往往串联使用。

MonoBehaviour 脚本也源自 Component class。您可以使用 new 创建一个行为对象,但它不会附加到任何游戏对象,因此不会正确存在于场景中。这很可能会导致错误:

  • 内置事件可能无法始终如一地工作。例如,AwakeStartUpdateOnCollisionEnter
  • 内置引用根本不起作用。例如,gameObjecttransformAddComponentGetComponent 函数族。
  • 其他组件以标准方式与此组件交互是不安全的。
  • 场景转换可能会使问题复杂化,因为您的孤立脚本不会附加到场景中的任何内容。

不过,您还有一些其他选择。

您可以创建一个新的游戏对象,然后将您的脚本附加到它上面。这是管理整个场景(或跨多个场景)的游戏状态的脚本的常见工作流程。这可能属于 .

如果您需要这些 class 可以在场景外使用,您也可以创建不是从 MonoBehaviour 派生的 class 。