유니티

유니티 Roll-a-ball 간단한 게임 만들기

nock_ji 2022. 4. 17. 13:47

 

유니티 기초 3D 게임 만들기

 

 

간단한 공굴리기 게임 만들기 

 

*게임 개발은 계획부터 차근차근 !

유니티에서 기초적인 튜토리얼 'Roll-a-ball' 

 

Roll-a-ball 설명
#1. 게임 이름 굴러서 아이템 먹기
#2. 장르 캐주얼 액션
#3. 목표 지형을 뛰어넘어 굴러서 아이템을 먹고 목표지점에 도달
#4. 구성 공(Player), 아이템(Item), 지형(Platform), 결승점 (Point)

 

 


 

1.  플레이어 생성 및 조작

 

구를 생성하여 Player로 지정해주고, 할당 스크립트Rigidbody 컴포넌트를 추가합니다 

 

 

 

 

✏️  Player 상하좌우 조작

- Rigidbody 선언 및 초기화

- 방향 조작 로직 

 

 

 

 

✏️  Player Jump

- Input 버튼 중, Jump (space바) 가능하도록 설정

- Player의 Inspector창에서 JumpPower을 조절할 수 있도록 public 선언

 

 

 

 

 

✏️  한 번 만 Jump

현재 Jump가 연속적으로 가능한 상태입니다 (2단 점프 가능)

그러나 게임에서 Player공이 한 번만 뛰도록 설정해야합니다

 

 

🔻 Jump 여부를 결정하는 bool을 선언 

- 점프 할 때 : isJump = true

- 점프 안 할 때 : isJump = false / !isJump = true

 

 

- Player가 위치한 Floor에 Collision 컴포넌트 추가

- Floor 이름의 오브젝트를 만나면, isJump는 false 

- !isJump조건에 의해 Jump 중일 때는 연속적으로 점프를 할 수 없다

 

 

🔻 상하좌우 버튼 , Jump 버튼에 맞게 움직임 (한 번 만 Jump)

 


 

2. 아이템 생성 및 먹기

 

 

✏️   아이템 생성

 


 

✏️  아이템 회전

아이템이 제자리에서 회전하는 로직

 

 

📌  Rotate (Vector3 회전 좌표 * 회전값 크기) 

매개변수 기준으로 회전시키는 함수

Vector3.up 은 (0, 1, 0) 이다

 

- Item의 Inspector창에서 RotateSpeed값 조정

- 오브젝트 좌표축을 기준으로 회전

 

 

🔻 그러나 오브젝트의 좌표 축을 기준으로 회전하기 때문에 이렇게 플레이 된다

 


 

✏️  회전 축을 World 로 변경하기

 

 

해당 오브젝트가 Local : 회전 축이 오브젝트 중심

Global로 변경하여 회전축이 Scene World 중심이 되도록 해줍니다

 

🔻 로직에도 Space가 World 중심임을 적음 (Space.Local / Space.Wolrd)

 

 


 

3. Player가 아이템 먹기

 

- Player와 아이템이 닿으면 아이템이 사라짐

- 닿은 아이템 개수를 셈

 

 

🔻 Collider 컴포넌트 추가 /  Is Trigger 활성화

 

🔻 닿은 아이템 개수를 세기위해 Player 로직에 public으로 itemCount 설정

 

 

 

✏️  Player 로직에서 'Item' 태그를 가진 오브젝트를 만나면, itemCount 개수 증가 & 사라지는 로직

 

📌  SetActive(bool) 

오브젝트 활성화 함수, false 설정함으로써 비활성화되어 Scene에서 사라짐


 

✏️   아이템을 먹으면 효과음 나게 하기

Player 에 Audio Source 컴포넌트 추가

 

 

📌  Audio Source

사운드 재생 컴포넌트, Audio Clip 필요

 

 

📌  Audio Clip

- 사운드 파일 컴포넌트

- 사용할 효과음을 AudioClip에 넣기

- Play On Awake 비활성화 해제 (플레이시 바로 재생X)

 

 

- Player 로직에 AudioSource 컴포넌트를 선언

- 아이템을 만나면 사라지는 로직 (OnTrigger--)에 사운드재생 함수 추가

📌  audio.Play();

 


 

4. Tag 설정하기

 

