我正在统一创建一个fps游戏,并选择不使用随附的“第一人称控制器”脚本来降低复杂性。相机对象将始终设置为玩家位置并可以旋转。我创建了一个脚本,其中包含以下移动代码:
float v = Input.GetAxis("Vertical");
float h = Input.GetAxis("Horizontal");
Vector2 rotation = new Vector2(
Mathf.Cos(cam.transform.eulerAngles.y * deg2rad), (Mathf.Sin(cam.transform.eulerAngles.y * deg2rad))
);
rb.velocity = (
new Vector3(
(-rotation.x * h * speed) + (rotation.y * v * speed),
rb.velocity.y,
(-rotation.y * h * speed) + (-rotation.x * v * speed)
)
);
当我测试游戏时,沿x轴在两个方向上的移动都是正确的,但是当玩家y旋转变为与x轴对齐以外的东西时,这是不常见的(就像向后移动玩家实际上将它们向前移动,反之亦然)
除了使用三角函数进行运动外,我还可以选择其他方法,因为我已经使用了transform.forward和transform.right,但是它们并没有完全起作用。
答案 0 :(得分:0)
我要说的第一件事是,除非您打算学习三角函数和几何函数,否则您不应该重新发明轮子。正如您所说的,您想要创建FPS游戏,实际上您应该利用他人创建的脚本和预制件来创建游戏。
如果您不想使用内置的FPS Controller脚本,我建议您使用名为“ 3rdPerson + Fly”的免费Asset软件包。乍一看似乎有些复杂,但是您将了解状态和可堆叠的行为/模式,这比从头开始创建要快得多。您还将获得非内置软件包随附的灵活性和开放性。这样,您可以根据需要窥视内部工作原理,也可以仅在内部工作原理之上构建。不要因为NIH(此处未发明)综合症而倒下,而是站在巨人的肩膀上:)
祝你好运!
答案 1 :(得分:0)
您遇到的问题很可能是由于sin和cos无法自行确定他们所处的“象限”的事实所致。例如,30度角与150度角相同罪恶有关。
此视频是对该问题的快速而正确的解释: