멍멍은댕댕의 개발공간

피하기 게임 만들기 - 2 <캐릭터 움직이기> [유니티 2D 기초 강좌] 본문

유니티 강좌/유니티 기초 강좌 (2D)

피하기 게임 만들기 - 2 <캐릭터 움직이기> [유니티 2D 기초 강좌]

멍멍은댕댕 2019. 9. 14. 17:32

피하기 게임 만들기 (이전 강좌)

1. 프로젝트 세팅: https://doggie-development.tistory.com/7

 

 

안녕하세요, 취미로 유니티 강좌를 작성하고 있는 "멍멍은댕댕"입니다.

 

저번 시간에는 게임을 만들기 위한 준비까지만 했었죠. 이번에는 캐릭터를 생성해보고, 캐릭터 조작을 만드는 두 가지 방식에 대해서 알려드리겠습니다.

 

 

 

준비물

1. 유니티 최신 버전 (저는 2019.2.2로 작업했습니다.)

2. 저번 시간까지 작업한 작업물

 

 

 

강좌를 PDF로 보고 싶다면? 

피하기게임_2.pdf
1.88MB

 

 

 

멍댕 유니티 강좌 첫 번째!

 

 

 

 

 

 

 

 

 

Sprites 폴더를 더블클릭하면 그 안에 들어있는 스프라이트(이미지 파일)들이 나옵니다.

이번에 피하기 게임을 만들면서 사용할 그림들입니다.

 

 

스프라이트를 꾹 누른 채로 씬 화면 위에 가져간 후,

원하는 위치에서 마우스를 떼면 해당 스프라이트를 가진 물체를 생성할 수 있습니다.

 

 

Hierarchy 에서 씬에 배치된 오브젝트(물체)들을 확인할 수 있습니다.

방금 생성한 Player 오브젝트가 선택되어 있습니다.

 

 

오브젝트가 선택되어 있다면 크기나 방향을 수정하는 등의 작업을 할 수 있습니다.

오브젝트 모서리의 파란 점이나 테두리를 드래그하여 크기를 조절해보세요.

 

 

TIP

Shift 를 누르고 있으면 비율을 유지한 채로 크기를 조절할 수 있습니다.

 

 

Game 을 누르면 실제 게임 화면에서 어떻게 보이는지 확인할 수 있습니다.

배경이 퍼렇게 흐리멍텅한 것이 마음에 들지 않는다면 변경할 수 있습니다.

 

 

하이어라키 창에서 “Main Camera“오브젝트를 선택하면

인스펙터 창에 해당 오브젝트의 컴포넌트(속성)들이 나타납니다.

 

 

Transform: 오브젝트에 위치, 방향, 크기 의 속성을 부여하는 컴포넌트

 

Camera: 게임 속 세계를 촬영하여 플레이어가 볼 수 있도록 해주는 컴포넌트

카메라가 없다면 게임 화면을 볼 수 없다

 

 

카메라 컴포넌트의 속성 중 “Background”를 선택하면

배경색을 설정할 수 있습니다.

 

 

이제 Player 오브젝트에 움직일 수 있는 기능을 추가할 것인데요.

이런한 기능은 스크립트를 이용해서 만든 후 추가해주어야 합니다.

 

 

정리는 처음부터 깔끔하게 해야죠!

우선 스크립트를 담을 폴더를 만들어줍시다.

 

 

폴더의 이름은 Scripts로 해주세요.

그다음 Scripts 폴더를 더블클릭하여 들어가주세요.

 

그리고 안에 C# Script를 만들어주세요.

 

 

스크립트의 이름은 Player로 정해주세요.

 

 

스크립트를 더블클릭하면 스크립트를 편집할 수 있는 다른 프로그램이 열립니다.

최신 버전의 유니티는 기본적으로 Visual Studio라는 프로그램을 이용합니다.

 

Visual Studio가 열렸을 때 로그인하라는 안내가 나오면

마이크로소프트 계정으로 로그인 (없다면 만든 후) 해야합니다.

 

 

위 화면처럼 나오면 됩니다. 굉장히 낯선 화면!

