对于上下文:我已经完成了在Unity中制作壁挂式系统的90%的工作,并且我需要帮助找到2个Vector3,可以用于检查并为玩家增加速度以使它们移动正确的方向。
更具体地说,我在带有墙的接触点的左右两侧获得两个Vector3,然后获取右点与玩家先前位置之间的距离以及左点与玩家先前位置之间的距离位置。距播放器更远的那个点是我们的行进方向,如果您将该点和-接触点作为起点并对其进行归一化,该函数将返回Vector3以用于向播放器增加速度。
当前,我正在使用此功能为我执行此操作(命中点是播放器与墙壁之间的接触点):
Vector3 CalculateWallRunDirection(Vector3 hit, Transform wall)
{
Vector3 rightPos = hit + wall.forward;
Vector3 leftPos = hit + (wall.forward * -1);
float rightDis = Vector3.Distance(rightPos, prevPlayerPos);
float leftDis = Vector3.Distance(leftPos, prevPlayerPos);
if (rightDis < leftDis)
{
return Vector3.Normalize(leftPos - hit);
}
else
{
return Vector3.Normalize(rightPos - hit);
}
}
这在工作时效果很好...但是问题是,因为如果您尝试在墙的正面或背面进行墙穿行,我正在使用墙的Transform.forward来确定这些点的位置。物体会扔到墙壁上而不是沿着墙壁扔进去,玩家会陷入困境。
TL; DR:我需要另一种确定两个Vector3的方法,而不是使用transform.forward +原始Vector3。从顶向下视图,问题可以显示为this。 A是玩家,B是与墙的接触点。查找C和D:
请解释您的答案,我的数学不是太好。
答案 0 :(得分:1)
您实际上是在尝试重新创建Vector3.ProjectOnPlane()。您可能想改用它。
例如
Vector3 A = Vector3.ProjectOnPlane(B, C);
// A is the new velocity vector parallel to the wall
// B is the old velocity of the player at the point of impact
// C is the normal of the plane of impact
您可以在OnCollisionEnter
事件中轻松找到C,只需获取接触点的法线即可。
注释B不需要进行规范化,但是如果是,则A也将是规范化的Vector3。