/
KirRo
/
Test_1
Обзор
Документация
Войти
/
KirRo
/
Test_1
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Assets/_Project/Scripts/PlayerMotor.cs
79 строк
2 KB
KirRo
Правки. Разделена логика игрока, камеры, UI, Object Pool. Ожидание сервисов ввода и аудио
30 июл 2026, 22:37
30 июл 2026, 22:37
d3abbab
Код
Авторство
О чём код?
using UnityEngine; public class PlayerMotor : MonoBehaviour { [SerializeField] private float _walkSpeed = 2.5f; [SerializeField] private float _runSpeed = 5f; [SerializeField] private float _jumpHeight = 1.2f; [SerializeField] private float _gravity = -20f; [SerializeField] private float _groundedVerticalVelocity = -2f; [SerializeField] private Transform _visualRoot; [SerializeField] private float _visualRotationSpeed = 12f; private CharacterController _characterController; private float _verticalVelocity; private void Awake() { _characterController = GetComponent<CharacterController>(); } public bool Move(Vector3 inputDirection, bool isMoving, bool isRunning, bool isJumpPressed) { var didJump = UpdateVerticalVelocity(isRunning, isJumpPressed); MoveCharacter(inputDirection, isRunning); RotateVisual(inputDirection, isMoving); return didJump; } private bool UpdateVerticalVelocity(bool isRunning, bool isJumpPressed) { if (_characterController.isGrounded && _verticalVelocity < 0f) { _verticalVelocity = _groundedVerticalVelocity; } if (isJumpPressed && isRunning && _characterController.isGrounded) { _verticalVelocity = Mathf.Sqrt(_jumpHeight * -2f * _gravity); return true; } _verticalVelocity += _gravity * Time.deltaTime; return false; } private void MoveCharacter(Vector3 inputDirection, bool isRunning) { var currentSpeed = isRunning ? _runSpeed : _walkSpeed; var moveDirection = transform.forward * inputDirection.z + transform.right * inputDirection.x; var velocity = moveDirection * currentSpeed; velocity.y = _verticalVelocity; _characterController.Move(velocity * Time.deltaTime); } private void RotateVisual(Vector3 inputDirection, bool isMoving) { if (!isMoving || _visualRoot == null) { return; } var targetYaw = Mathf.Atan2(inputDirection.x, inputDirection.z) * Mathf.Rad2Deg; var targetRotation = Quaternion.Euler(0f, targetYaw, 0f); _visualRoot.localRotation = Quaternion.Lerp( _visualRoot.localRotation, targetRotation, _visualRotationSpeed * Time.deltaTime ); } }