using System; using Animation; using UnityEngine; using UnityEngine.InputSystem; public class PlayerController : MonoBehaviour { private AnimatorManager _mAnimator; private Vector3 _destPos; private Status_Player _status; enum AnimatorParam { speed, atk_speed, attack, run, } enum PlayerBehavior { Idle, Move, Attack, Die } private PlayerBehavior _behavior = PlayerBehavior.Idle; private PlayerBehavior Behavior { get { return _behavior; } set { _behavior = value; switch (_behavior) { case PlayerBehavior.Die: _mAnimator.SetValue(AnimatorParam.attack, false); break; case PlayerBehavior.Idle: _mAnimator.SetValue(AnimatorParam.speed, 0); _mAnimator.SetValue(AnimatorParam.attack, false); break; case PlayerBehavior.Move: _mAnimator.SetValue(AnimatorParam.speed, _status.MoveSpeed); _mAnimator.SetValue(AnimatorParam.attack, false); break; case PlayerBehavior.Attack: _mAnimator.SetValue(AnimatorParam.attack, true); break; } } } private void Awake() { _mAnimator = new AnimatorManager(GetComponent()); _status = gameObject.GetComponent(); } void Start() { Manager.Input.MouseAction -= OnMouseClicked; Manager.Input.MouseAction += OnMouseClicked; SetAnimator(); } void SetAnimator() { _mAnimator.SetValue(AnimatorParam.atk_speed,_status.AtkSpeed); } void Update() { switch (_behavior) { case PlayerBehavior.Idle: UpdateIdle(); break; case PlayerBehavior.Move: UpdateMove(); break; case PlayerBehavior.Attack: break; case PlayerBehavior.Die: break; } } void OnMouseClicked(Define.MouseEvent evt) { if (Behavior == PlayerBehavior.Die) return; RaycastHit hit; Ray ray = Camera.main.ScreenPointToRay((Vector3)Mouse.current.position.ReadValue()); bool raycastHit = Physics.Raycast(ray, out hit, 100.0f, LayerMask.GetMask("Ground")); // --- 디버그 시각화 --- // if (raycastHit) // { // // 레이캐스트 성공 시: 부딪힌 곳까지 빨간 선 표시 // Debug.DrawRay(ray.origin, ray.direction * hit.distance, Color.red, 1.0f); // // // 마우스를 처음 눌렀을 때만 디버그용 구 생성 // if (evt == Define.MouseEvent.Down) // { // GameObject debugSphere = GameObject.CreatePrimitive(PrimitiveType.Sphere); // debugSphere.transform.position = hit.point; // debugSphere.transform.localScale = Vector3.one * 0.5f; // debugSphere.GetComponent().enabled = false; // GameObject.Destroy(debugSphere, 3.0f); // } // } // else // { // // 레이캐스트 실패 시: 긴 노란 선 표시 // Debug.DrawRay(ray.origin, ray.direction * 100.0f, Color.yellow, 1.0f); // } // --- 디버그 시각화 끝 --- // 레이캐스트가 아무것도 맞추지 못했다면, 이후 로직을 실행하지 않음 if (!raycastHit) return; // --- 실제 게임 로직 --- switch (evt) { case Define.MouseEvent.Click: case Define.MouseEvent.Down: _destPos = hit.point; Behavior = PlayerBehavior.Move; break; case Define.MouseEvent.Press: _destPos = hit.point; break; } } void UpdateIdle() { } void UpdateMove() { Vector3 dir = _destPos - transform.position; if (dir.magnitude < 0.1f) Behavior = PlayerBehavior.Idle; else { float moveDist = Mathf.Clamp(_status.MoveSpeed * Time.deltaTime, 0, dir.magnitude); transform.position += dir.normalized * moveDist; Vector3 targetDir = new Vector3(dir.x, 0, dir.z).normalized; if(targetDir != Vector3.zero) transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(targetDir), 0.15f); } } void UpdateAttack() { } }