【发布时间】:2020-10-07 06:34:11
【问题描述】:
我在这里有一个具体的问题,但其背后是我对数据类型以及 Unity 组件名称、标签和类型到底是什么的困惑。
具体问题是:我希望(在运行时,而不是通过编辑器)能够创建可以检测碰撞的组件并将检测信息传递给其他组件。组件非常简单 - 各种尺寸的(不可见)立方体,附有Colliders,并在每种情况下设置isTrigger。然后在碰撞检测(OnTriggerEntry(),OnTriggerExit())上将碰撞信息传递给其他组件,例如“嗨,X 刚刚与数字 6 发生碰撞”。
最初我希望能够在假设它们是事件的情况下挂钩这些调用 - 但似乎它们不是事件(MonoBehaviour 覆盖,我假设)。在其他地方阅读,似乎唯一的方法是在创建组件后动态附加脚本(换句话说,一个 C# 类)。
由于会有许多这样的组件,它们都附加了相同的脚本(类),所以我需要设置一些内部类变量来告诉它在碰撞时要做什么/联系谁。这就是混乱开始的地方。
在我看来,Unity 设计人员/文档编制人员为了不给人们带来太多代码负担,往往会掩盖这些细节,或者至少试图以非软件方式解释它们。可以理解,但对于像我这样从软件角度思考的人来说非常困惑。
我附加的脚本中的类将有一个名称(例如,“MyCollisionHandler”),但这不是类的实例,它只是类定义 - 或类型,如果喜欢的话,例如'class MyCollisionHandler { ...'。但是,一旦附加到组件上,就必须是这种情况(除非它只包含静态变量和函数),即存在它的实例。
所以,简单地说 - 我如何获得对附加到特定碰撞检测对象的通用类类型的特定实例的引用?一旦我有了它,我就可以使用方法以任何我喜欢的方式设置它。如果我使用FindObjectOfType<MyCollisionHandler>(),那将无济于事,因为可能有很多它们,它只会返回第一个找到的。好的,我可以改用 FindObjectsOfType<MyCollisionHandler>() 并获取它们的数组 - 但哪个是哪个?
所以,这又回到了我对 Unity 结构的普遍缺乏理解——组件名称、标签等之间的区别——以及它们与类定义和实例的关系。概括地说 - 如何获得附加到游戏对象的类对象的各个实例?
【问题讨论】:
标签: c# unity3d reference gameobject