He escrito un prototipo de algo como esto. Creé algunos recursos que se veían así:
Entonces, básicamente, este objeto "ShipPart" tiene puntos de ajuste predefinidos. Estos cuatro colisionadores ayudarán a determinar si está intentando colocar un objeto en su lugar o no.
Luego creé una clase ShipPart, que contiene algunas cosas 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 ;
También contiene funciones y propiedades para ayudar a arrastrar y soltar, y verificar el estado de los ShipParts vecinos.
Una función importante es la función Adjuntar (), que conectará este ShipPart a su Barco.
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);
}
Luego, finalmente, la clase Barco, realiza un seguimiento de su pieza principal, todas las partes adjuntas, todos los datos de los barcos se gestionan aquí. Puede emitir rayos para piezas de barcos en esta clase. Verifique la parte que está arrastrando actualmente para ver si alguno de los colisionadores está colisionando con otras partes.
Si hay una colisión, verifique si la rotación está dentro de su umbral especificado y luego ajústela en su lugar.
En realidad, esto es mucho más complicado de explicar de lo que pensé que sería. Avíseme si tiene preguntas y explicaré lo que necesite para obtener más ayuda.