using UnityEngine; namespace OnlyScove.Scripts { public class PlayerIdleState : PlayerBaseState { private readonly int speedHash = Animator.StringToHash("Speed"); public PlayerIdleState(PlayerStateMachine stateMachine) : base(stateMachine) {} public override void Enter() { stateMachine.Anim.ResetTrigger("Jump"); stateMachine.Anim.ResetTrigger("Fall"); stateMachine.Input.OnJumpEvent += OnJump; stateMachine.Input.OnDodgeEvent += OnDodge; stateMachine.Input.OnCrouchEvent += OnCrouch; stateMachine.Input.OnInteractEvent += OnInteract; } private readonly int speedXHash = Animator.StringToHash("Velocity X"); private readonly int speedZHash = Animator.StringToHash("Velocity Z"); public override void Tick(float deltaTime) { // Cập nhật trọng lực if (stateMachine.IsGrounded && stateMachine.VelocityY < 0) { stateMachine.VelocityY = -2f; } else { stateMachine.VelocityY += stateMachine.Gravity * deltaTime; } // Sử dụng hàm Move tập trung để đồng bộ Animator và Vị trí stateMachine.Move(new Vector3(0, stateMachine.VelocityY, 0), 0f, deltaTime); // QUAN TRỌNG: Đọc dữ liệu đã đồng bộ từ mạng (stateMachine.MoveInput) if (stateMachine.MoveInput != Vector2.zero) { stateMachine.SwitchState(new PlayerMoveState(stateMachine)); return; } } public override void PhysicsTick(float fixedDeltaTime) {} public override void Exit() { stateMachine.Input.OnJumpEvent -= OnJump; stateMachine.Input.OnDodgeEvent -= OnDodge; stateMachine.Input.OnCrouchEvent -= OnCrouch; stateMachine.Input.OnInteractEvent -= OnInteract; } private void OnJump() { if (stateMachine.IsGrounded) { if (stateMachine.Scanner != null) { var hitData = stateMachine.Scanner.ObstacleCheck(); if (hitData.forwardHitFound) { stateMachine.SwitchState(new PlayerParkourState(stateMachine)); return; } } stateMachine.SwitchState(new PlayerJumpState(stateMachine, stateMachine.WalkSpeed)); } } private void OnDodge() => stateMachine.SwitchState(new PlayerDodgeState(stateMachine)); private void OnCrouch() => stateMachine.SwitchState(new PlayerCrouchState(stateMachine)); private void OnInteract() => stateMachine.SwitchState(new PlayerInteractState(stateMachine)); } }