
InputAction 를 이용한 플레이어 이동Fill Amount 를 이용한 프로그래스 바 구현Vertical Layout Group 를 이용한 UI 정렬플레이어가 사용할 키 값:
- Move: W, A, S, D
- Jump: Space bar
- Inventory: Tab
- Attack: Left Mouse Button
- Rotation: Mouse Rotation
- Root: E
Window > Package Manager > Packages : Unity Registry > Input System 설치
Input System 설치 후 project 창에서 Input Action을 만들어 준다
만든 Input Action을 클릭 > Edit asset 버튼 클릭
필요한 값(처음 정리했던 플레이어가 사용할 키 값)을 추가해준다.
필요한 키 값을 전부 추가했다면 Save Asset을 눌러 저장한 뒤, 세팅한 Input Action을 Player에 붙여준다.
이후 버튼에 Event를 추가하는 것처럼 스크립트를 통해 Event를 추가해줄 수 있다.
아래는 사용했던 Move 스크립트:
private Rigidbody _rigidbody; private Vector2 curMovementInput; private void Awake() { _rigidbody = GetComponent<Rigidbody>(); } void FixedUpdate() { Move(); } void Move() { Vector3 dir = transform.forward * curMovementInput.y + transform.right * curMovementInput.x; dir *= moveSpeed; dir.y = _rigidbody.velocity.y; _rigidbody.velocity = dir; } //W, A, S, D 키가 눌렸을 때 실행된다. public void OnMove(InputAction.CallbackContext context) { //키를 누르는 중일 때 if(context.phase == InputActionPhase.Performed) { curMovementInput = context.ReadValue<Vector2>(); } //키가 떨어졌을 때 else if(context.phase == InputActionPhase.Canceled) { curMovementInput = Vector2.zero; } }
위 스크립트 처럼 phase 를 통해 입력받은 키값의 다양한 상태를 확인하고, 각 상태에 맞는 로직을 실행시켜줄 수 있다.
- Waiting: 입력을 기다리는 중 (사용자가 아직 키를 누르지 않음)
- Canceled: 입력이 취소됨 (예: 키를 빠르게 눌렀다가 놓음)
- Performed: 입력이 완료됨 (예: 키를 누르고 있음)
- Started: 입력이 시작됨 (예: 키를 누르기 시작함)
- Disabled: 입력이 비활성화됨 (해당 액션이 꺼져 있음)
private static CharacterManager _instance; public static CharacterManager Instance { get { if(_instance == null) { _instance = new GameObject("CharacterManager").AddComponent<CharacterManager>(); } return _instance; } }
Fill Amount를 이용한 프로그래스 바 구현Window > Package Manager > Packages : Unity Registry > 2D Sprite 설치
추가된 Fill Amount 값을 이용하여 프로그래스 바를 구현할 수 있다.
Vertical Layout Group 를 이용한 UI 정렬빈 오브젝트 생성 > Shift + Alt 를 통해 오른쪽 하단 정렬
Add Component를 통해 빈 오브젝트에 Vertical Layout Group 추가
생성한 빈 오브젝트에 Health를 넣으면 자동으로 정렬되는 모습을 볼 수 있다.
Health를 복사해도 자동으로 정렬된다.
Vertical Layout Group은 자식 객체들을 세로로 정렬시켜주고, Horizontal Layout Group은 자식 객체들을 가로로 정렬시켜준다.
Grid Layout Group은 두 개가 혼합된 느낌으로, 자식 객체들을 바둑판 처럼 정렬한다. (인벤토리를 만들 때 사용할 예정)
개인적으로 참고한 블로그 👉 [Unity][UI] 레이아웃 그룹(Layout Group)
void Start() { //마우스를 숨기는 방법 Cursor.lockState = CursorLockMode.Locked; }
Move 메서드에서 dir.y = _rigidbody.velocity.y; 를 해주어야 하는 이유
void Move() { Vector3 dir = transform.forward * curMovementInput.y + transform.right * curMovementInput.x; dir *= moveSpeed; dir.y = _rigidbody.velocity.y; _rigidbody.velocity = dir; }
dir.y = _rigidbody.velocity.y; 를 해주어야 하는 이유를 앞, 뒤, 좌, 우로 움직일 때 점프를 하는 것처럼 y축이 변하지 않도록 하기 위해 초기화 해주는 것으로 이해를 했는데, 정작 dir.y = _rigidbody.velocity.y; 코드를 지워보니 반대의 결과가 나왔다 (내가 커서를 올려 움직이는대로 y축이 올라가는 것이 아니라, 점프가 되지 않음)transform.forward는 (0, 0, 1)에 rotation(객체가 바라보는 방향)을 곱해준 값이었고, transform.right는 (1, 0, 0)에 rotation을 곱해준 값이었기 때문에 dir의 y값은 0이 나오고 있었다.dir.y = _rigidbody.velocity.y; 코드를 지우고 점프를 하려고 하면, FixedUpdate에 있는 Move 메서드가 y값을 0으로 초기화 하면서 점프를 막았던 것.
퍼가요