Projext/Assets/Scripts/Player/Controller/PlayerInput.cs

68 lines
4.6 KiB
C#
Raw Normal View History

2026-02-12 15:23:25 +00:00
using UnityEngine; // 유니티 엔진의 기본 기능을 불러올거에요 -> UnityEngine을
2026-02-12 15:23:25 +00:00
public class PlayerInput : MonoBehaviour // 클래스를 선언할거에요 -> MonoBehaviour를 상속받는 PlayerInput을
2026-01-29 06:58:38 +00:00
{
2026-02-03 14:41:49 +00:00
// 다른 스크립트에게 명령을 내려야 하니, 미리 참조 시킴
2026-02-12 15:23:25 +00:00
[SerializeField] private PlayerHealth health; // 변수를 선언할거에요 -> 죽었는지 확인할 health를
[SerializeField] private PlayerMovement movement; // 변수를 선언할거에요 -> 이동 명령을 내릴 movement를
[SerializeField] private PlayerAim aim; // 변수를 선언할거에요 -> 회전 명령을 내릴 aim을
[SerializeField] private PlayerInteraction interaction; // 변수를 선언할거에요 -> 상호작용 명령을 내릴 interaction을
[SerializeField] private PlayerAttack attack; // 변수를 선언할거에요 -> 공격 명령을 내릴 attack을
[SerializeField] private PlayerStatsUI statsUI; // 변수를 선언할거에요 -> UI 토글을 위한 statsUI를
2026-01-30 03:24:13 +00:00
2026-02-12 15:23:25 +00:00
private void Update() // 함수를 실행할거에요 -> 매 프레임마다 Update를
2026-01-29 06:58:38 +00:00
{
2026-02-03 14:41:49 +00:00
// 1. 사망 체크
// 죽었는데 키보드 눌린다고 시체가 움직이면 안 되니까 아예 입력을 차단(return)함
2026-02-12 15:23:25 +00:00
if (health != null && health.IsDead) return; // 조건이 맞으면 중단할거에요 -> 플레이어가 죽었다면
2026-01-30 03:24:13 +00:00
2026-02-03 14:41:49 +00:00
// 2. UI 토글 (C키)
// 스탯 창을 껐다 켰다 함
2026-02-12 15:23:25 +00:00
if (Input.GetKeyDown(KeyCode.C) && statsUI != null) statsUI.ToggleWindow(); // 조건이 맞으면 실행할거에요 -> C키를 눌렀다면 스탯창 토글을
2026-01-30 03:24:13 +00:00
2026-02-03 14:41:49 +00:00
// 3. 이동 입력 감지
// GetAxisRaw를 쓴 이유: 0에서 1로 부드럽게 변하는 게 아니라,
// 키를 누르면 즉시 1, 떼면 0이 되어서 빠릿빠릿한 조작감을 줌
2026-02-12 15:23:25 +00:00
float h = Input.GetAxisRaw("Horizontal"); // 값을 가져올거에요 -> 좌우 입력값(-1, 0, 1)을 h에
float v = Input.GetAxisRaw("Vertical"); // 값을 가져올거에요 -> 상하 입력값(-1, 0, 1)을 v에
bool sprint = Input.GetKey(KeyCode.LeftShift); // 값을 가져올거에요 -> 쉬프트 키 입력 여부를 sprint에
2026-02-03 14:41:49 +00:00
// 4. 이동 명령 하달
2026-02-12 15:23:25 +00:00
if (movement != null) // 조건이 맞으면 실행할거에요 -> 이동 스크립트가 있다면
{
2026-02-03 14:41:49 +00:00
// 방향 벡터를 정규화(.normalized)해서 대각선 이동 시 빨라지는 걸 방지
// 그리고 달리기 여부(sprint)도 같이 넘겨줍니다.
2026-02-12 15:23:25 +00:00
movement.SetMoveInput(new Vector3(h, 0, v).normalized, sprint); // 실행할거에요 -> 이동 입력 전달 함수를
2026-02-03 14:41:49 +00:00
// ⭐ [추가] 스페이스바 누르면 대시 명령!
2026-02-12 15:23:25 +00:00
if (Input.GetKeyDown(KeyCode.Space)) movement.AttemptDash(); // 조건이 맞으면 실행할거에요 -> 스페이스바 누르면 대시 시도를
}
2026-02-03 14:41:49 +00:00
// 5. 마우스 회전 명령
// 캐릭터가 마우스 커서를 바라보게 합니다.
2026-02-12 15:23:25 +00:00
if (aim != null) aim.RotateTowardsMouse(); // 조건이 맞으면 실행할거에요 -> 마우스 방향 회전 함수를
2026-02-03 14:41:49 +00:00
// 6. 상호작용 (F키)
// 바닥에 떨어진 무기를 줍기
2026-02-12 15:23:25 +00:00
if (Input.GetKeyDown(KeyCode.F) && interaction != null) interaction.TryInteract(); // 조건이 맞으면 실행할거에요 -> F키 누르면 상호작용 시도를
2026-01-30 03:24:13 +00:00
2026-02-03 14:41:49 +00:00
// 7. 공격 입력 (좌클릭/우클릭)
2026-02-12 15:23:25 +00:00
if (attack != null) // 조건이 맞으면 실행할거에요 -> 공격 스크립트가 있다면
2026-01-29 06:58:38 +00:00
{
2026-02-03 14:41:49 +00:00
// 우클릭 꾹: 차징(모으기) 시작
2026-02-12 15:23:25 +00:00
if (Input.GetMouseButtonDown(1)) attack.StartCharging(); // 조건이 맞으면 실행할거에요 -> 우클릭 누르면 차징 시작을
2026-02-03 14:41:49 +00:00
// 우클릭 뗌: 차징 취소 (공격 안 하고 캔슬)
2026-02-12 15:23:25 +00:00
if (Input.GetMouseButtonUp(1)) attack.CancelCharging(); // 조건이 맞으면 실행할거에요 -> 우클릭 떼면 차징 취소를
2026-02-03 14:41:49 +00:00
// 좌클릭: 공격 시도
2026-02-12 15:23:25 +00:00
if (Input.GetMouseButtonDown(0)) // 조건이 맞으면 실행할거에요 -> 좌클릭을 눌렀다면
2026-01-29 06:58:38 +00:00
{
2026-02-03 14:41:49 +00:00
// 만약 우클릭(방어/조준) 상태에서 좌클릭을 했다면? -> 투척(Release)
2026-02-12 15:23:25 +00:00
if (Input.GetMouseButton(1)) attack.ReleaseAttack(); // 조건이 맞으면 실행할거에요 -> 차징 중이라면 발사를
2026-02-03 14:41:49 +00:00
// 그냥 좌클릭만 했다면? -> 일반 평타(Normal Attack)
2026-02-12 15:23:25 +00:00
else attack.PerformNormalAttack(); // 그 외엔 실행할거에요 -> 일반 공격을
2026-01-29 06:58:38 +00:00
}
}
}
}