我正在制作一款跑酷游戏,遇到了一个问题。游戏中有一个墙跑机制,如果你在墙上跑,你的玩家旋转方向会被锁定在墙的平面上。只要你撞到墙的左侧(西侧),这个机制就能完美运行。但如果撞到墙的右侧(东侧),玩家就会被翻转到错误的方向。
private void WallStick()
{
if (leftWall) wallNormal = leftWallHit.normal.y;
else if (rightWall) wallNormal = rightWallHit.normal.y;
if (leftWall) playerMovement.rotationScript.yRotation = wallNormal + 90f;
else if (rightWall) playerMovement.rotationScript.yRotation = wallNormal - 90f;
}
leftWall 和 rightWall 是布尔值,用于指示玩家朝向墙壁的方向。命中是射线投射。其他所有内容似乎都一目了然,如有疑问,请提出。这段代码完美地运行,但前提是玩家在墙的西侧奔跑。
我可以将每面墙分成两块,并分配一个 layerMask 来区分光线投射击中哪一侧,但这看起来非常笨重,而且会让我重新设计整个世界。
有什么想法吗?
在您的代码中:
wallNormal = leftWallHit.normal.y;
你错误地使用了.y
(墙体法线的垂直分量)。墙体方向应该使用水平面来确定,即墙体法线的X
和分量,而不是Z
Y.
在 3D 世界中,墙体法线指向外部,与表面垂直。Y 轴指向上下,因此无法帮助确定水平方向。
wallNormal 现在是完全正常的
vector (Vector3)
,而不仅仅是y.
Vector3.Cross(normal, Vector3.up)
给出你在墙上奔跑时应该面对的方向。Mathf.Atan2(x, z)
正确计算周围 360° 的角度。Mathf.Rad2Deg
将弧度转换为度数,这通常是设置旋转的方式。为什么你最初的翻转问题会发生?在西边,你的 hack (+90/-90) 运气好地“有点”修正了方向。在东边,hack 却把你向后翻转了,因为数学计算忽略了 X 和 Z 方向。
问题出在我巧妙地将正负 90 度旋转,以获得向前的墙方向,而墙的另一侧实际上是向后的。感谢 Sanjay Nakate 提供的解决方案。以下是更新后的代码,供大家参考: