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,您将使用 FindObjectOfType
和 FindObjectsOfType
已附加,您只需要 one/all 个。
我在这里有一个具体的问题,但背后是我对数据类型以及 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,您将使用 FindObjectOfType
和 FindObjectsOfType
已附加,您只需要 one/all 个。