使用归一化速度逐渐增加移动速度

时间:2017-04-04 07:51:41

标签: c# unity3d

正如标题所说,我希望使用xbox控制器的左侧拇指操纵杆和Input.GetAxis()方法逐渐提高移动速度。问题是我需要对运动矢量进行标准化,以便阻止对角线运动比向前,向后等运动更快。标准化将自动使幅度为1,因此我失去了使用左手拇指操纵杆控制速度的能力。在此先感谢!

可以通过拇指杆的位置控制速度,但是对角线移动比其他移动更快。

    Vector3 moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));

    rigidBody.MovePosition(transform.position + moveDirection * moveSpeed * Time.deltaTime);

不能用拇指杆的位置控制速度,但对角线的移动速度与其他移动速度相同。

    Vector3 moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));

    rigidBody.MovePosition(transform.position + moveDirection.normalized * moveSpeed * Time.deltaTime);

2 个答案:

答案 0 :(得分:1)

而不是标准化或缩放:钳制。

Vector3 input = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
Vector3 moveDirection = new Vector3(
    Mathf.Clamp(input.x, -Mathf.Abs(input.normalized.x), Mathf.Abs(input.normalized.x)),
    0,
    Mathf.Clamp(input.z, -Mathf.Abs(input.normalized.z), Mathf.Abs(input.normalized.z))
);

rigidBody.MovePosition(transform.position + moveDirection * moveSpeed * Time.deltaTime);

单位圆内的所有值都将保持不变,而单位圆外的值将重新计算为单位圆。

还可以将其写为:

Vector3 move = (input.magnitude<1?input:input.normalized);

答案 1 :(得分:0)

这个问题可能有更好的解决方案,但这就是我解决它的方法。我将暂时无法回答这个问题,看看其他人是否有更好的解决方案。

    Vector3 moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));

    rigidBody.MovePosition(transform.position +  new Vector3(moveDirection.normalized.x * moveSpeed * Time.deltaTime * Mathf.Abs(moveDirection.x), 0,
                                                             moveDirection.normalized.z * moveSpeed * Time.deltaTime * Mathf.Abs(moveDirection.z)));