Unity로 3-Match 퍼즐의 그리드 생성하기

안녕하세요! 지난 포스팅에서 3-Match 퍼즐의 이동 로직을 다뤘는데요, 이번에는 그리드를 생성하고 캐릭터를 배치하는 방법에 대해 알아보려고 합니다. 아직 Unity 초보라서 간단하게만 작성해봤어요. 함께 보시죠! 😄

GridManager 클래스 소개

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GridManager : MonoBehaviour
{
    public int gridHeight = 6;
    public GameObject row1Prefab;
    public GameObject row2Prefab;
    public CharacterManager characterManager;
    public CharacterPool characterPool;

    private int currentRow = 1;

    public IEnumerator GenerateInitialGrid()
    {
        for (int y = 0; y < gridHeight; y++)
        {
            GameObject newRow = GenerateRow(new Vector3(0, 1 - y, 0));
            currentRow = (currentRow == 1) ? 2 : 1;
        }

        yield return new WaitForSeconds(1.0f);
        foreach (Transform rowTransform in transform)
        {
            SpawnCharactersInRow(rowTransform);
        }
    }

    public void AddRow() // row생성 호출 시 추가 row 생성
    {
        gridHeight++;
        GameObject newRow = GenerateRow(new Vector3(0, -gridHeight + 1, 0));
        SpawnCharactersInRow(newRow.transform);
        currentRow = (currentRow == 1) ? 2 : 1;
    }

    private GameObject GenerateRow(Vector3 position)
    {
        GameObject rowPrefab = (currentRow == 1) ? row1Prefab : row2Prefab;
        return Instantiate(rowPrefab, position, Quaternion.identity, transform);
    }

    private void SpawnCharactersInRow(Transform rowTransform)
    {
        for (int i = 0; i < rowTransform.childCount; i++)
        {
            Transform gridTransform = rowTransform.GetChild(i);
            GameObject characterPrefab = 
            characterManager.GetRandomCharacterPrefab();
            Vector3 newPosition = new Vector3(gridTransform.position.x, 
            gridTransform.position.y, -0.5f);
            GameObject characterInstance = 
            characterPool.GetPooledObject(characterPrefab);
            characterInstance.transform.position = newPosition;
            characterInstance.transform.SetParent(gridTransform, true);
            characterInstance.SetActive(true);

            // Disable all child objects except for the one named "level0"
            for (int j = 0; j < characterInstance.transform.childCount; j++)
            {
                Transform child = characterInstance.transform.GetChild(j);
                if (child.name != "level0")
                {
                    child.gameObject.SetActive(false);
                }
            }
        }
    }
}

이 클래스는 게임 보드의 그리드를 관리합니다.

변수 설명

  • gridHeight: 그리드의 초기 높이입니다.
  • row1Prefab, row2Prefab: 두 종류의 행 프리팹입니다.
  • characterManager: 랜덤 캐릭터를 가져오는 역할을 합니다.
  • characterPool: 사용 가능한 캐릭터 오브젝트 풀입니다.
  • currentRow: 현재 생성 중인 행의 번호입니다.

그리드 생성하기

public IEnumerator GenerateInitialGrid()
    {
        for (int y = 0; y < gridHeight; y++)
        {
            GameObject newRow = GenerateRow(new Vector3(0, 1 - y, 0));
            currentRow = (currentRow == 1) ? 2 : 1;
        }

        yield return new WaitForSeconds(1.0f);
        foreach (Transform rowTransform in transform)
        {
            SpawnCharactersInRow(rowTransform);
        }
    }

이 함수는 게임 시작 시 초기 그리드를 생성합니다.

추가 행 생성하기

   public void AddRow() // row생성 호출 시 추가 row 생성
    {
        gridHeight++;
        GameObject newRow = GenerateRow(new Vector3(0, -gridHeight + 1, 0));
        SpawnCharactersInRow(newRow.transform);
        currentRow = (currentRow == 1) ? 2 : 1;
    }

이 함수는 새로운 행을 그리드의 맨 위에 추가합니다.

행 생성 함수

   private GameObject GenerateRow(Vector3 position)
    {
        GameObject rowPrefab = (currentRow == 1) ? row1Prefab : row2Prefab;
        return Instantiate(rowPrefab, position, Quaternion.identity, transform);
    }

이 함수는 주어진 위치에 새 행을 생성하고 반환합니다.

행에 캐릭터 배치하기

private void SpawnCharactersInRow(Transform rowTransform)
    {
        for (int i = 0; i < rowTransform.childCount; i++)
        {
            Transform gridTransform = rowTransform.GetChild(i);
            GameObject characterPrefab = 
            characterManager.GetRandomCharacterPrefab();
            Vector3 newPosition = new Vector3(gridTransform.position.x, \
            gridTransform.position.y, -0.5f);
            GameObject characterInstance = 
            characterPool.GetPooledObject(characterPrefab);
            characterInstance.transform.position = newPosition;
            characterInstance.transform.SetParent(gridTransform, true);
            characterInstance.SetActive(true);

            // Disable all child objects except for the one named "level0"
            for (int j = 0; j < characterInstance.transform.childCount; j++)
            {
                Transform child = characterInstance.transform.GetChild(j);
                if (child.name != "level0")
                {
                    child.gameObject.SetActive(false);
                }
            }
        }
	}

이 함수는 주어진 행에 랜덤 캐릭터를 배치합니다.