using UnityEngine; using UnityEngine.InputSystem; namespace OnlyScove.Scripts { public class PlayerDebugProvider : MonoBehaviour { [Header("References")] [SerializeField] private PlayerStateMachine stateMachine; [Tooltip("Kéo cái Canvas (World Space) bạn đã thiết kế vào đây")] [SerializeField] private GameObject debugCanvas; [Header("Follow Settings")] [SerializeField] private Vector3 followOffset = new Vector3(1.5f, 2f, 0f); [SerializeField] private float smoothTime = 0.15f; [SerializeField] private bool lookAtCamera = true; // Các thuộc tính Public để bạn truy cập từ Script UI của bạn public string CurrentState => stateMachine != null ? stateMachine.CurrentStateName : "N/A"; public string GroundedStatus => (stateMachine != null && stateMachine.IsGrounded) ? "YES" : "NO"; public float HorizontalSpeed => stateMachine != null ? new Vector3(stateMachine.Controller.velocity.x, 0, stateMachine.Controller.velocity.z).magnitude : 0f; public float VerticalSpeed => stateMachine != null ? stateMachine.VelocityY : 0f; // Sửa lỗi truy cập InputReader từ StateMachine public Vector2 MoveInput => (stateMachine != null && stateMachine.Input != null) ? stateMachine.Input.MoveInput : Vector2.zero; public bool IsSprinting => (stateMachine != null && stateMachine.Input != null) ? stateMachine.Input.IsSprintHeld : false; public string TargetInteractable => stateMachine != null ? (stateMachine.GetInteractable()?.InteractionPrompt ?? "None") : "N/A"; public IInteractable GetActiveInteractable() => stateMachine?.GetInteractable(); public Vector3 GetInteractionPoint() { if (stateMachine == null || stateMachine.Scanner == null) return Vector3.zero; return stateMachine.Scanner.GetLastInteractionPoint(stateMachine.InteractionRange, stateMachine.InteractionMask); } private Vector3 currentVelocity; private Transform cameraTransform; private bool isVisible = true; private void Awake() { if (stateMachine == null) stateMachine = GetComponent(); cameraTransform = Camera.main?.transform; if (debugCanvas != null) debugCanvas.SetActive(isVisible); } private void Update() { // Toggle Visibility (Ctrl + Shift + B) sử dụng New Input System if (Keyboard.current != null) { bool ctrl = Keyboard.current.leftCtrlKey.isPressed || Keyboard.current.rightCtrlKey.isPressed; bool shift = Keyboard.current.leftShiftKey.isPressed || Keyboard.current.rightShiftKey.isPressed; bool bDown = Keyboard.current.bKey.wasPressedThisFrame; if (ctrl && shift && bDown) { isVisible = !isVisible; if (debugCanvas != null) debugCanvas.SetActive(isVisible); } } } private void LateUpdate() { if (!isVisible || debugCanvas == null) return; // 1. Damping Follow: UI đuổi theo Player Vector3 targetPos = transform.position + followOffset; debugCanvas.transform.position = Vector3.SmoothDamp( debugCanvas.transform.position, targetPos, ref currentVelocity, smoothTime ); // 2. Billboard: Luôn nhìn về Camera if (lookAtCamera && cameraTransform != null) { debugCanvas.transform.LookAt(debugCanvas.transform.position + cameraTransform.forward); } } } }