Sistema de Grid para Building

Olá galera! Gostaria de saber se alguém possui um material para estudo sobre sistema de construção por grid. Estou buscando na net mas gostaria de saber da comunidade. É para um projeto pessoal, no mais obrigado pela atenção.

Você pode usar o componente Grid da Unity para alinhar seus objetos em uma grade. Para jogos 3D, lembre-se de configurar Cell Swizzle do Grid para XZY (eixo horizontal no chão), conforme a imagem:

:triangular_flag_on_post: Para usar o componente Grid, você tem que estar com o pacote 2D Tilemap Editor instalado no projeto (você encontra ele no Package Manager, aba de Unity Registry).

Exemplo de Script

O script abaixo permite instanciar um prefab na posição do mouse, encaixando automaticamente na grade:

  • Botão direito do mouse → cria um novo prefab para ser posicionado
  • Botão esquerdo do mouse → confirma a posição e “fixa” o objeto
using UnityEngine;

public class GridBuild : MonoBehaviour
{
    public Grid grid;               // Referência ao Grid da cena
    public GameObject prefab;       // Prefab que será instanciado

    private GameObject currentObj;  // Objeto sendo posicionado
    private Camera mainCam;

    void Start()
    {
        mainCam = Camera.main;
    }

    void Update()
    {
        // Botão direito do mouse instancia um novo prefab (pode trocar para outro evento se preferir)
        if (Input.GetMouseButtonDown(1))
        {
            if (currentObj == null)
            {
                currentObj = Instantiate(prefab);
            }
        }

        // Enquanto tiver um objeto sendo colocado, ele segue o mouse
        if (currentObj != null)
        {
            Vector3 mousePos = Input.mousePosition;
            Ray ray = mainCam.ScreenPointToRay(mousePos);

            if (Physics.Raycast(ray, out RaycastHit hitInfo))
            {
                // Pega a posição da célula mais próxima usando o Grid
                Vector3Int cellPos = grid.WorldToCell(hitInfo.point);
                Vector3 worldPos = grid.GetCellCenterWorld(cellPos);

                // Atualiza a posição do objeto
                currentObj.transform.position = worldPos;

                // Quando o jogador clicar com o botão esquerdo, fixa a posição e libera para um novo
                if (Input.GetMouseButtonDown(0))
                {
                    currentObj = null;
                }
            }
        }
    }
}