내일배움캠프 TIL

내일배움캠프 3일차 TIL "반복문, 배열"

Jooglorystar 2024. 9. 11. 21:38

 

'게임 개발이 처음이어도 쉽게 배우는 모바일 게임 개발' 4주차 강의를 학습 하였다.

대부분 1~3주차 강의때 다룬 것의 반복, 응용이었지만, 4주차 강의에서 제일 특징적이라고 생각한 것은 반복문과 배열이었다.

4주차 강의에서 만든 게임은 카드를 뒤집어 짝을 맞추는 게임이다. 그 과정에서,

 

1. 카드를 특정 횟수만큼 반복하여 생성하고

2. 생성될 때는 각 카드가 서로 일정한 간격으로 생성되어야 하며,

3. 그 카드들은 무작위로 섞여야 한다.

 

라는 과정이 필요하다.

 

밑의 예시들은 실제 강의 내에서 사용한 게임이 아닌, 위의 과정을 응용한 다른 예시이다.

 

1. 반복문

그동안 게임에서 무언가 반복 작업을 하는데는 InvokeRepeating(string, float, float)을 Start()에서 사용하였다.

 

 

그러나 이렇게 할 경우 Time.timeScale이 0이 되지 않는 한, 무한히 작동하게 되어, 특정 횟수만큼 반복하는데는 사용하기 힘들었다.

그러나 반복문을 이용하면 원하는 횟수만큼 생성할 수 있게 된다.

 

 

반복문에는 여러 종류가 있는 것으로 알고 있지만, 본 강의에서 사용한 것은 for구문 이었다.

for(int i = 0; i < 10; i++)는

 

1. 정수 i를 0에서 부터

2. 10보다 작을 때 까지,

3. i에 1씩 더한다.

 

라고 분석할 수 있다.

 

그리고 i가 10이 된다면 반복문 내에 있는 코드를 실행하지 않는다.

위의 코드를 유니티에서 실행한다면, Debug 로그에 "i는 0" 같은 문자열이 생성될 것이다.

 

문자열에서 $와 {}를 쓰면 변수를 문자열내에 삽입할 수 있다.

 

 

즉 카드를 9장을 생성시키고 싶다면 위와 같은 식으로 반복문을 만들고

GameObject로 가져온 card Prefab을 Instantiate하면

 

 

Scene에 card 9개가 생성된 것을 확인할 수 있다.

 

 

하지만 게임 화면을 보면 말 그대로 생성만 9개가 됐을 뿐, 모두 겹쳐서 생성되었다.

 

다음은 카드를 일정한 간격으로 배치할 차례이다.

 

 

2. 카드 배치

 

생성한 카드는 총 9개이므로 3 x 3 형태로 배치할 예정이다. 

0부터 9까지의 숫자를 순서대로 배치한다고 했을때, 다음과 같이 표현할 수 있을 것이다.

[6]  [7]  [8]   ㅣ   [0,2]  [1,2]  [2,2]

[3]  [4]  [5]   ㅣ   [0,1]  [1,1]  [2,1] 

[0]  [1]  [2]   ㅣ   [0,0]  [1,0]  [2,0]

 

왼쪽은 숫자를 표시한 것이고, 우측은 좌표를 표시한 것이다.

우측의 좌표를 보면, [n] 안에 있는 숫자를 3으로 나눈 것의 나머지와 몫임을 알 수 있다.

이를 이용한다면, 다음과 같이 표현할 수 있을 것이다.

 

 

 

하지만 위의 코드대로 실행할 경우, 순서대로 배열은 된 듯 하나, 모든 card들이 겹쳐 생성된 것을 확인할 수 있다.

본 card의 제일 큰 sprite의 scale은 1.3이다.

 

검은 Square sprite위에 하얀 Square를 배치하여 태두리를 구현했다.

 

그리고 각 카드마다 0.1의 간격을 가지도록 원한다면 각 카드는 1.4만큼 떨어져 있어야할 것이다.

 

 

그러나 이대로 바로 간격을 넓힌다면, card들은 화면 밖으로 빠져나가거나 위의 시간 초를 가릴 수 있다.

저 x와 y값에서 적절한 수를 더하고 빼서 위치를 맞춰 줄 수 있다.

 

이 경우는 1.4f였다

 

 

카드가 적절한 위치에 표시되는 것을 확인할 수 있다.

 

 

3. 카드에 무작위 숫자 입력하기

 

다음과 같은 정수배열을 사용하여 구현해볼 것이다.

 

int[] arr = { 0, 1, 2, 3, 4, 5, 6, 7, 8 };

 

위와 같은 정수배열은

arr이라는 이름의 정수배열에 0부터 8이 순서대로 들어가 있음을 의미한다.

 

배열에서는 arr[n] 같은 식으로 배열의 n번째에 있는 변수를 불러올 수 있다.

단, 배열의 첫 번째 변수는 arr[1]이 아닌 arr[0] 임을 주의하여야한다.

배열 변수의 무작위 화를 위해서, 첫 using문에 using System.Linq;을 추가한다.

 

using System.Linq;

 

Linq는 OrderBy를 이용하기 위해 필요했다.

 

OrderBy()는 배열을 재배치하는데 사용한다.

본 과정에서는 람다식을 이용하여 0부터 8까지의 정수를 랜덤으로 배치하였다.

OrderBy를 이용할 경우 결과물은 배열이 아니다. 이를 다시 배열로 사용하고자 할 경우, ToArray()를 이용해 다시 배열로 바꿔주는 절차가 필요하다.

 

 

 

Debug.Log로 확인 결과, 잘 섞인 것을 확인할 수 있다. 실제로, 기동할 때마다 무작위로 섞일 것이다.

 

이번엔 이 무작위로 섞인 숫자를 카드에 입력해볼 것이다.

 

Card 스크립트에 다음과 같이 입력한다.

 

Board 스크립트에서 무작위로 생성된 arr[n]을 Card의 idx에 입력하고,

이를 num Text로 표현할 것이다. 

 

Board에는 다음과 같이 추가한다.

 

 

Card라는 스크립트 컴포넌트의 Setting 함수를 불러오는 코드이다.

이 Setting 함수에 arr[i] 를 삽입 함으로서, 

Card 스크립트에서 idx에 무작위로 섞인 arr[i]를 입력할 수 있다.

 

 

 

5번째 카드의 Card 스크립트다. idx가 2인 것을 확인할 수 있다.

 

실행해보면 위 처럼 무작위로 섞인 카드를 확인할 수 있다.

 

 

---

 

 

오늘 익힌 내용은 단순히 강의 내용을 따라하기 보다, 한번 다른 형태로 응용해 보는 것이 좋을 것 같아, 스스로 예제를 만들어 보았다. 이 과정에서 배운 내용을 어떻게 적용해야할지 생각해보는 것은 배운 개념을 익히는데 더 도움이 됐던 것 같다.