【问题标题】:What exactly happens when a MonoBehaviour is created with new?当使用 new 创建 MonoBehaviour 时究竟会发生什么?
【发布时间】:2022-01-20 01:02:05
【问题描述】:

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

奇怪的是,它在一个单元测试组件中,尽管有警告,它仍然可以正常工作。我正在用一些从 MonoBehaviour 继承的类的构造实例填充一个列表,只是为了确保一个函数正在做我想让它做的事情,我收到了这个警告;但测试似乎运行良好。此外,这是一个警告,而不是真正的错误,这可能也是有原因的。

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

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

【问题讨论】:

  • gameObject 等内置属性都不起作用,因为没有对象附加到该对象.. 除此之外可能还有其他不希望的副作用,例如AwakeStart 等都没有被调用
  • 为什么不以允许的方式创建实例 - 即使是为了测试 - 使用例如var component = new GameObject("some name"). AddComponent<YourComponent>(); .. 你不必一开始就考虑会出什么问题
  • @derHugo 我正在研究的实际上是一种排序算法,用于确定项目可以在以后的场景中合理放置的位置,而不会产生交叉;所以我认为在简化的单元测试中担心新的 GameObject 是没有意义的,我只是想确保它们被正确排序。我对此更感兴趣是为了我自己的启迪,但谢谢。
  • 如果一个类实际上没有行为并且没有绑定到GameObject,那么它是MonoBehaviour 是否有意义?为什么不把你的东西变成一个普通的类而不是一个组件呢?
  • 因为它将是一个组件,它是一种行为,并且我正在单元测试以确保我的排序功能有效。我很抱歉,但我真的不知道你在那里错过了什么。 “更改大量代码”的任何部分都不会有利于测试或最终实现。

标签: c# unity3d mono warnings compiler-warnings


【解决方案1】:

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

组件经常改变它们所连接的游戏对象的行为或外观。在某些情况下,组件还相互引用或依赖。例如,RigidBodyCollider 组件倾向于串联使用。

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

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

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

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

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

【讨论】:

  • 所以你的意思是它不太可能编译,更多的是它滥用了代码的用途?这确实有道理。我最终要做的是一种排序算法,用于在我的场景中正确地实例化它们,所以考虑到我在完成测试后将它们删除,我怀疑这会是一个问题。
猜你喜欢
  • 2023-04-01
  • 2023-03-29
  • 2022-11-27
  • 2012-06-06
  • 1970-01-01
  • 2015-12-25
  • 2021-12-23
  • 2015-10-23
  • 2011-01-18
相关资源
最近更新 更多