본문 바로가기
Unity

2024/03/27 Unity기초 프로젝트 Roll-A-Ball 게임 만들기1

by 민정e 2024. 3. 27.

이 프로젝트는 Unity Learn의 Rall-A-Ball 프로젝트를 베이스로 진행된다. 글에 작성되지 않은 부분은 다음 링크의 진행 가이드와 동일하게 설정 하였다.

 

 

https://learn.unity.com/project/roll-a-ball-1?uv=2020.2

 

Roll-a-Ball - Unity Learn

Roll-a-Ball 학습 프로젝트를 소개합니다. 이 학습 프로젝트에서 다루는 내용은 다음과 같습니다. Unity 에디터와 빌트인 기능을 사용하여 간단한 게임 환경 설정 커스텀 스크립트를 작성하여 게임

learn.unity.com

 

Player를 움직이도록 만들기

PlayerController 스크립트를 만들어준다.

스크립트의 가장 윗 항목을 보면 다음과 같이 작성이 되어있는 것을 볼 수 있다.

 

namespace

 

namespace는 라이브러리를 뜻하고, using함수는 파이썬의 import 함수와 같이 라이브러리를 불러오는 함수이다.

그 아래에는 다음과 같이 작성이 되어있다.

 

 

여기서  Start() 함수는 중괄호 안의 내용을 맨 처음 한번만 실행(ex. player 생성) , Update() 함수는 중괄호 안의 내용을 매 프레임마다 한번 실행(게임 중 계속 실행이 된다)(ex. 움직이는 logic) 하도록 되어있는 함수이다.

class안에 다음과 같이 작성을 해준다.

코딩을 시작하기에 앞서 한가지 중요한 부분이 있는데 , 사용하고자 하는 모든 데이터와 값에 변수(이름)을 만들어주어야한다.

 

 

플레이어의 speed와 움직임을 관장하는 항목을 생성해주고, 스크립트가 들어갈 게임 오브젝트 즉, 플레이어의 rigidbody 컴포넌트에 접근하여 불러올 rb항목을 생성해준다.

여기서 public은 unity엔진에서 보이는 변수이다.(변수 공개) Unity에서 변경가능하며,  start문에서 강제성이 필요하다.

반면 private는 unity엔진에서 보이지 않는 변수이다.(변수 비공개) Unity에서 변경이 불가능하다.

Vector3는 x, y, z 방향의 벡터를 뜻한다.

 

플레이어에 스크립트를 넣어주었다. public으로 설정해준 speed는 보이는 반면, private로 설정해준 moveDirection은 보이지 않는 것을 볼 수 있다.

 

player를 움직이기에 앞서,Start()함수안에 rb에 플레이어의 rigid body를 불러오는 코드를 작성해준다.

 

unity의 gameObject에서 Rigidbody component를 불러와서 rb로 명명하겠다 라는 의미이다.

 

여기서 GameObject란 Hierarchy에 있는 모든 물체들을 뜻한다.

 

여기에 있는 모든 물체들이 Game Object이다.

 

 

클래스 안에 OnMove()라는 함수를 생성해주고, 중괄호 안에 함수의 내용을 작성한다.

공이 좌우, 앞뒤로만 움직일 것이기 때문에 Horizontal, Vertical의 값을 받아오도록 다음과 같이 작성해주었다.

 

Input Manager 시스템의 Axes값을 받아올때 Input.GetAxis("원하는 값"); 의 형태로 불러온다.

 

코드를 위와 같이 작성하면 실행을 시킨 후 방향키를 누르면 다음과 같이 공이 움직인다.(adws로도 조작이 가능하다.)

 

플레이 영상

 

 

이는 Horizontal과 Vertical안에 다음과 같이 설정이 되어있기 때문이다.

 

 

adws를 사용하지 않고싶으면 해당 값을 지워주면 된다.

 

하지만 그냥 Update를 사용하면  한가지 문제가 생기는데, 이는 컴퓨터 성능에 따라 속도가 달라지게 된다는 것이다. 따라서 Update를 Fixed Update로 바꾸어준다. Fixed Update는 성능과 관계없이 속도를 고정해주고싶을 때 사용한다.

 

카메라 움직임 설정하기

카메라가 player를 따라 움직이게 만들기 위해, CameraController스크립트를 생성한다.

클래스 안에 player, 카메라와 player사이의 거리차이 값인 offset항목을 만들어준다.

이후, Start() 함수안에 offset을 계산해서 저장하도록 해준다.

Update()함수 대신 LateUpdate()함수를 사용해서 카메라의 위치를 플레이어의 위치 + offset으로 설정해 준다.

LateUpdate()함수는 불필요한 리소스를 줄여 최적화를 할 수 있는 함수이다.

 

 

메인 카메라에 해당 스크립트를 component로 추가한 후 다음과 같이 설정해주면 흔히 게임에서 많이 보는 3인칭 플레이 화면이 완성된다.

 

player에 Player를 설정해준다.

 

플레이 영상

 


Coin  회전하게 만들기

coin을 회전하게 만들어주기 위해 Rotator 스크립트를 만들어준다.

여기서는 변수를 따로 설정해 주지 않는다. coin은 게임이 플레이되는 내내 회전해야하므로 Update()함수에 코드를 작성해준다.

변수를 따로 설정 해 주지 않으면, 해당 스크립트를 가지고 있는 물체가 돈다. 너무 빠르지 않고 부드럽게 회전시키기 위해 Time.deltaTime을 사용해주었다. 이를 사용 해 주지 않으면, 코인이 매 프레임마다 회전하기 때문에 매우 빠르게 돌게 된다.

 

 

스크립트를 적용시켜주면 다음과 같이 움직이는 것을 볼 수 있다.

 

플레이 영상

 

 

prefab(프리팹)

만들어 놓은 오브젝트를 그대로 불러올 수 있는 기능이 있다.(하나의 asset을 저장하는 느낌)

Hierarch에 있는 오브젝트를 asset창에 드래그 하면 만들 수 있음

 

플레이어에 닿았을 때  Coin이 사라지도록 하기

PlayerController 스크립트에 OnTriggerEnter 함수를 생성해준다.

OnTriggerEnter함수는 게임 중에 트리거 충돌 감지를 하면 중괄호 안의 내용을 발동하는 함수이다. 

SetActive(false)를 해주어 닿았을때 코인이 비활성화되어 보이지 않도록 설정해준다.

 

코인을 먹으면 사라지게 설정

 

여기서 말하는 other는 충돌된 트리거에 해당한다. 그 다음, 코인의 Box Collider에 Is Trigger항목을 체크해주고, 

 

게임을 실행하면 다음과 같이 된다.

Is Trigger 항목 체크

 

플레이 영상