按下多个键时如何避免运动速度堆积?


17

我已经开始了一个不需要鼠标的新游戏,因此将动作保持在键盘上。我尝试合并8个方向;上,左,右,右上等等。但是,当我按下多个箭头键时,移动速度会累积起来(http://gfycat.com/CircularBewitchedBarebirdbat)。我该如何应对?

这是我的代码的相关部分:

var speed : int = 5;

function Update () {
    if (Input.GetKey(KeyCode.UpArrow)) {
        transform.Translate(Vector3.forward * speed * Time.deltaTime);
    } else if (Input.GetKey(KeyCode.UpArrow) && Input.GetKey(KeyCode.RightArrow)) {
        transform.Translate(Vector3.forward * speed * Time.deltaTime);
    } else if (Input.GetKey(KeyCode.UpArrow) && Input.GetKey(KeyCode.LeftArrow)) {
        transform.rotation = Quaternion.AngleAxis(315, Vector3.up);
    }
    if (Input.GetKey(KeyCode.DownArrow)) {
        transform.Translate(Vector3.forward * speed * Time.deltaTime);
    }
}

3
切线:代码中的缩进有点混乱,因此起初我没有注意到,但是代码中的条件将阻止大多数代码运行。就像if(UpArrow)否则if(UpArrow && RightArrow)将永远不会运行'else'分支。
飞速前进

Answers:


13

将方向选择代码与实际运动代码分开。

  1. Direction通过检查按下了哪些键进行选择。将其存储为单位(标准化)向量。
  2. 乘你DirectionSpeedDeltaTime
  3. 将产生的变换应用于对象/相机。

27

您需要取方向的总和,对其进行归一化,然后乘以速度。

我对“ 防止对角线移动”做出了回应,对此做了切切的回答。

特别:

velX = 0;
velY = 0;

if(keyLeft) velX += -1;
if(keyRight) velX += 1;
if(keyUp) velY += -1;
if(keyDown) velY += 1;

// Normalize to prevent high speed diagonals
length = sqrt((velX * velX ) + (velY * velY ));
if (length != 0)
{
    velX /= length;
    velY /= length;
}

velX *= speed;
velY *= speed;

3
嘿,拉里会感到骄傲!c2.com/cgi/wiki?LazinessImpatienceHubris
jzx

3
请注意,Unity已经提供了获取Vector 大小平方大小的方法。
Selali Adob​​or 2014年

1
如果未按任何键,则产生NaN
CodesInChaos 2014年

1
@jzx的确,我们努力像传说中的霍比特人一样。youtube.com/watch?v=G49RUPv5-NU
Pharap 2014年

11

“归一化方向向量”是通常执行此任务的方式,也是我经常执行的方式,但是最近我一直只是简单地夹紧得到的运动向量。通常可以达到相同的最终结果,并且代码要简单得多:

var moveSpeed = 6.0f;
function Update() {
  var movement = Vector3.zero;
  movement.x = Input.GetAxis("Horizontal") * moveSpeed;
  movement.z = Input.GetAxis("Vertical") * moveSpeed;
  movement = Vector3.ClampMagnitude(movement, moveSpeed);
  movement *= Time.deltaTime;
  transform.Translate(movement);
}

更简单的代码几乎总是更好:E


该怎么ClampMagnitude做,它不是与查询中相同的代码Normalize * Constant吗?
Kromster说支持Monica 2014年

2
不完全的。“钳位”一个值可确保它保持在一个范围内/低于最大值,而归一化则将该值设置为一个常数。至少在Unity的情况下,GetAxis()返回的加速度值略有增加,从而使您的运动更加平滑。归一化向量会覆盖该加速度,而钳位则允许发生加速度。它很微妙,但看起来更好。最终效果几乎相同。
飞速

1
+1是唯一直接在Unity环境中编写的答案。考虑到这种情况,API提供了各种有用的Vector / Quaternion数学方法,没有理由自己动手。
Selali Adob​​or 2014年

我将钳位为1,并且仅moveSpeed在钳位后与相乘,并且可能与乘以合并deltaTime
CodesInChaos

这种改变的收益不仅仅只是消除一个乘法运算吗?同样,夹具1与夹具6的工作方式是否不同?想知道您所做的更改是什么...
晃动
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.