Unity - 对组件类型和实例的混淆

Unity - confusion over types and instances of components

我在这里有一个具体的问题,但背后是我对数据类型以及 Unity 组件名称、标签和类型的真正含义的困惑。

具体问题是:我希望(在运行时,而不是通过编辑器)能够创建能够检测碰撞并将检测信息传递给的组件其他组件。组件非常简单 - 各种大小的(不可见)立方体,附有 Colliders,并且在每种情况下都设置了 isTrigger。然后在碰撞检测 (OnTriggerEntry(), OnTriggerExit()) 上将碰撞信息传递给其他组件,例如 "hi, X has just collided with number 6".

最初我希望能够在假设它们是事件的情况下挂接这些调用 - 但它们似乎不是事件(MonoBehaviour 覆盖,我假设)。在其他地方阅读它似乎唯一的方法是在创建组件后动态附加脚本(C# class,换句话说)。

因为会有很多这样的组件,都附有相同的脚本 (class),然后我需要设置一些内部 class 变量来告诉它做什么/谁接触碰撞。这就是混乱开始的地方。

在我看来,Unity 设计人员/文档编写人员为了不给人们带来太多代码的负担,倾向于掩盖这些细节,或者至少试图以非软件方式解释它们。可以理解,但对于像我这样从软件方面思考的人来说非常困惑。

我附加的脚本中的 class 将有一个名称(例如“MyCollisionHandler”),但这不是 class 的实例,它只是 class 定义 - 或者类型,如果有人喜欢的话,例如 'class MyCollisionHandler { ...'。但是,必须是这种情况(除非它只包含静态变量和函数)一旦附加到组件,就会有一个它的实例。

所以,简单地说 - 我如何获得对附加到特定碰撞检测对象的一般 class 类型的特定实例的引用?一旦我有了它,我就可以使用方法以我喜欢的方式设置它。如果我使用 FindObjectOfType<MyCollisionHandler>(),那将无济于事,因为它们可能有很多,并且只会 return 第一个找到。好的,我可以改用 FindObjectsOfType<MyCollisionHandler>() 并得到它们的数组 - 但哪个是哪个?

所以,这又回到了我对 Unity 结构的普遍缺乏理解——组件名称、标签等之间的区别——以及它们与 class 定义和实例的关系。概括地说 - 如何获得附加到游戏对象的 class 对象的单个实例?

The class in the script I attach is going to have a name ('MyCollisionHandler', for instance), but that is not an instance of a class

是,实例由GameObject.AddComponent返回。

MyCollisionHandler handler = gameObject.AddComponent<MyCollisionHandler>();
handler.someValue = 42;

稍后您可以使用 GameObject.GetComponent 获取实例,就像您对任何其他组件所做的那样。

如果您没有对 script/component 附加到的游戏对象的引用,或者您不关心哪个游戏对象具有此 script/component,您将使用 FindObjectOfTypeFindObjectsOfType已附加,您只需要 one/all 个。