Ho scritto un prototipo di qualcosa del genere. Ho creato alcune risorse che assomigliavano a questa:
Quindi sostanzialmente questo oggetto "ShipPart" ha punti di snap predefiniti. Questi quattro collider aiuteranno a determinare se stai tentando di far scattare un oggetto in posizione o meno.
Successivamente ho creato una classe ShipPart, che contiene alcune cose come:
//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 ;
Contiene inoltre funzioni e proprietà per facilitare il trascinamento della selezione e il controllo dello stato dei ShipParts vicini.
Una funzione importante è la funzione Attach (), che collegherà questo ShipPart alla tua nave.
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);
}
Quindi, infine, la classe Ship, tiene traccia del tuo pezzo Core, di tutte le parti allegate, tutti i dati delle navi vengono gestiti qui. Puoi effettuare il raycast per le parti di navi in questa classe. Controlla la parte che stai trascinando per vedere se qualcuno dei collider si sta scontrando con altre parti.
In caso di collisione, verificare se la rotazione rientra nella soglia specificata, quindi bloccarla in posizione.
Questo in realtà è molto più complicato da spiegare di quanto pensassi. Fammi sapere se hai domande e approfondirò qualsiasi cosa tu abbia bisogno di più aiuto.