오브젝트에 각각 Tag를 설정하여 묶을 수 있습니다

Item은 Item 태그로 묶어주겠습니다 

 

🔻 Add Tag - 태그 추가하기

 

 

- Player가 아이템과 만나는 로직에서 수정

- 기존 other.name 에서 .tag로 변경 (모든 이름을 적지 않고, Tag를 설정한 오브젝트가 할당됨)

 

 

 


 

5. Player 시점으로 카메라 조정 

 

 

🔻 기존 Main Camera 시점

 

 

- Camera 할당 스크립트을 새로 생성

- Tag로 Player 오브젝트 찾기

카메라와 떨어지는 일정거리 = 현재 카메라 위치 - Player 공 위치

 

📌  LateUpdate()

모든 업데이트가 끝난 후 마지막으로 사용하는 함수

캐릭터를 따라가는 카메라, 후처리 등에서 사용합니다

 

 

🔻 Player 시점에서 따라가는 카메라 


 

6. 씬 변경

 

 

✏️ 아이템을 모두 먹은 후 도달할 Finish Point 생성

 

- Tag Point 생성

- Collider 컴포넌트 생성, isTrigger 활성화 체크

 


 

✏️  아이템을 모두 먹으면 다음 씬으로 넘어가는 부분

- GameManager 생성

- 총 아이템 개수와 먹은 아이템 개수 비교

- 다음 씬 생성

 

 

📌 GameManager 생성

형태가 없고 전반적인 로직을 가진 오브젝트를 매니저로 지정

 

🔻 총 아이템의 개수를 public으로 설정

 

 

🔻 아이템 개수 만큼 지정

 

 

🔻 Player 로직에 GameManager을 public으로 불러와 넣어줍니다

 


 

✏️  아이템을 모두 얻으면 다음 씬으로, 그렇지 않으면 재시작

 

- Player가 원기둥 Finsih Point tag 'Point'를 만났을 때 먹은 아이템 개수를 비교

- 먹은 아이템 개수 = 총 아이템 개수 같으면 다음 씬으로, 그렇지 않으면 현재 씬을 다시 불러옵니다

 

 

📌 SceneManager

장면을 관리하는 기본 클래스

 

📌 LoadScene()

주어진 장면을 불러오는 함수

 

 

📣 중요!  SceneManager을 사용하기 위해서는 유니티 엔진에서 SceneManagement를 반드시 가져와야합니다

 

 

📣  중요! Scene을 불러오려면 꼭 Bulid Setting에서 'Add Open Scenes' 추가해야합니다 

 

 

✏️  Scene 간단하게 표시

- GameManager를 이용해 stage를 숫자로 정의

- LoadScene()의 매개변수는 장면순서 (int)도 가능하기 때문에 간편하게 이를 사용합니다 

 

시작 Scene : 1 

다음 씬 : 2 (+1...)

🔺 Stage 순서를 반드시 적어줍니다

 


 

7.  Player 공이 떨어졌을 때 재시작하기

 

- GameManager은 보이는 실체는 없지만, Collider를 추가하여 투명 박스를 만들 수 있습니다

- Floor보다 크게 만들어 위치하기 

- IsTrigger 활성화 체크하기

 

 

✏️ GameManager Collider가 Player와 만나면 해당 씬을 재시작하는 로직

 

📣 SceneManagement 추가 

 

 


 

8.  UI 만들기

 

 

🔻 캔버스를 생성하여 PlayerCountText / TotalItemCount 를 만듭니다 

 

 

 

 

- Public으로 Text 형태를 생성하여 각각 Text에 해당하는 컴포넌트를 할당합니다 

- 총 아이템 개수를 stageCountText , 먹은 아이템 개수를 PlayerCountText

- GetItem 함수를 생성하여 매개변수 count 

 

 

 

🔻 GetItem 으로 먹은 아이템 개수를 manager로 보내 PlayerCountText를 증가시킵니다 

Player logic

 


 

9.  빌드 / 내보내기

 

🔻 Build Setting에서 플랫폼을 정하고 Build 시킵니다 

 

 

 

🔻 하나의 앱으로 완성되고 플레이 할 수 있습니다

 

 

🔻 녹화 상의 이유로 소리가 나지 않지만 완성 !