当用 new 创建 MonoBehaviour 时究竟会发生什么?
What exactly happens when a MonoBehaviour is created with new?
我知道这是“不允许的”;我这样做是偶然的,它将彻底从我的最终版本中删除。显然,这条规则有充分的理由。
奇怪的是,它在一个单元测试组件中,尽管有警告,它仍然可以完美运行。我正在用继承自 MonoBehaviour 的 class 的几个构造实例填充一个列表,只是为了确保一个函数正在做我想要它做的事情,我收到了这个警告;但测试似乎 运行 没问题。此外,这是一个警告,而不是真正的错误,这可能也是有原因的。
出于好奇,由于我的理解显然不完整,有人可以解释一下,并且如果可能的话,提供 link 文档解释,为什么 Unity 不允许它显然非常有能力的行为的?为什么它禁止这样做,如果忽略警告,会有什么缺点?
感谢您完成我对它的理解。
Unity 具有基于组件的架构。存在于场景中的任何对象都由 GameObject
表示,其中附加了一个或多个 Component
个对象。
组件经常更改它们所附加到的游戏对象的行为或外观。在某些情况下,组件还相互引用或依赖。例如,RigidBody
和 Collider
组件往往串联使用。
MonoBehaviour
脚本也源自 Component
class。您可以使用 new
创建一个行为对象,但它不会附加到任何游戏对象,因此不会正确存在于场景中。这很可能会导致错误:
- 内置事件可能无法始终如一地工作。例如,
Awake
、Start
、Update
或 OnCollisionEnter
。
- 内置引用根本不起作用。例如,
gameObject
、transform
或 AddComponent
和 GetComponent
函数族。
- 其他组件以标准方式与此组件交互是不安全的。
- 场景转换可能会使问题复杂化,因为您的孤立脚本不会附加到场景中的任何内容。
不过,您还有一些其他选择。
您可以创建一个新的游戏对象,然后将您的脚本附加到它上面。这是管理整个场景(或跨多个场景)的游戏状态的脚本的常见工作流程。这可能属于 .
如果您需要这些 class 可以在场景外使用,您也可以创建不是从 MonoBehaviour
派生的 class 。
我知道这是“不允许的”;我这样做是偶然的,它将彻底从我的最终版本中删除。显然,这条规则有充分的理由。
奇怪的是,它在一个单元测试组件中,尽管有警告,它仍然可以完美运行。我正在用继承自 MonoBehaviour 的 class 的几个构造实例填充一个列表,只是为了确保一个函数正在做我想要它做的事情,我收到了这个警告;但测试似乎 运行 没问题。此外,这是一个警告,而不是真正的错误,这可能也是有原因的。
出于好奇,由于我的理解显然不完整,有人可以解释一下,并且如果可能的话,提供 link 文档解释,为什么 Unity 不允许它显然非常有能力的行为的?为什么它禁止这样做,如果忽略警告,会有什么缺点?
感谢您完成我对它的理解。
Unity 具有基于组件的架构。存在于场景中的任何对象都由 GameObject
表示,其中附加了一个或多个 Component
个对象。
组件经常更改它们所附加到的游戏对象的行为或外观。在某些情况下,组件还相互引用或依赖。例如,RigidBody
和 Collider
组件往往串联使用。
MonoBehaviour
脚本也源自 Component
class。您可以使用 new
创建一个行为对象,但它不会附加到任何游戏对象,因此不会正确存在于场景中。这很可能会导致错误:
- 内置事件可能无法始终如一地工作。例如,
Awake
、Start
、Update
或OnCollisionEnter
。 - 内置引用根本不起作用。例如,
gameObject
、transform
或AddComponent
和GetComponent
函数族。 - 其他组件以标准方式与此组件交互是不安全的。
- 场景转换可能会使问题复杂化,因为您的孤立脚本不会附加到场景中的任何内容。
不过,您还有一些其他选择。
您可以创建一个新的游戏对象,然后将您的脚本附加到它上面。这是管理整个场景(或跨多个场景)的游戏状态的脚本的常见工作流程。这可能属于
如果您需要这些 class 可以在场景外使用,您也可以创建不是从 MonoBehaviour
派生的 class 。