c# - 为什么在使用游戏内对象而不是游戏对象时通常会传递变换?
问题描述
我在学习 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 如何构建其代码的理解。
解决方案
我不确定你在学习什么教程,但是当我第一次开始使用 Unity 时,我遵循的那些教程使用了 GameObject 而不是 Transform。
我同意使用 GameObject 更直观。Transform 是Component
GameObject 的一部分或一部分,但由于它是强制性的,因此它将始终存在,因此 public 字段.transform
。但由于从技术上讲,GameObject 是其所有组件的持有者,因此将其作为参数传递是最合乎逻辑的、架构明智的。
归根结底,您的示例几乎没有什么不同,因为您可以在 Transform 和 GameObject 上调用许多相同的方法。
TLDR:
使用任何你认为最有意义的东西。
推荐阅读
- c# - 如何从分隔字符串列表中获取不同的列表
- angular - 以角度使用 Typescript 文件中的 css 类或变量
- c++ - 在 C++ 中正确设计具有许多常量的项目
- xml - SOAP 封送处理的 Spring 5 Web 服务客户端问题
- php - 在 php 中执行 bash if else 命令(bash vs php)
- gams-math - 如何显示一些二维参数?
- php - php fwrite到xls文件空白单元格不显示
- django - 配置 caddy、S3 和 CloudFront 的正确方法
- c# - 处理转换
- c# - Web 表单、AJAX、BackgroundWorker