
'게임 개발이 처음이어도 쉽게 배우는 모바일 게임 개발' 1주차 강의에서는 '빗물받는 르탄이'라는 게임을 제작해보며 유니티의 기본을 익힌다.
1주차 강의에서는 유니티허브에서 프로젝트를 만드는 것에서부터, 캐릭터의 조작과 애니메이션, 점수를 얻기 위한 오브젝트를 생성하고 파괴하는 것을 포함하여 하나의 게임으로 보이는 결과물을 만든다. 따라서 금일 학습한 내용을 단어 하나로 요약한다면 유니티 사용의 기본이라고 말할 수 있다.
1.
유니티에서는 Hierarchy 창에서 오브젝트(Object)를 생성할 수 있다.
사각형(Square), 원(Circle)과 같은 2D 오브젝트부터, 직육면체(Cube)나 구(Sphere)와 같은 3D 오브젝트까지 생성할 수 있다.
그러한 오브젝트들은 Inspector 창에서 그 오브젝트들이 가진 컴포넌트(Component)를 볼 수 있다.
컴포넌트는 그 오브젝트에 여러 속성을 부여해주는 역할을 한다. (ex. 위치, 크기, 색상, 움직임, 물리, 코드 등)
2.
2D 게임에서의 오브젝트의 움직임은 애니메이션(Animation)으로 부여할 수 있다.
움직임을 표현할 수 있는 여러 스프라이트(Sprite)를 이용하면 애니메이션을 통해 오브젝트에 생동감있는 움직임을 부여할 수 있다.
3.
유니티에서 어떤 오브젝트를 스스로 움직이게 만들거나, 사용자가 조작하여 움직이게 만들기 위해서는 C#을 이용한 코딩이 필요하다.
유니티를 이용해 스크립트를 만든다면 기본적으로 Start()함수와 Update() 함수가 존재한다.
Start() 함수는 스크립트가 시작될 때 딱 한번만 실행이 된다.
Update() 함수는 프레임(frame)마다 지속적으로 실행이 된다. 이는 컴퓨터의 사양에 따라 조작이 다른 것을 유발할 수 있으므로
Application.targetFrameRate = 60;
와 같은 코드를 통해 프레임을 고정해주는 작업이 필요할 수 있다.
4.
어떤 오브젝트를 움직이게 만들기 위해서는 해당 오브젝트의 transform 컴포넌트의 position을 설정해야한다.
단, 이 position은 'transform.position.x += 1;' 같은 식으로 각 x, y, z 값을 각각 조정할 수 없으며,
'transform.position += new Vector3(1f,0,0);' 같은 식으로 x, y, z 의 값을 동시에 불러와야 한다.
혹은, 'transform.position += Vector3.right;'이나 'transform.position += Vector3.left;' 같은 비교적 더 직관적인 코드를 이용할 수 있다. 각각 'transform.position += new Vector3(1f,0,0);'와 'transform.position += new Vector3(-1f,0,0);'랑 같은 기능을 하는 코드이다.
Vector3.right와 같은 식을 사용할 경우 연산자를 이용해 원하는 값으로 바꿀 수 있다.
Ex) transform.position += Vector3.right * 0.05f;
5.
캐릭터의 조작을 위해 특정 컴포넌트를 코드로 수정할 필요가 있을 때, transform과 같이 불러오고자 한다면 생각한 대로 조작이 되지 않을 수 있다.
이를태면 SpriteRenderer 컴포넌트의 flipX를 수정하고 싶을 경우에, transform때와 같이
spriteRenderer.flipX = ture;
같은 식으로 코드를 적으면 작동하지 않는다.
이럴 경우 컴포넌트를 변수로 만들어 주는 작업과 그 변수에 컴포넌트를 가져오는 작업이 필요하다.
코드로 표현하면 하단과 같은 모습이다.
---
SpriteRenderer renderer; // renderer 변수 생성
void Start()
{
renderer= GetComponent<SpriteRenderer>(); // renderer 변수에 SpriteRenderer 컴포넌트 부여
}
void Update()
{
renderer.flipX = true;
}
---
GetComponent를 이용하면 오브젝트의 컴포넌트에 접근을 할 수 있게 된다.
6.
오브젝트에 밑으로 떨어지는 중력을 부여하기 위해서는 Rigidbody라는 컴포넌트가 필요하다.
또한 오브젝트에 충돌 판정을 넣기 위해서는 Collider 이라는 컴포넌트가 필요하다.
충돌을 감지하기 위해서는 OnCollisionEnter2D(Collision2D collision) 라는 함수가 필요하다.
그리고 조건문을 활용하여 충돌한 오브젝트를 파괴하거나, 점수를 얻는 등의 기능을 만들 수 있다.
오브젝트를 파괴할 경우 Destroy() 함수를 사용할 수 있다.
각 오브젝트는 tag를 부여할 수 있는데, 이 태그는 기존에 만들어진 태그를 이용하거나 직접 태그를 이름 붙일 수 있다.
충돌 감지 관련해서 태그를 이용할 경우,
if(collision.gameObject.CompareTag("Ground"))
{
Destroy(this.gameObject);
}
같은 식으로 조건문을 작성할 수 있다. ("Ground" 태그를 가진 오브젝트에 충돌 시 충돌한 오브젝트 파괴)
7.
만약 무작위 값이 필요한 경우 Random.Range(min, max); 와 같은 코드를 사용할 수 있다.
정수의 무작위 값을 사용하는 경우, max에 적은 정수는 무작위값으로 나오지 않으므로 1을 더한 숫자를 적어야한다.
ex. Random.Range(1, 3) 이라고 할 경우 1, 2의 숫자만 나온다.
8.
프리팹(PreFabs)을 이용하여 특정 오브젝트를 반복적으로 생성되게 할 수 있다.
이를 위해서 전체적인 게임 시스템을 담당하는 GameManager 가 필요하다.(C# script로 생성)
프리팹을 생성하기 위해서는 Hierarchy 탭에 있는 오브젝트를 Project 탭으로 드래그하면 된다.
Scene에서 해당 오브젝트가 사라지더라도 해당 프리팹을 불러오는 코드를 이용하면 계속 생성할 수 있다.
반복적인 작업을 위해서는 InvokeRepeating("MakeRain", 0f, 1f); 같은 식의 함수를 이용할 수 있다.
첫번째 매개변수의 문자열은 반복할 함수, 두번째 매개변수는 언제부터 반복할 것인가를, 세번째 매개변수는 반복하는 시간을 의미한다.
프리팹을 생성할 수 있는 함수는 Instantiate() 함수이며, 매개변수로는 변수로 부여한 게임오브젝트의 변수명을 입력한다.
ex.
---
(전략)
public GameObject rain;
(중략)
void MakeRain()
{
Instantiate(rain);
}
(후략)
---
9.
UI(User Interface)를 이용하면 게임의 점수나 제한시간을 표시할 수 있다.
UI는 Canvas라는 오브젝트에 표시가 되는데, 이는 게임 카메라가 아닌 화면에 표시가 된다.
(Main Camaer 오브젝트로 볼 수 있는 창에서는 UI가 표시되지 않고, 게임창에서만 표시가 된다.)
10.
해당 게임을 만드는데는 싱글톤이란 게임디자인이 활용되었다. 실제로는 더 복잡하지만, 1주차 강의에선 간단한 형식으로 학습하였다.
---
public static GameManager Instance;
void Awake()
{
Instance = this;
}
---
11.
UI에서 생성한 텍스트를 실제 게임의 값을 반영하기 위해서는 UI의 텍스트를 받는 과정과 그 받은 텍스트를 수정하는 과정이 필요하다.
using UnityEngine.UI;
public Text totalScoerTxt;
텍스트를 수정할때 주의할 점은 텍스트는 문자열이란 사실이다.
totalScoreTxt.text = totalScore;
같은 식으로 쓸 수 없으며,
totalScoreTxt.text = totalScore.ToString();
ToString()을 이용하여 해당 변수(정수, 실수)를 문자열로 바꿔줄 필요가 있다.
만약 실수형의 소수점 자리수를 지정하고 싶다면, totalTime.ToString("N2") 같은 식으로 쓸 경우 소수점 둘째자리 까지만 표시하도록 할 수 있다.
12.
유니티에서 시간과 관련된 함수로는 Time.deltaTime이 있다. 이는 기기에 상관없이 같은 시간이 흐르도록 한다.(frame에 따라 바뀌지 않음)
Time.timeScale = 0f; 를 이용할 경우 게임의 시간 흐름을 멈출 수 있다.
반대로 Time.timeScale = 1f; 를 입력하면 다시 시간을 흐르게 할 수 있다.
13.
Button 컴포넌트는 오브젝트에 버튼 기능을 부여한다. 기능을 필요로하는 스크립트를 만들고, 버튼 컴포넌트의 On Click에서 그 스크립트를 기능하게 할 수 있다.
14.
using UnityEngine.SceneManagement;를 불러온 후
SceneManager.LoadScene("SceneName");를 입력하면 해당 Scene을 다시 불러올 수 있다.
---
이전에 Unity관련 서적으로 해 본 내용이었지만, 많이 잊어버렸었다.
해당 강의를 들으며 그것들을 다시 새겨넣는 좋은 시간이 되었다.
'내일배움캠프 TIL' 카테고리의 다른 글
| 내일배움캠프 6일차 TIL "C#의 자료형, 변수, 연산자" (0) | 2024.09.19 |
|---|---|
| 내일배움캠프 5일차 TIL "게임을 빌드하는 법" (0) | 2024.09.13 |
| 내일배움캠프 4일차 TIL "게임 추가요소" (0) | 2024.09.12 |
| 내일배움캠프 3일차 TIL "반복문, 배열" (0) | 2024.09.11 |
| 내일배움캠프 2일차 TIL "보다 심화적인 내용으로" (0) | 2024.09.10 |