Unity3d中摄像机特定区域内物体的碰撞检测

Unity3d中摄像机特定区域内物体的碰撞检测,unity3d,Unity3d,我正在创建一个第三人称动作游戏,玩家是一架直升机,他可以在移动时射击其他物体。问题是我试图找到在摄像机中心一个圆圈内的敌方物体,我需要跟踪并拍摄它们 光线投射没有帮助,因为我需要一个更厚的光线投射,所以我尝试了spherecast和capsulecast。 我有一个GUI元素,让玩家知道他可以在哪里射击。当使用Spherecast或Capsulecast时,当敌人靠近时,它会起作用,但当敌人远远落后时,我猜Spherecast在沿z移动时会变小,并且大多数时候不会击中目标 if (Physics

我正在创建一个第三人称动作游戏,玩家是一架直升机,他可以在移动时射击其他物体。问题是我试图找到在摄像机中心一个圆圈内的敌方物体,我需要跟踪并拍摄它们

光线投射没有帮助,因为我需要一个更厚的光线投射,所以我尝试了spherecast和capsulecast。 我有一个GUI元素,让玩家知道他可以在哪里射击。当使用Spherecast或Capsulecast时,当敌人靠近时,它会起作用,但当敌人远远落后时,我猜Spherecast在沿z移动时会变小,并且大多数时候不会击中目标

if (Physics.SphereCast (startPoint, 1f, transform.forward, out hit)) {
            if (hit.collider.CompareTag ("Shootable") ){
                Debug.Log(hit.collider.name);
                Destroy(hit.collider.gameObject);
            }
        }

我在相机上看到了raycast,所以我想知道是否有像circlecast这样的东西适合这个。如果没有,我如何继续


非常感谢您的帮助。

如果您想检测敌人是否位于摄像机前方的锥形区域内,使用
SphereCast
RayCast
将无法满足您的需要

相反,你可以考虑检查敌人相对位置和摄像机前向矢量之间的夹角,看看它是否低于某个特定值,因此在锥内。

对于60度视场,假设您将您的敌人
变换
组件存储在阵列/列表中,您的代码可能如下所示:

foreach (Transform enemy in enemies){
    if (Vector3.Angle(transform.forward, enemy.position - transform.position) < 30){
        Destroy(enemy.gameObject);
    }
}
foreach(在敌人中转换敌人){
if(矢量3.角度(变换.前进,敌人.位置-变换.位置)<30){
摧毁(敌人。游戏对象);
}
}

希望这有帮助!如果你有任何问题,请告诉我。(答案改编自。)

如果您希望在相机视口的锥形区域内检测敌人,而不是使用球体/光线投射,则可以尝试检查敌人位置相对于相机前向向量的角度。(摘自)谢谢你的回复。为了做到这一点,我们必须循环通过所有可见的敌人在相机。如果我在场景中有很多敌人…这不会影响性能吗?因为我必须在updateHm中运行它,那么预期/最大敌人数量是多少?也许仍然值得一试,看看你对性能的担忧是否正确。我实际上是为android开发的,所以我很关心性能。我想敌人可能有30个左右。你的建议仍然非常有用,我会尝试一下,看看性能如何。非常感谢你!!好吧如果我把我的评论扩展成一个答案,可以吗?(因此,一旦您测试了建议,您就可以接受或提供反馈。)谢谢。我没有经历任何性能的急剧下降,所以我想我会坚持这种方法。太好了,很高兴我能帮上忙。