유니티 기초 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를 증가시킵니다
9. 빌드 / 내보내기
🔻 Build Setting에서 플랫폼을 정하고 Build 시킵니다
🔻 하나의 앱으로 완성되고 플레이 할 수 있습니다
🔻 녹화 상의 이유로 소리가 나지 않지만 완성 !
'유니티' 카테고리의 다른 글
유니티 3D 쿼터뷰 액션게임 만들기 - 플레이어 점프 / 회피 (0) | 2022.04.19 |
---|---|
유니티 3D 쿼터뷰 액션게임 - 플레이어 이동 (0) | 2022.04.18 |
유니티 게임 인터페이스 UI 기초 / Canvas / Text / Image / Button (0) | 2022.04.13 |
유니티 물리 충돌 이벤트 / OnCollision-- / OnTrigger-- (0) | 2022.04.12 |
유니티 물체 이동하기 AddForce / ForceMode / AddTorque (0) | 2022.04.11 |