Персонаж закручивается при движении

Учился писать скрипт передвижения персонажа: WASD прыжок, бег, присед. Но каждый раз при движении персонажа (цилиндр), он начинает крутиться. если просто ходить прямо, ничего не произойдёт, но если повернуться влево, то камера повернется немного вправо и наоборот. если после поворота пойти вперёд или назад, то он начнет крутится сильнее, даже если больше ничего не нажимать. за поворот камеры и персонажа отвечает мышь, но если во время ходьбы поворачивать мышью, то персонаж будет сопротивляться и повороты будут слабыми и дёрганными. вот код управления персонажем, но я сомневаюсь, что дело в нем, может настройки юнити или самого персонажа изменить надо?:

using UnityEngine;

public class PlayerMovement : MonoBehaviour
{

    [SerializeField] private float walkSpeed = 5f;

    [SerializeField] private float runSpeed = 10f;

    [SerializeField] private float crouchSpeed = 2.5f;

    [SerializeField] private float gravity = 10f;

    [SerializeField] private float jumpPower = 50f;

    [SerializeField] private float crouchHeight = 0.5f;

    private CharacterController _characterController;
    private Vector3 _velocity;
    private float _originalHeight;
    private bool _isCrouching = false;

    private void Start()
    {
        _characterController = GetComponent<CharacterController>();
        _originalHeight = _characterController.height;
    }

    private void Update()
    {
        HandleMovement();
        HandleJump();
        HandleCrouch();
    }

    private void FixedUpdate()
    {
        ApplyGravity();
    }
    private void HandleMovement()
    {
        float speed = walkSpeed;

        if (_isCrouching)
        {
            speed = crouchSpeed;
        }
        else if (Input.GetKey(KeyCode.LeftShift))
        {
            speed = runSpeed;
        }

        float x = Input.GetAxis("Horizontal");
        float z = Input.GetAxis("Vertical");
        Vector3 move = transform.right * x + transform.forward * z;
        _characterController.Move(move * speed * Time.fixedDeltaTime);
    }

    private void HandleCrouch()
    {
        if (Input.GetKeyDown(KeyCode.LeftControl) && !_isCrouching)
        {
            _isCrouching = true;
            _characterController.height = crouchHeight;
        }
        else if (Input.GetKeyUp(KeyCode.LeftControl) && _isCrouching)
        {
            _isCrouching = false;
            _characterController.height = _originalHeight;
        }
    }

    private void HandleJump()
    {
        if (_characterController.isGrounded && Input.GetButtonDown("Jump"))
        {
            _velocity.y = jumpPower;
        }
    }

    private void ApplyGravity()
    {
        if (_characterController.isGrounded && _velocity.y < 0)
        {
            _velocity.y = -1f;
        }
        _velocity.y -= gravity * Time.fixedDeltaTime;
        _characterController.Move(_velocity * Time.fixedDeltaTime);
    }
}

Ответы (0 шт):