Персонаж закручивается при движении
Учился писать скрипт передвижения персонажа: 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);
}
}