01
05
728x90

이번에는 캐릭터를 움직이는 스크립트를 작성해 보기로 한다.

방법은 간단한데 설명할게 많을 것 같다. 설명에 대한 내용은 더보기를 눌러서 확인하면 된다.

 

내가 아는 캐릭터를 움직이는 방법으로는 두 가지가 있다.

Rigidbody라는것을 사용해 물리적으로 밀어서 움직이는 방법과

Transform의 값을 계속 조정해서 움직이는 방법이 있다.

 

개인적으로 Rigidbody를 사용하면 조절하기가 어려워서 점프같은 행동에만 사용하고, 일반적인 움직임은 Transform을 사용하는 것을 선호한다.

그래서 지금 포스팅도 Transform을 사용해서 움직이게 만들어보기로 한다.

 

 

먼저 Scripts폴더 안에 Player스크립트를 만든다.

 

스크립트를 열어서 public 멤버변수와 FixedUpdate메소드, Move메소드 두 개를 넣어준다.

 

* 스크립트 설명

더보기

C#에서도 멤버변수라고 하는지는 모르겠지만 메소드 안쪽이 아닌 클래스 안의 변수를 멤버변수라고 한다.

이 코드에서의 멤버변수는 이름 그대로 움직임의 속도를 조절해주는 값이다. 밑의 Move메소드에서 참조한다.

 

그 다음 FixedUpdate메소드는 Update메소드와 비슷한데, 쉽게 말하면 주기적으로 체크해서 안의 내용을 실행하는 메소드다. 그냥 Update메소드도 똑같이 주기적으로 실행하지만, FixedUpdate는 좀 더 정확한 주기로 체크하기에 움직임 관련 기능은 이곳에서 다루는게 좋다. 다음 포스팅에서 생명주기를 다룰 예정인데, 그 곳에서 더 설명하기로 한다.

 

Move메소드 안을 살펴보면

Vector타입이 있는데, 물리를 배운 사람들은 벡터가 뭔지 알것이다.

쉽게 설명하면 힘이 있고, 그 힘의 방향까지 포함하는 개념이 벡터이다.

이것도 이해하기 어렵다면 다 제쳐두고 어느쪽으로 힘이 얼마나 가해지는지를 표현한다고 생각하면 된다.

 

Vector3는 3차원의 벡터를 이야기하며 3차원은 우리의 상식내용대로 x, y, z축을 나타낸다.

2차원 프로젝트를 다루는데 왜 3차원 값을 쓰냐?

라고 한다면 오브젝트의 transform컴포넌트 속 position이 Vector3값이기에 똑같이 맞추기 위해 여기서도 Vector3를 사용했다.

Vector3또한 유니티에 들어있는 구조체(struct)이며, 여러 기능들이 있다.

(그리고 사실 2차원 프로젝트지만 3차원으로 되어있다. z축이 카메라 눈과 정확히 일치되어 티가 안나게 존재한다.

그래서 이걸로 어떤 오브젝트가 다른 오브젝트의 위에 올라와있는 설정이나 z축에 따라 움직이면 크기도 원근법에 의해 커지거나 작아지게 할 수도 있다.)

Vector3값은 (x, y, z)형태로 들어가며, Vector3.zero는 (0, 0, 0)과 같다.

같은 맥락으로 Vector3.left는 (-1, 0, 0), Vector3.right는 (1, 0, 0)이다. 즉 x축으로 왼쪽, 오른쪽으로 1만큼 힘을 가한다는거다.

 

여기 쓴 것 말고도 더 알아보려면 Vector3에 대한 내용이 아래 유니티 공식문서에 있으니까 찾아보거나 비주얼스튜디오에서 해당 글자 우클릭-> 정의로 이동을 눌러서 찾아보는 것도 좋다.

공식 문서를 참조하면 유니티에서 사용하는 컴포넌트 값의 타입이나 리턴타입, 사용법, 포함된 메소드 등을 자세히 설명 해 놓았기 때문에 개발하면서 궁금하거나 모르는 내용은 문서를 찾아보며 공부하는 것이 중요하다.

https://docs.unity3d.com/kr/530/ScriptReference/Vector3.html

 

if문 안쪽은 Input.GetAxisRaw("Horizontal")이 양수인지 음수인지 체크한다.

유니티 왼쪽상단의 Edit -> Project Settings -> InputManager를 눌러보면 Horizontal을 확인할 수 있다.

Horizontal은 수평의 뜻을 가지고 있다. 즉 좌우 체크를 하는것이다.

 

쉽게말하면 여기 설정된 어떤 키를 입력(Input)하면 양수, 음수 체크를 할 수 있다.

필요한 것만 위 사진으로 설명하겠다.

Horizontal의 Negative Button(음수)은 left, Positive Button(양수)은 right다. 즉 키보드 방향키 왼쪽 오른쪽이다.

추가로 a와 d도 할당되어있는 것을 볼 수 있다. 게임에서 움직임에 자주 사용하는 키들이 기본적으로 할당되어있다.

 

Horizontal 외에도 자주 사용하는 Vertical(수직), Fire(총 발사), Jump(점프)같은것들도 확인해 보면 다 미리 지정되어있으며, 모두 개발자가 원하는대로 바꿔줄 수도 있다.

 

