首页 > 解决方案 > 为什么在使用游戏内对象而不是游戏对象时通常会传递变换?

问题描述

我在学习 Unity 基础知识方面做得很好,但想确定我对组件和拥有它们的对象之间的关系的理解。在我一直在观看的教程中,在处理代码中提取的对象时,通常会使用或传递 Transform 组件。例如:

void Explode ()
{
    Collider[] colliders = Physics.OverlapSphere(transform.position, explosionRadius);
    foreach (Collider collider in colliders)
    {
        if (collider.tag == "Enemy")
        {
            Damage(collider.transform);
        }
    }
}

它通过它找到的对撞机上的变换调用“损坏”:

void Damage (Transform enemy)
{
    Enemy e = enemy.GetComponent<Enemy>();
    if (e != null)
    {
        e.TakeDamage(damage);
    }
}

看看这个,很明显它正在拉取在所有游戏对象上找到的组件,然后使用“GetComponent”按名称拉取另一个组件实例,因为“Enemy”组件不会有自己的方法。为什么不直接传递 collider.gameObject 呢?我试过这个(在改变伤害以期望一个游戏对象之后),它工作得很好。

这对我来说似乎更直观,但我见过的所有教程都使用转换组件。有谁知道为什么会这样?这将帮助我加深对 Unity 如何构建其代码的理解。

标签: c#unity3d

解决方案


我不确定你在学习什么教程,但是当我第一次开始使用 Unity 时,我遵循的那些教程使用了 GameObject 而不是 Transform。

我同意使用 GameObject 更直观。Transform 是ComponentGameObject 的一部分或一部分,但由于它是强制性的,因此它将始终存在,因此 public 字段.transform。但由于从技术上讲,GameObject 是其所有组件的持有者,因此将其作为参数传递是最合乎逻辑的、架构明智的。

归根结底,您的示例几乎没有什么不同,因为您可以在 Transform 和 GameObject 上调用许多相同的方法。

TLDR:

使用任何你认为最有意义的东西。


推荐阅读