c# - 使用任何形状碰撞器测试一个游戏对象是否在另一个之上
问题描述
本质上,我有一个函数旨在测试一个对象是否完全位于另一个对象之上,同时考虑对撞机边界:
public static bool isAbove(GameObject a, GameObject b)
{
Collider2D colliderA = a.GetComponent<Collider2D>();
Collider2D colliderB = b.GetComponent<Collider2D>();
return a.transform.position.y - (colliderA.bounds.size.y * 0.5) >= b.transform.position.y + (colliderB.bounds.size.y * 0.5);
}
当我最初写这篇文章时,我无意使用框以外的边界形状,所以算法有效。现在,我在其中一个对象上使用圆形碰撞器,在另一个对象上使用盒子碰撞器,这使得算法不一致,因为它仍然将圆形视为盒子。我真的希望这适用于任何组合的任何形状对撞机。
我认为我可以在第一个对象正下方指定一个点,然后在该 x 位置找到最大点,但我无法在任何地方找到此选项,我仍然不确定这是否是我应该寻找的解决方案.
解决方案
正如我在评论中提到的,Collision2D
有很多关于两个物体碰撞的有用信息。专门针对您的用例,我还将研究Vector3.Dot
. 简而言之,使用Vector3(up, otherObject
会给你一个结果来确定两个对象是否相互重叠。
为了更清楚一点,可以返回三种可能的情况,Vector3.Dot
它们是
- 点为 0 - 两个对象彼此完全垂直
- 点 <0 - 两个对象之间的角度大于 90º
- Dot is >0 - 两个对象之间的角度小于 90º
对于您的特定用例,我将计算上向量和到另一个目标的向量之间的点积。如果结果大于 0,则另一个目标在您当前对象的上方。您可以仅在对象主动碰撞时检查此数据,也可以每帧检查一次。这取决于您要检查的对象数量。
推荐阅读
- django - “curl: (56) Recv failure: Connection reset by peer” 在“curl --unix-socket /run/gunicorn.sock localhost”之后
- python - 在自动售货机中添加库存添加器(询问用户是否想将一些库存添加到当前缺货的商品中)
- python - “系列”对象没有属性“调整大小”/“拆分”
- pandas - 用最新的熊猫版本保存泡菜文件并用熊猫0.23.4加载
- python - Mac 在启动时使用 plist LaunchAgent 运行 python 脚本 – 如何禁用?
- swift - 如何在 Xcode 中安全地使用配置文件和环境
- amazon-web-services - 来自 EventBridge 模式的 Zappa 触发器 lambda
- spring-boot - 如何将 Spring Boot HealthIndicator 添加到 Imap 接收器 IntegrationFlow
- exchange-server - 邮箱隔离的 Exchange 服务器
- python - 除了用 coma 拆分以存储在数据库中之外,还有其他方法吗?