맨 위의 Size를 보면 30으로 되어있는데, 숫자를 늘리면 원하는 키를 입력했을 때 체크할 것들을 더 만들어줄 수도 있다.

 

위의 내용들을 사용하는 것은 방향키 눌린것을 체크하는 방법중의 하나로, 특정 키를 스크립트에 작성하여 체크할 수도 있다.

 

마지막의 transform.position += 어쩌고는 해당 스크립트가 포함된 오브젝트의 transform컴포넌트의 position을 설정하는 코드이다. FixedUpdate메소드는 주기적으로 메소드 안쪽을 실행한다고 했었다. 그러므로 특정 키를 눌렀을 때 주기적으로 x축을 더하거나 빼서 오브젝트를 이동시키면 그 오브젝트가 움직이는 효과를 낼 수 있다.

 

지금 사용하는 방식은 스크립트가 들어있는 오브젝트의 컴포넌트를 참조한다.

만약 스크립트는 다른 오브젝트(예를 들어 게임매니저 오브젝트)에 있고, 여기서 플레이어의 Transform을 참조하려면 어떻게 해야할까? 이런 방식은 매우 자주 사용되는 방식이다.

간단한 기능이면서 어떤 오브젝트가 그 기능 하나만 한다면, 그 오브젝트를 위해 스크립트를 하나 더 생성하는 것은 복잡하기도 하고 불필요하다고 생각한다. 그렇기에 어떤 오브젝트에서 다른 오브젝트의 컴포넌트를 참조하는 일은 자주 일어날 수 밖에 없다.

가장 간단한 방법은 public으로 해당 컴포넌트나 오브젝트를 멤버로 만든 뒤에 스크립트를 다 작성하고 인스펙터에서 추가하는 방법이다.

이외에도 스크립트 내에서 생명주기중 하나인 Start메소드 등에서 특정 오브젝트를 찾는 코드를 작성하는 방법도 있다.

공통적으로 오브젝트만 찾으면 컴포넌트 접근을 할 수 있다. 그러니까 오브젝트를 찾는 방법을 알아두는게 매우 중요하다.

위의 방법들은 나중에 사용해보기로 한다. 

 

끝의 Time.deltatime은 이전 프레임과 현재 프레임 사이까지 걸린 시간을 나타내며, 매 프레임마다 어떤 값을 더하거나 빼는 계산을 할 때 이 값을 곱해서 사용한다.

FixedUpdate에서 사용할 경우 일정한 값이 되기에, 쉽게 생각하면 일정한 타이밍으로 값을 더하거나 빼서 들쭉날쭉하게 이동하지 않게 하는 기능이라고 생각하면 된다.

그냥 Update메소드에서 이동 기능을 사용하지 않는 이유와도 귀결되는 것이다.

 

즉 위의 코드는 왼쪽 혹은 오른쪽 입력이 들어왔을 때, 일정한 간격(타이밍)으로 오브젝트를 움직이는 기능을 구현한 것이다.

거기에 멤버변수 moveSpeed를 통해 이동 속도도 조절해주는 기능까지 있는 것이다.

 

이제 젤리캐릭터한테 스크립트를 넣어주자.

방법은 여러가지다.

Player스크립트를 드래그해서 하이어라키의 플레이어에게 넣어도 되고

플레이어를 선택해서 인스펙터의 빈 공간에 스크립트를 드래그해서 넣어도 되고

플레이어 인스펙터의 Add Component를 검색해서 찾아도 된다.

 

이제 재생버튼을 누른 후에 방향키 좌우 혹은 a,d 아무거나 눌러서 움직이는지 잘 확인 해 보자.

(화살표나 a,d 아무거나 써도 되는 이유는 위의 더보기에 Input.GetAxisRaw("Horizontal")쪽 설명에 있다.)

 

그냥 움직이기만 하면 재미없다. 속도 조절도 해보자.

위 사진의 인스펙터의 Player스크립트에 보면 Move Speed라는 값이 생겼다.

이는 해당 스크립트의 멤버변수를 public으로 선언했기에 저렇게 나온다. 저 값을 1보다 크거나 작은 값으로 바꿔가면서 움직여보면 속도가 빨라지고 느려지는 것을 볼 수 있다.

 

지금까지 유니티를 처음 켰을 때 볼 수 있는 중요한 창 설명과 오브젝트 생성, 몇 가지 기능의 스크립트 작성, 적용, 애니메이션 생성까지 알아보았다.

설명한 것들이 많고 진행하면서 생각나는대로 적은거라 내용이 난잡할 수 있지만 알아두면 나중에 개발하면서 한번씩은 접하게 되는 내용들이라 나름 중요하다고 생각해서 넣은 내용들같다.

 

이 프로젝트를 이어서 움직일 때 애니메이션 바뀌는거나 체력바 설정같이 몇 개 더 올리면서 간단한 게임 하나 만들기까지 포스팅할 예정에 있다. 하지만 바로 다음 포스팅은 유니티를 사용하면서 필요한 이론적인 내용을 한 번 다뤄보려고 한다.

1년만에 다시 공부하는거니까 꼼꼼하게 천천히 공부하자.

728x90
COMMENT