여기에서 무엇을 어떻게 해야 할지, 차근차근 알아봅시다.

 

 

 

 

Visual Studio의 기본 설명과 주의사항을 말씀드렸습니다.

이제 캐릭터가 움직이도록 코드를 작성해보겠습니다.

 

 

위처럼 Update 함수 안에 코드를 적어주세요.

 

 

이렇게 묶여있는 단위를 함수라고 부릅니다.

 

함수의 이름Update이며, Update 함수가 실행될 때

중괄호{}로 묶여있는 부분이 실행됩니다. (여러 줄일 시 윗줄부터 아래로 실행됨)

 

 

Start 함수와 Update 함수유니티에 기본 기능으로 들어있는 특별한 함수하나입니다.

 

Start 함수게임이 시작될 때 실행되고,

Update 함수는 게임이 진행되는 동안 매 프래임마다 실행됩니다(1초에 약 60)

 

이외에도 다양한 기본 함수가 있지만, 나중에 알아봅시다.

 

 

 

앞서 작성한 코드를 설명해드리겠습니다.

 

 

1초에 약 60, x좌표에 0.1을 더해 주는 코드! , 오른쪽으로 움직이는 것입니다.

 

 

Ctrl키와 S키를 같이 누르면 스크립트 변경 내역이 저장됩니다.

코드 왼쪽 노란 선이 초록색으로 변하면 적용이 된 것입니다.

 

저장을 하지 않으면 유니티에 적용이 되지 않으니, 스크립트를 수정하고 나면 꼭 저장하세요!

 

 

 

유니티로 돌아와, Player 오브젝트를 선택해주세요.

 

 

 

이렇게 스크립트가 컴포넌트로 등록이 되면 오브젝트에 적용된 것입니다.

 

 

시작 버튼을 눌러 게임을 실행해보세요. 캐릭터가 오른쪽으로 움직일 것입니다.

게임을 멈추려면 시작 버튼을 다시 누르면 됩니다.

 

 

다시 스크립트 편집 창으로 돌아와서, 위처럼 코드를 수정해주세요.

 

 

함수의 바깥 부분에 새로운 코드를 작성했다는 점에 유의해야 합니다. 함수 안에 작성하면 에러가 납니다.

 

이 코드는 무엇을 의미할까요?

 

 

 

 

Vector2xy값이 같이 묶여 있는 형태이므로,

speed_vec (0.1, 0), (-1, 5), (0, 0.6) 등의 값을 저장할 수 있습니다.

 

 

그리고 이렇게 speed_vec의 값을 가져와 사용할 수 있습니다.

speed_vec(0.1, 0)이라면 (0.1, 0)만큼 움직이는 것이죠.

 

 

스크립트를 저장했을 시, 유니티에 돌아오면 저렇게 Speed_vec 변수가 나타납니다.

변수를 public으로 선언했기 때문이죠.

 

위 그림처럼 변수의 값을 (0.1,  0)으로 변경해보세요.

 

 

시작 버튼을 눌러 게임을 실행해보면,

처음과 똑같이 오른쪽으로 움직이는 것을 볼 수 있습니다.

 

 

변수의 값을 수정하면 다른 방향으로도 움직입니다.

 

이 원리를 응용해 위쪽 방향키를 누르면 변수의 값을 (0,  0.1),

오른쪽 방향키를 누르면 (0.1,  0)로 바꾸는 식으로 캐릭터 조작을 만들 수 있겠죠?

 

 

위와 같이 스크립트를 수정해주세요. "조건문"이라고 불리는 새로운 문법이 나왔습니다.

 

 

 

 

 

 

조건문이 어떻게 쓰였는지, 다음 코드를 한줄한줄 설명해드리겠습니다.

 

 

 

 

아무 키도 누르지 않았을 시, 속도는 (0, 0)이어야 한다.

Vector2.zero 가 바로 (0, 0)이다.

키가 눌린 상황은 다음 코드에서 다룬다.

 

 

Input.GetKey특정 키가 눌렸는지(true) 아닌지(false) 알려준다.

