using UnityEngine; namespace OTG.Lab06.Characters { [RequireComponent(typeof(CharacterController))] public sealed class PlayerController : MonoBehaviour { [SerializeField] private float moveSpeed = 6f; [SerializeField] private float rotationSpeed = 12f; [SerializeField] private float gravity = -24f; [SerializeField] private Transform cameraTransform; private CharacterController characterController; private float verticalVelocity; private void Awake() { characterController = GetComponent(); } private void Start() { if (cameraTransform == null && Camera.main != null) { cameraTransform = Camera.main.transform; } } private void Update() { Vector2 input = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical")); input = Vector2.ClampMagnitude(input, 1f); Vector3 forward = cameraTransform == null ? Vector3.forward : cameraTransform.forward; Vector3 right = cameraTransform == null ? Vector3.right : cameraTransform.right; forward.y = 0f; right.y = 0f; forward.Normalize(); right.Normalize(); Vector3 move = forward * input.y + right * input.x; if (move.sqrMagnitude > 0.01f) { Quaternion targetRotation = Quaternion.LookRotation(move, Vector3.up); transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, rotationSpeed * Time.deltaTime); } if (characterController.isGrounded && verticalVelocity < 0f) { verticalVelocity = -2f; } verticalVelocity += gravity * Time.deltaTime; Vector3 velocity = move * moveSpeed + Vector3.up * verticalVelocity; characterController.Move(velocity * Time.deltaTime); } } }