Персонаж бежит быстрее при одновременном нажатии 2 кнопок - PullRequest
1 голос
/ 18 июня 2020

Я пытаюсь сделать сценарий контроллера для моего персонажа. Все работает нормально, но когда я нажимаю 2 кнопки движения одновременно, мой персонаж движется быстрее.

Если я нажимаю D, он движется медленнее, чем если бы я нажимал D+S или D+W. Как я могу это исправить? Я хочу, чтобы мой персонаж двигался с одинаковой скоростью.

Код:

AnimationsCharacter animations;
CharacterController controller;
Transform camera;

Vector3 camForward;
Vector3 camRight;
Vector3 motion;

float horizontal;
float vertical;
float sprint;
float inputMagnitude;

float speed;
float defaultSpeed = 5;
float sprintSpeed = 10;
void Start()
{
    controller = GetComponent<CharacterController>();
    animations = GetComponent<AnimationsCharacter>();
    camera = Camera.main.transform;
}
void FixedUpdate()
{
    GetMoveInput();
}

public void GetMoveInput()
{
    horizontal = Input.GetAxis("Horizontal");
    vertical = Input.GetAxis("Vertical");
    sprint = Input.GetAxis("Sprint");

    if (horizontal != 0 || vertical != 0)
    {
        if(sprint != 0)
        {
            speed = sprintSpeed;
        }
        else
        {
            speed = defaultSpeed;
        }
        CalculateCamera();
        Move();
    }
}

public void CalculateCamera()
{
    camForward = camera.forward;
    camRight = camera.right;

    camForward.y = 0;
    camRight.y = 0;

    camForward = camForward.normalized;
    camRight = camRight.normalized;
}

public void Move()
{
    motion = (camForward * vertical + camRight * horizontal);
    inputMagnitude = new Vector2(horizontal, vertical).sqrMagnitude;
    controller.Move(motion * speed * Time.deltaTime);
    animations.AnimMovement(inputMagnitude);
    transform.rotation = Quaternion.LookRotation(motion);
}

Я пробовал разные вещи, например /2, если нажимались 2 кнопки. Похоже, я что-то не так делаю.

1 Ответ

2 голосов
/ 18 июня 2020

Вы должны Normalize motion в случае, если у него есть sqrMagnitude > 1 (= magnitude > 1, но более дешевый доступ), поэтому он всегда magnitude <= 1.

motion = (camForward * vertical + camRight * horizontal);
if(motion.sqrMagnitude > 1)
{
    motion.Normalize();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...