KeyCode.RightArrow는 오른쪽 키를 뜻한다.

즉 이것은 오른쪽 키를 눌렀는지 아닌지 확인하는 코드.

 

 

(오른쪽 키가 눌렸다면) speed_vec 변수의 x 부분에 0.1을 더한다.

speed_vec(0, 0)에서 (0.1, 0)이 되는 것이다.

 

 

speed_vec 만큼 움직인다.

따라서 오른쪽 키를 눌렀다면 (0.1, 0)만큼 움직이며,

아무 키도 누르지 않았다면 (0, 0)만큼 움직인다.

 

 

오른쪽 키가 눌렸는지 확인하는 것을 만들었으니, 다른 키 눌림도 확인할 수 있겠죠?

 

상하좌우 눌림을 모두 인식하고, speed_vec을 바꾸도록 만들었습니다.

 

 

 

 

게임을 실행하면 누르는 방향키의 방향으로 잘 움직입니다!

그러면 캐릭터가 움직이는 속도를 조절하려면 어떻게 해야 할까요?

 

 

speed라는 이름의 실수형(float) 변수를 추가해주세요.

실수형 변수는 소수를 포함한 숫자를 저장할 수 있습니다. (3.141, 9.999…)

 

 

그리고 기존 0.1f였던 부분을 모두 speed로 변경해주세요.

 

 

유니티로 돌아가서 Speed의 값을 0.2정해주세요.

이렇게 Speed 변수의 값만 수정하면 속도를 한 번에 변경할 수 있도록 만들 수 있습니다.

 

 

게임을 테스트하다가 수십 번 기본 속도를 변경해야 할 수도 있고, 또 아이템이나 능력치에 따라 속도가 변해야 할 수도 있으므로 변수를 사용하는 것은 상당히 중요한 일입니다.

 

 

이렇게 캐릭터가 움직일 수 있도록 만들었습니다.

하지만 또 다른 방법도 있습니다! 두 번째 방법을 알려드리겠습니다.

 

 

우선 위와 같이 정수형(int) 변수를 추가해주세요.

-1, 0, 1, 2… 정수만 들어갈 수 있는 변수입니다.

 

 

그리고 기존의 코드를 if(move_method == 0)으로 묶어주세요.

 

 

즉 if(move_method == 0)는 move_method가 0인지 확인하는 것이죠.

 

주의할 점은 =이 두 개 있다는 점입니다. =을 하나만 붙이면 완전히 다른 뜻(변수의 값을 ~로 변경해라)가 되므로 아주 조심해야 합니다.

 

 

그리고 위처럼 코드를 추가해주세요.

 

else if는 말 그대로 “~가 아니면, 만약 인가?”라는 뜻입니다.

위쪽에서 move_method0인지 확인하는데,

0이 아니라면 이곳으로 내려와 1인지 확인하는 것입니다.

 

 

그리고 move_method1일 때위 코드를 실행하도록 작성해주세요.

 

 

hoizontal수평의라는 의미고, vertical수직의라는 의미죠.

위쪽 코드는 좌우 눌림, 아래쪽 코드는 상하 눌림인식해서 받아옵니다.

 

값은 -1~1 받아옵니다.

 

 

그리고 값을 -1에서 1 사이로 받아오기 때문에

speed곱해주어 설정한 속도대로 움직이도록 만들었습니다.

 

키를 누르지 않았을 때는 0을 받아오기 때문에, 누르지 않은 상황을 따로 처리할 필요는 없습니다.

 

 

유니티로 돌아와서 Move_method1바꿔주면

새로 작성한 코드대로 움직이게 할 수 있습니다.

 

 

게임을 실행해보면 움직일 때는 부드럽게 빨라지고, 멈출 때도 부드럽게 멈춥니다.

Input.GetAxis(string)은 이렇게 관성 움직임을 자동으로 만들어줍니다.

 

 

 

캐릭터 조작을 만드는 두 가지 방법을 배웠습니다.

다음 시간에는 "충돌"에 대해서 알려드리겠습니다.