1. 편한 관리를 위해서 Assets 폴더에 Input 폴더를 하나 생성해준다.
2. Create -> Input Actions (맨 밑에)으로 Input Action Asset을 생성해준다.
3. Input Action Asset을 실행한 뒤 ActionMpas를 하나 추가해주면 Actions도 하나 추가된다.
4. Component - Player Input에서 Behavior : Send Messages를 사용할 때 Actions에서 설정해둔 이름으로 함수를 호출 할 수 있다. 여기서는 Move로 이름을 설정해뒀기 때문에 움직일 때 호출 받는 함수는 OnMove로 사용한다.
ex) 만약에 Move가 아니라 MoveInput이라고 이름을 설정했다면 OnMove가 아니라 OnMoveInput으로 사용하면 된다.
이해가 안 될때는 Player Input - Behavior 밑 부분에 Actions를 추가할 때마다 함수가 늘어나는 것을 확인해보면 된다.
5. Actions - Move - Action Type과 Control Type을 각각 Value와 Vector2로 변경해준다. 의미는 해당 Action이 들어올 때 Vector2의 값으로 받겠다는 의미이다.
6. Actions - Move 오른쪽에 + 버튼을 누르게되면 2번째에 Add Up\Down\Left\Right 가 있다. 자주 사용하는 기능을 편하게 구현하라고 준비해준 옵션? 같은 것이다.
7. 누르게 되면 Up Down Left Right 4개가 생성이 되며 각각 선택하면서 Path를 누르게되면 창이 하나 뜨게되는데 사용하고 싶은 키를 입력해주면 그 키가 창에 표시된다. 만약에 표시 안된다면 마우스 오른쪽 키를 이용해서 원하는 키를 찾으면 된다.
8. 움직이고자 하는 Object에 Player Input과 RegidBody2D(2D project 기준) Component를 Add 시켜 준 뒤 Player Input -Actions 부분에 Input 폴더에서 만들었던 Input Action Asset을 넣어준다. 그리고 RigdBody2D - Gravity는 0으로 수정해준다.
9. 이제 Script를 작성할 차례다. 똑같이 폴더를 하나 생성해준 뒤 Crate - C#Script로 생성해준다.
using UnityEngine.InputSystem;을 추가해주고 시작하자.
10.
using System;
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerMove : MonoBehaviour
{
public event Action<Vector2> OnMoveEvent;
private Rigidbody2D movementRigidbody;
private Vector2 movementDirection = Vector2.zero;
private float speed = 5f;
private void Start()
{
movementRigidbody = GetComponent<Rigidbody2D>();
OnMoveEvent += Move;
}
// FixedUpdate는 물리 업데이트 관련 시 사용
// RigidBody의 값을 변경해서 움직이기 때문에 FixedUpdate를 사용함.
private void FixedUpdate()
{
ApplyMovement(movementDirection);
}
private void Move(Vector2 direction)
{
movementDirection = direction;
}
// Action이 발생 될 때 동작됨
// InputValue = 아까전 Actions에서 설정값을 Vector2로 설정했던 부분
public void OnMove(InputValue value)
{
Vector2 moveInput = value.Get<Vector2>().normalized;
CallMoveEvent(moveInput);
}
public void CallMoveEvent(Vector2 direction)
{
OnMoveEvent?.Invoke(direction); // ?. 없으면 말고 있으면 실행
}
private void ApplyMovement(Vector2 direction)
{
direction = direction * speed;
movementRigidbody.velocity = direction;
}
}
반대 방향으로 움직일 때 마우스 없이 Flip하는 법은 생각해봐야겠다.
'내배켐 Unity TIL' 카테고리의 다른 글
Unity 22일차 TIL - Unity 2D 프로젝트2 (0) | 2024.05.13 |
---|---|
Unity 21일차 TIL - Unity 2D 프로젝트1 (0) | 2024.05.10 |
Unity 19일차 TIL - Unity(InputSystem) (0) | 2024.05.08 |
Unity 18일차 TIL - 팀 프로젝트 회고록 (0) | 2024.05.07 |
Unity 17일차 TIL - 재귀 함수 (스택 관리) (0) | 2024.05.03 |