오늘은 인풋시스템을 다뤄볼것이다.
일단 윈도우 탭에 들어가 패키지 매니저를 들어가고


이렇게 Packages를 Unity Registry로 바꿔준후 input을 검색하면 바로 input system이 나온다.
이걸 임포트 하게 해준다면 인풋시스템은 설치가 완료된것이다.
이 인풋시스템을 활용을 하려면

이렇게 인풋액션을 눌러준후에

이렇게 new controls가 하나가 생기게 되는데 더블클릭을 하게되면
이러한 창이 하나가 뜨게 되는데 빨간색으로 표시된 부분을 클릭을 하면

이렇게 Action Maps에 나오게된다.
여기서 우리는 플레이어를 설정할것이기 때문에 Player로 이름을 바꿔줄것이고
오른쪽에 Action이 있는데 Action Type을 눌러보면

이러한 Value, Button, Pass Through 이렇게 뜬다.

이 3개를 예시를 들어서 설명을 해보겠다.
예시 :
조이스틱 이동 또는 키보드 등등
WASD 키로 캐릭터 이동: W, A, S, D 키를 누르는 정도에 따라 이동 값을 연속적으로 받아 캐릭터의 이동 속도를 조절할 수 있다. 예를 들어, W 키를 누르면 1, 떼면 0이 되며, A와 D를 동시에 누르면 그 중간값을 계산할 수도 있다.
예시:
점프 버튼: 스페이스바를 누르면 true를 반환해 캐릭터가 점프하고, 떼면 false가 된다.
공격 버튼: 버튼을 누를 때마다 공격이 발동된다.
예시:
멀티플랫폼 입력: 키보드와 조이스틱 입력을 모두 받아서 각각을 그대로 처리한다. 예를 들어, 키보드의 화살표 키와 조이스틱의 방향 패드를 동시에 처리할 때 사용된다.
그러면 이제 우리는 캐릭터의 이동을 구현하기 위해서 Value를 선택한후에 2D를 사용하고 있기 때문에 Vector2를 선택해준다.

이렇게 선택을 해주었다면

이렇게 빨간색 동그라미에 있는 버튼을 누르게 된다면

이렇게 나오는데 캐릭터의 움직임을 구현하려면 두번째에 있는 Up\Down\Left\Right를 선택한다.

선택을 하면 이렇게 나오게 되는데 Up을 선택을 하고나서 Binding 부분에 Path가 비어있을 것이다.
Path부분을 클릭하고 W를 누르면

이렇게 나오는데 설정을 해준다. 이와 똑같은 방식으로 Down, Left, Right도 설정을 한다.
만약에 나는 WASD 설정을 말고 키보드 방향키로 하고싶다 하면 Up Arrow, Down Arrow, Left Arrow, Right Arrow 이렇게 찾아서 똑같이 설정을 해주면 된다.
그리고 이게 선택이 마우스 좌클릭으로 안되는데 우클릭으로 하면 선택이된다.

그리고 설정을 마쳤다면 위에 Save Asset을 누른다.
그리고 이 인풋시스템을 적용시키기 위해서 Hierarchy창에서 오브젝트를 하나 만든후에
Add Component를 눌러서 Player Input을 추가해준다.

그리고나서 이 플레이어 인풋에 방금만든 Controller을 Actions에 넣어준다.

이제 간단하게 스크립트를 추가해볼것이다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour
{
// 플레이어의 이동 방향을 저장할 변수 (Vector2는 2D 벡터)
private Vector2 Playervector;
// 플레이어의 이동 속도를 조절할 변수 (Inspector에서 조정 가능)
[SerializeField]
private float PlayerSpeed;
// Rigidbody2D 컴포넌트를 참조할 변수 (물리 연산에 사용)
private Rigidbody2D rb;
// SpriteRenderer 컴포넌트를 참조할 변수 (스프라이트의 방향을 조정할 때 사용)
private SpriteRenderer sprite;
// 게임 오브젝트가 생성될 때 초기 설정을 하는 함수 (컴포넌트 참조)
private void Awake()
{
// Rigidbody2D 컴포넌트를 가져와서 rb 변수에 저장
rb = GetComponent<Rigidbody2D>();
// SpriteRenderer 컴포넌트를 가져와서 sprite 변수에 저장
sprite = GetComponent<SpriteRenderer>();
}
// 물리 연산이 일정 시간 간격으로 실행되는 함수 (주로 물리 기반 이동 처리)
private void FixedUpdate()
{
// Playervector를 정규화(normalized)하여 방향을 유지하고,
// 속도와 시간(deltaTime)을 곱해 이동 거리를 계산
Vector2 vector2 = Playervector.normalized * PlayerSpeed * Time.fixedDeltaTime;
// Rigidbody2D의 위치를 새로운 위치로 이동시킴
rb.MovePosition(rb.position + vector2);
}
// Input System에서 Move 액션이 발생할 때 호출되는 함수 (InputValue를 통해 입력 값 전달)
private void OnMove(InputValue value)
{
// 입력된 값을 Vector2로 변환하여 Playervector에 저장
Playervector = value.Get<Vector2>();
}
// 모든 업데이트 작업이 완료된 후 실행되는 함수 (주로 그래픽적인 작업 처리)
private void LateUpdate()
{
// Playervector의 x 값이 0이 아니면 (즉, 왼쪽이나 오른쪽으로 이동 중이면)
if(Playervector.x != 0)
// x 값이 음수면 스프라이트를 좌우 반전 (왼쪽을 향하도록)
sprite.flipX = Playervector.x < 0;
}
}
이렇게 작성을 하고나서 게임오브젝트에 이 스크립트를 붙여주게 된다면 이제 설정해두었던 키 세팅으로 오브젝트가 움직이게 된다.
