[Unity][2D-Game] Undead Survivor (2) + a

suhan0304·2023년 11월 3일
0
post-thumbnail

preview Link : https://velog.io/@suhan0304/Unity2D-GameUndead-Survivor-2
gitHub Link : https://github.com/suhan0304/Undead-Survivor


Review

저번 개발 과정에서 어떤 작업을 했는지 리뷰해보자.

  • Player.cs 스크립트를 만들어서 Player 오브젝트에 컴포넌트로 추가했다.
  • input의 GetAxisRaw를 통해 키 입력을 받아왔다.
  • Player.cs에 Rigidbody2D를 GetComponent로 rigid와 연결시킨후에 rigid.MovePosiotn를 이용해서 오브젝트의 움직임을 구현했다.
  • 이 때 대각선으로의 움직임이 빨라지는 현상을 방지하기 위해 normalized를 사용했다.
  • 다른 프레임에서도 동일한 이동 거리를 가지도록 fixedDeltaTime을 사용했다.

강의영상(2) + a - 새로운 인풋시스템 적용하기


개발

Input System 설치

기존에 사용하는 GetAxis나 GetAxisRaw 같은 방식은 Unity의 오래된 input 방식이다. Input system 사용해서 움직임을 구현해보자.
우선 Window > Package Manager 에서 input system을 insall한다.

Package를 Unity Registry로 해야 검색 결과로 나온다. 초기값은 In Project로 되어있다.

Input system을 설치 한 후 적용을 위해서 재시작한다.


Input Action 설정하기

Player 오브젝트에 Player Input이라는 컴포넌트를 새로 추가해준다. 이 때 Actions Asset이 없기 때문에 Create Actions로 Player라는 액션을 새로 만들어준다.

Actions Asset을 생성하면 다음과 같이 생성된 Player(Input Actions)를 확인할 수 있다. 여기서 액션은 기존의 Input Manager가 버튼과 기능을 매핑 시킨것과 비슷한 역할을 한다고 볼 수 있다. 오른쪽 Action 속성에 대한 간단한 설명은 아래와 같다.

  • Action Type : 물리적 입력을 어떻게 Action으로 넘길 것인지를 설정한다. 버튼 클릭인지, 값(Value)을 내보내는 것인지를 설정할 수 있다.
  • Contol Type : 내보낼 값(Value)의 형식을 결정한다.
  • Interactions : 누르고 있어야 하는지, Tap하는지, 누르는 순간인지와 같은 인풋의 호출 타이밍을 지정한다.
    - 기본적으로는 값이 변할 때(누르거나, 때거나)만 인풋이 호출된다.
  • Processors : y축 반전, normalized, scale 조정과 같이 인풋의 값을 후보정할 때 사용한다.

개발중인 게임에서는 입력을 Vector2 형태로 값을 직접 넘겨받고 Vector2에 대해서 normalized를 똑같이 적용시키기 위해 Processors에 Normalize Vector 2를 추가한 후 Save Asset을 진행했다.

스크립트 수정

using UnityEngine.InputSystem;

UnityEngine.InputSystem 네임 스페이스를 추가해준 후 기존의 Update 함수문을 삭제한다.

void onMove(InputValue value)
{
	inputVec = value.Get<Vector2>();
}

InputSystem에서 제공하는 OnMove 함수를 다음과 같이 작성한다. 이 때 InputValue는 아까 설정한 Player(input Action)에서 물리적 입력이 넘어오는 value를 의미한다. 이를 inputVec에 넣어주면 되는데, 이때 value를 InputValue를 Vector2의 형태로 바꿔줘야하는데 .Get을 이용해 value를 Vector2의 형태로 바꿔준 후에 inputVec에 넣어준다.
이 때 Player(input Actions)에서 normalized를 추가했기 때문에 기존의 normalized를 사용할 필요가 없다.
따라서 완성된 코드는 다음과 같다.

void FixedUpdate()
{
	Vector2 nextVec = inputVec * speed * Time.fixedDeltaTime;
	rigid.MovePosition(rigid.position + nextVec);
}

void OnMove(InputValue value)
{
	inputVec = value.Get<Vector2>();
}

InputSystem에서 사용가능한 함수들은 컴포넌트 창을 통해 확인할 수 있다.


결과물

profile
Be Honest, Be Harder, Be Stronger

0개의 댓글