我想从BoxCollider绑定的矢量(原点)投射光线/球体,并限制其maxDistance,以便它不会超过绑定区域并仅使用layerMask命中此边界内的对象。如何实现这一目标?
另外,如果我把它作为sphereCast投射并且多个物体被击中,我怎么才能得到最接近sphereCast中心的物体?我已经搜索了很长一段时间,但无法在那里找到它。
编辑#1
虽然我感谢你之前的答案,但我更新了这个编辑,以便更好地阐述我真正想要实现的目标。
当我问你最初的问题时,对我来说仍然含糊不清,如何解决丢失的rayCast / sphereCast,我不想要哪一个最终会错过,具体取决于target / sphereCast radius的大小。
最终目标是使用方向输入来选择游戏对象并且永不错过。我已经有了这个边界框收集List中的gameObjects变换,如果我输入说gamepad模拟棒给出标准化方向,我想选择那个大致方向的那个。但是,我知道如果我只在rayCast / sphereCast中执行此操作,我必须为每个输入执行多次转换,以确保不会错过我认为不必要的代码块的目标。理想的是:如果标准化输入目录:vector2(1,0,0),则选择来自原点的2 O'时钟位置的紫色目标。
答案 0 :(得分:0)
要获得距离中心最近的地方,你可以获得命中对撞机的变换并循环通过它们从中心减去位置。然后挑出最小幅度。您可以使用幅度平方来提高性能。
至于只在箱子对撞机内拾取东西,一种方法是使用半径等于盒子最大尺寸的球形。这也会到达盒子外面,但保证盒子里面的所有东西都可以。然后你可以使用传统的碰撞检查手动检查它们是否在盒子对撞机内。
答案 1 :(得分:0)
1:
我建议,看看Physics.OverlapBox
因为它适合您的情况:
找到触摸或在给定框内的所有碰撞器。
你可以将你的盒子对撞机的中心和大小作为参数传递,这将返回一组重叠(命中)碰撞器,你可以使用第一个。
2:
如果您仍想使用SphereCast,它会填充RaycastHit
对象,该对象具有collider
属性中的第一个对象
答案 2 :(得分:0)
如果你有一个Collider作为你的Bounds,你只需使用Collider.bounds.extents
或Collider.bounds.size
来获得对手的大小然后(根据你的起始位置)设置你的Spherecast的最大尺寸。例如。如果您的SphereCast在多维数据集的中间开始,则只需使用Collider.bounds.extents
中的一个值作为最大大小。
关于第二个问题:
Physics.SphereCastAll
将返回RaycastHits的数组。它们具有属性distance
,它返回从光线投射原点到碰撞对手点的距离。您可以简单地遍历数组并使用距离最小的对象来获取最近的对象。
另外我认为Physics.SphereCast
应该返回被击中的第一个对象(因此也就是最近的对象),如果这是您想要的全部内容。但是我现在还不确定它是否总是像你想要的那样,但它可能值得测试,因为它对你的表现比使用Physics.SphereCastAll
方法更好。