【问题标题】:Fixing diagonal movement固定对角线运动
【发布时间】:2021-04-28 00:22:32
【问题描述】:

我需要帮助来统一我的对角线运动。它对角线的速度比水平或垂直的快。

我正在开发一款等距 3D 游戏。我正在使用 Unity 2019.4

这是我的代码:

if (canMove)
{
 Vector3 direction = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
 Vector3 rightMovement = right * moveSpeed * Time.deltaTime * Input.GetAxis("Horizontal");
 Vector3 upMovement = forward.normalized * moveSpeed * Time.deltaTime * Input.GetAxis("Vertical");

 Vector3 heading = Vector3.Normalize(rightMovement + upMovement);

 transform.forward = heading;
 transform.position += rightMovement;
 transform.position += upMovement;
}

【问题讨论】:

  • 我对 Unity 不是很熟悉,但只是查看您的代码,我发现您将 forward 标准化以计算 upMovement 而不是 rightrightMovement
  • 您只需要考虑到对角线移动大约是.77 对于您移动的每个水平和垂直方向。像素是正方形的,因此这会产生对角线移动速度更快的外观,因为像素对角线的长度比水平或垂直方向的长。我不知道为什么你有这么多变量。我认为您只需将方向添加到您的位置即可。
  • Vector3.Normalize(rightMovement + upMovement).normalized 你的报酬是按你标准化向量的次数来计算的吗?
  • 盲人。 Lmaoo。我什至没有意识到我已经把它标准化了两次。

标签: c# unity3d


【解决方案1】:

您的问题中的第一个主要线索应该是您计算了一个 direction 向量,但随后从未实际使用它。这不会那么糟糕(浪费但不是世界末日),除了另一个主要问题是您计算 rightMovementupMovement 的值不同。

在我看来,代码可以大大简化,有两个好处:提高效率,更容易正确。如果没有minimal, reproducible example,就不可能确定正确的代码是什么,但我希望这适用于您的情况:

if (canMove)
{
    transform.forward = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")).normalized;
    transform.position += transform.forward * moveSpeed * Time.deltaTime;
}

重要提示:代码并不总是通过添加更多代码而变得更好。在调试过程中尝试性地添加一些语句以进行尝试是可以的,但是继续添加越来越多的语句通常是一个坏主意。如果某些事情不起作用,请查看已经存在的陈述并找出如何使它们变得更好(即使其发挥作用),而不是试图用更多的陈述来解决它们的任何问题。

【讨论】:

  • 没有帮助我。它只是停止了运动。
  • @Santeri 抱歉,小错字(这是没有 MCVE 的问题......没有实用的方法来测试发布的代码)。我省略了用于更改 position 向量的关键 + 运算符。我已经修复了上面的代码示例。
  • 仍未标准化。
  • 对不起,不知道你的意思。 forward 向量是标准化的,但运动本身必然会按时间和速度进行缩放。如果以上内容不能解决您的问题,请考虑改进问题,使其包含所有相关细节。当无法真正调试他人的代码时(即通过运行它并查看什么不起作用),调试他人的代码是很困难的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多