为什么我们在组件上使用GetComponent <>()?

时间:2019-09-08 09:44:19

标签: c# unity3d collision

bool isRight = collision.GetComponent<Paddle>().isRight;

我有一个名为Paddle.cs的脚本附加到gameObject Paddle上,Paddle.cs包含一个字段“ bool isRight;”。

这部分代码将检测哪个对象与当前对象发生碰撞。

我听不懂这部分

collision.GetComponent<Paddle>().isRight;

这是我的剧本

private void OnTriggerEnter2D(Collider2D collision)
{
    if(collision.tag == "Paddle")
    {
        bool isRight = collision.GetComponent<Paddle>().isRight;

        if (isRight)
        {
            direction.x *= -1;
        }
        if (!isRight)
        {
            direction.x *= -1;
        }
    }
}

2 个答案:

答案 0 :(得分:3)

因为在Unity中都存在:GameObject.GetComponentComponent.GetComponent

Collider2D以及MonoBehaviour继承自Behaviour,而Component继承自Internally

{{3}}基本上是一种快捷方式,而afaik的行为完全相同,因此无论您使用什么都没有真正的区别

collision.GetComponent<XY>()

collision.gameObject.GetComponent<XY>()

这也是您通常只使用

的原因
var someComponent = GetComponent<SomeComponent>();

在您的脚本中,而不必经历

var someComponent = gameObject.GetComponent<SomeComponent>();

通常:由于还有OnCollisionEnter使用类Collision只是为了避免混淆,您应该调用参数Collider2D collider或通常(在文档中)将其命名为{{1 }}。

答案 1 :(得分:0)

我们使用DMGregory作为Component.GetComponent的快捷方式。

它使您可以在脚本所附加的同一GameObject上获取组件,而不必显式引用对象本身。换句话说,简化了代码,

var someComponent = gameObject.GetComponent<SomeComponent>();

var someComponent = GetComponent<SomeComponent>();

这两种方法在功能上是相同的。

您可以在GameObject.GetComponent中找到源代码,尽管据我所知,它只是本机(C ++,特定于平台的)代码的包装。具体来说,它正在呼叫GameObjectBindings::GetComponentFromType