2023 동계 모각코

[2023 모각코] 4회차 (2024.01.19.)

수빈최 2024. 1. 19. 17:42

학습 목표
<레트로의 유니티 게임프로그래밍 에센스> 6장을 통한 유니티 학습
 

 

학습 내용
: 사방에서 날아오는 탄알을 피하는 탄막 슈팅게임 만들기 1 (맵, 플레이어 만들기)
 

 

 

Dodge라는 이름의 새 프로젝트를 생성하고 게임을 실행하기 위한 바닥을 생성함

(위치가 원점이 아닌 경우 position을 (0,0,0)으로 세팅하여 오브젝트 위치를 리셋할 수 있음)

가로와 세로 길이를 두배로 늘리기 위해 scale을 (2,1,2)로 변경

 

* * * * *

plane의 기본 크기는 가로세로 10유닛(unit)으로, 유니티에서 1유닛은 Cube 한 변의 길이와 같음

위의 경우 scale을 (2,1,2)로 변경했기 때문에 가로세로의 길이는 각각 20유닛이 됨

 

1유닛을 현실의 몇 미터에 대응시킬 것인지는 개발자 마음이지만 보통 편의상 1유닛을 1미터 취급

* * * * *

 

 

 

게임 오브젝트의 색상은 셰이더와 텍스쳐가 합쳐진 에셋인 Material이 결정함

 

프로젝트 창에서 Plane Color이라는 이름을 가진 Material을 생성한 후

물체 표면의 기본색을 결정하는 Albedo(반사율) 값을 검은색 rgb(0,0,0)으로 변경하여 plane에 적용함

 

 

 

이제 게임 도중 플레이어가 바닥에서 떨어지지 않도록 plane 오브젝트 사방에 벽을 추가함

cube 오브젝트의 position값과 scale값을 각각 조정하여 한면의 벽을 생성

동일한 방법으로 사방에 벽을 생성함

 

 

왼쪽 이미지는 기존의 게임 창, 오른쪽 이미지는 변경 후 게임 창

 

기존의 게임 창을 살펴보면 카메라가 바닥 가까이에 붙어있기 때문에 맵이 한눈에 잘 보이지 않음

Main Camera 게임 오브젝트의 position과 rotation값을 조절해 한눈에 내려다볼 수 있는 곳으로 옮기고

Camera 컴포넌트의 Clear Flags 값을 Solid Color로 변경하여 단색으로 설정함

 

 

 

맵을 완성했으므로 3D Object의 Capsule을 통해 플레이어를 생성하고

플레이어의 색상이 될 Player Color이라는 이름의 Material을 생성함

파란색 캡슐 형태의 플레이어를 만들기 위해 Albedo 값을 (0,100,164)로 변경

 

나중에 탄알을 만들 때 탄알 입장에서 충돌한 게임 오브젝트가 플레이어인지 확인하기 위해

Player 게임 오브젝트의 Tag를 Player로 설정

 

 

 

Player 게임 오브젝트를 움직이기 위해 물리적인 상호작용이 가능하도록 Rigidbody를 추가

하지만 기본 설정 그대로 사용하면 플레이어가 오뚝이처럼 넘어질 수 있으므로

Constraints 창에서 높이가 변경되지 않고 y축 방향으로만 회전하여 좌우를 살필 수 있도록 설정

 

 

 

Player 게임 오브젝트를 조종하기 위해 PlayerController라는 이름을 가진 C# Script를 생성

Rigidbody를 사용하여 게임오브젝트를 움직여야하므로 playerRigidbody와 speed 변수를 선언함

 

사용자의 입력을 감지하기 위해 한 프레임에 한번, 매 프레임 반복실행되는 Update() 메소드에

Input.GetKey() 메소드를 사용해 상하좌우 방향키를 감지하여 게임 오브젝트를 해당방향으로 이동하게 함

 

또, 플레이어의 사망처리를 실행할 Die() 메소드를 구현함

해당 메소드는 스스로 실행되는 것이 아닌, 플레이어에 부딪힌 탄알이

Player 게임 오브젝트의 PlayerController 컴포넌트에 접근하여 실행될 것임

 

 

 

playerRigidbody 변수에 Player 게임 오브젝트의 Rigidbody 컴포넌트를 할당한 후

게임을 실행해 봤는데 관성 때문에 조작이 게임에 즉시 반영되지 않는 것을 알 수 있었음

 

 

 

유니티에서 직접 드래그앤드롭으로 Rigidbody를 할당하지 않아도 되도록

Start() 메소드에서 게임 시작 시에 Rigidbody 컴포넌트를 찾아 playerRigidbody에 할당하게 함

 

또, AddForce 특성상 속도가 올라가는데 시간이 걸려 방향이 바로 변하지 않는 조작감을 개선하기 위해

Input.GetAxis() 메소드를 통해 Rigidbody의 velocity에 할당하도록 코드를 수정함

 

Input.GetAxis() 메소드는 축에 해당하는 입력키의 입력을 감지하여 출력값을 반환함

Horizontal 축의 경우 ← 또는 A 키는 -1, 아무것도 누르지 않을 때 0, → 또는 D키에 1을 반환

Vertical 축의 경우 ↓ 또는 S키는 -1, 아무것도 누르지 않을 때 0, ↑ 또는 W 키에 1을 반환

 

Rigidbody의 velocity를 수정하는 것은 이전 속도를 지우고 새로운 속도를 사용하는 것으로

힘을 누적하여 속력을 점차 증가시키는 AddForce() 메소드와 다르게

관성을 무시하고 속도가 즉시 변경되어 반영됨