스파르타 게임개발종합반(Unity)/사전캠프 공부 기록

[Unity/2D] 코드로 간격있게 카드 배치하기

테크러너 2024. 4. 5.

규칙 찾기

이런식으로 카드를 간격있게 배치 하려고 합니다.

프리팹을 복사 붙여넣기로 배치하게 되면 나중에 카드의 배치수를 100장으로 바꾼다고 한다면 효율이 좋지 않겠죠?

그래서 코드로 배치를 해보겠습니다.

 

이중 for문으로 배치하면되지 않을까 생각할수도 있는데요.

for문 하나를 써서 해결된다면 반복문은 하나만 사용하는 것이 비용면에서 좋습니다.

이중 for문의 시간 복잡도가 O(n*m)이고,

for문 하나만 사용했을 때 시간 복잡도는 O(n) 이기 때문에 더 효율적입니다.

그래서 저희는 for문 하나만 사용해서 배치해보겠습니다.

 

배치 전략

4X4형태로 카드를 배치할 것입니다.

카드의 가로, 세로 사이즈는 각각 1.3이고, 0.1 간격으로 떨어져서 배치하려고 합니다.

 

(0,0) 이런 숫자들이 있죠? 각 자리마다의 (X,Y)값을 나타낸 것입니다.

코드로 작성하려면 여기서 규칙을 찾아내야 합니다.

 

숫자로 다시 보겠습니다.

밑에서 두 번째줄을 보면

 

규칙이 보이시나요?

뒤에 +0, +1 이런 숫자들은 각 숫자들을 4로 나눴을 때 나머지입니다.

0, 1, 2, 3 이라는 4의 나머지 숫자들이 X값에 보이죠?

그리고 Y값은 4의 몫입니다.

 

자 그럼 규칙이 찾아졌습니다.

(X,Y) == (4의 나머지, 4의 몫)

이것을 이용해서 코드를 작성해보겠습니다.

 

 

코드 작성하기

public class Board : MonoBehaviour
{
    public GameObject card;

    void Start()
    {
        for(int i = 0; i < 16; i++)
        {
            GameObject go = Instantiate(card, this.transform); // 임시 변수

            float x = (i % 4) * 1.4f; // 나머지 * 카드 간격
            float y = (i / 4) * 1.4f; // 몫 * 카드 간격

            go.transform.position = new Vector2(x, y); // 카드 배치
        }
    }
}

아까 X는 4의 나머지라고 했죠? 그래서 i % 4입니다.

Y는 4의 몫이니까 i / 4 입니다.

그리고 각 카드사이의 간격이 있었죠? 그래서 1.4f를 곱해준 것입니다.

 

실행해보면 0,0에서 시작됐기 때문에 화면 밖을 빠져나간 것을 확인할 수 있습니다.

위치를 재조정해봅시다.

 

 

 

카드 배치의 시작 위치 설정

플레이한 상태에서 생성된 카드들을 모두 선택합니다.

 

Scene창에서 화살표 버튼 클릭

 

X,Y값을 움직입니다.

 

첫 번째 카드값을 살펴보면 X는 -2.1, Y는 -3 정도에 배치해주면 되겠네요!

 

            float x = (i % 4) * 1.4f - 2.1f; // 나머지 * 카드 간격
            float y = (i / 4) * 1.4f - 3.0f; // 몫 * 카드 간격

옮길 값만큼 x, y에 추가해주면 됩니다~

 

 

결과

 

 

 

다음편

2024.04.08 - [Unity/2D] - [Unity/2D] 랜덤 정렬 - OrderBy, OrderByDescending, ToArray, Random.Range

반응형

댓글