Trafel
Trafel

Reputation: 79

Diagonal speed is too fast

How can I keep the diagonal speed to be the same as the horizontal and vertical speed without clamping any value or using ".normaized". I tryed to normalize the values but I lost the joystick values between 1 and 0. Here is my code :

void ListenInput()
{
    Vector3 rightDirection = camera.right;
    Vector3 frontDirection = camera.GetForwardFromAngleY();

    move = new Vector2(
        Input.GetAxis("Horizontal"),
        Input.GetAxis("Vertical")
        );

    MoveCharacter(rightDirection * move.x);
    MoveCharacter(frontDirection * move.y);
}

void MoveCharacter(Vector3 velocity)
{
    transform.position += velocity * Time.deltaTime * runningSpeed;
}

Upvotes: 3

Views: 3805

Answers (2)

Paweł Zgórecki
Paweł Zgórecki

Reputation: 116

Here, you should clamp the magnitude of the input Vector2. For example with Vector2.ClampMagnitude() from the Unity API. That will keep the input non-binary and prevent the diagonal from getting larger than purely horizontal/vertical inputs.

void ListenInput()
{
    Vector3 rightDirection = camera.right;
    Vector3 frontDirection = camera.GetForwardFromAngleY();

    move = new Vector2(
        Input.GetAxis("Horizontal"),
        Input.GetAxis("Vertical")
        );

    move = Vector2.ClampMagnitude(move, 1f);

    MoveCharacter(rightDirection * move.x);
    MoveCharacter(frontDirection * move.y);
}

void MoveCharacter(Vector3 velocity)
{
    transform.position += velocity * Time.deltaTime * runningSpeed;
}

Upvotes: 6

ZektorH
ZektorH

Reputation: 2760

If you normalize a vector you will make sure it's length is 1. This is a great way to avoid quirks like "diagonal movement is faster than normal movement".

However, the fact that the length is always 1 also means that there is no "move slowly" or "move at full speed" distinction from the joystick. When you say "I lost the joystick values between 1 and 0" is due to this fact.

One way developers get around this is by using a mathematical formula to scale the speed.

You could:

  • Use the largest value (horizontal or vertical) to control the speed
  • Use the smallest value
  • Use a combination of the two

Another way to do this is to store how long ago the movement started, then scale the speed based on that. This method has its own challenges, but is very familiar to players.

Examples

For instance, if I have:

  • horizontalInput = 1
  • verticalInput = 0.5

This means my normalized vector looks like this:

Moving direction

I could:

Use the largest value

Move at full speed (1) on the direction of my vector.

Use the smallest value

Move at half speed (0.5) on the direction of my vector.

Use a Use a combination of the two values

For this instance, lets use the following formula: (x+y)/2. Move at 3/4 speed (0.75) on the direction of my vector.

NOTE: This formula will not "feel" as nice if you have x=0 and y=1, this is just an example. You most likely want to use Min, Max, Avg and if-clauses to control how the speed works.

You can use different formulas and different techniques to make the movement in your game feel like what you want, but take the time to analyze WHY it feels like that.

Upvotes: 3

Related Questions