Unity中的抓钩射线投射方向问题

Grappling hook ray cast direction problems in Unity

大家好,我目前正在开发一个第三人称游戏,我想从玩家那里发射抓钩到一个偏离摄像机中心的点。

我有一个屏幕叠加层 canvas,其中包含 Ui 个十字准线图像。当按住左 shift 键时,十字准线会沿着 x 轴从中心向外移动,一旦 shift 被释放,十字准线就会 return 移动到中心,有点像游戏中的十字准线扩散,只是我想通过 shift 键触发扩散。这些十字准线旨在指示抓钩着陆锚的位置,源自玩家并击中十字准线正前方的任何物体。 (想象一下对 titan ODM 装备的攻击,如果你已经看过的话)。我正在寻找一种方法,当它们偏离中心时,从玩家投射到这些十字准线的前方。

到目前为止,我已经设置并运行了擒抱系统,但是当我使用十字准线传播时,方向参数出现问题。它分离得很好,但是钩子相对于十字准线的位置显然不对,因为我现在正在尝试使用角度计算而不是这些标线的前方。

我基本上想知道是否可以使用这些屏幕覆盖 UI 图像向前投射,或者是否有更好的方法来完成同样的事情。我有疑问,因为它们是屏幕叠加层,所以我想它们的坐标不会在它们出现时附加到相机上。

在此先感谢您的帮助。

我要做的是确定标线在屏幕上的位置,然后(如 Aybe 所建议的那样)使用 ScreenPointToRayViewportToRay(取决于是否更容易获得像素位置或每个十字线的分数位置)到 Physics.Raycast 从相机进入场景的光线,以找到光线碰撞的位置。在这一点上,你有两个世界位置玩家似乎想射钩子。:

Vector3 hookTarget1;
Vector3 hookTarget2;

所以,现在您实际上必须发射钩子 - 但正如您所知,钩子不是从相机发射的,而是从玩家发射的,它们可能会偏移一点。让我们调用起始点(可能具有相同的值):

Vector3 hookOrigin1;
Vector3 hookOrigin2;

因此,您可以创建源自钩子原点并指向目标的光线:

Ray hookShot1 = new Ray(hookOrigin1, hookTarget1 - hookOrigin1);
Ray hookShot2 = new Ray(hookOrigin2, hookTarget2 - hookOrigin2);

使用这些光线,如果您愿意,您可以再做一次 Physics.Raycast,以确认玩家和目标位置之间没有任何树木或其他障碍物 - 如果有,这可能是锚实际应该下沉的地方:

Vector3 anchorPoint1;
Vector3 anchorPoint2;

这些射线的原点和这些锚点之间的线段适用于渲染电缆、计算如何移动玩家的物理特性,以及检查与可能导致锚点释放的世界几何体的碰撞.