Eu escrevi um protótipo de algo assim. Criei alguns recursos parecidos com este:
Então, basicamente, esse objeto "ShipPart" possui pontos de snap predefinidos. Esses quatro coletores ajudarão a determinar se você está tentando encaixar um objeto no lugar ou não.
Em seguida, criei uma classe ShipPart, que contém algumas coisas como:
//Neighbor information
ShipPart Left, Right, Top, Bottom;
//current rotation
float Rotation;
//The ship core it is attached to
Ship Ship;
//The coordinates in references to the ship core
int X ;
int Y ;
Ele também contém funções e propriedades para ajudá-lo a arrastar e soltar e verificar o estado dos ShipParts vizinhos.
Uma função importante é a função Attach (), que conectará este ShipPart ao seu navio.
public void Attach(Ship ship, int x, int y)
{
GetComponent<Rigidbody2D> ().isKinematic = true;
Ship = ship;
X = x;
Y = y;
transform.parent = Ship.transform;
transform.position = Vector2.zero;
transform.localPosition = new Vector2(x, -y);
}
Por fim, a classe Ship envia um registro de sua peça principal, todas as peças anexadas e todos os dados dos navios são gerenciados aqui. Você pode fazer radiodifusão para peças de navios nesta classe. Verifique a parte que você está arrastando no momento para ver se algum dos colididores está colidindo com outras partes.
Se houver uma colisão, verifique se a rotação está dentro do limite especificado e encaixe-a no lugar.
Isso é realmente muito mais complicado de explicar do que eu pensava. Deixe-me saber se você tiver dúvidas e eu irei detalhar o que você precisar de mais ajuda.