Я написал прототип чего-то вроде этого. Я создал несколько ресурсов, которые выглядели так:
Таким образом, в основном этот объект «ShipPart» имеет заранее определенные точки привязки. Эти четыре коллайдера помогут определить, пытаетесь ли вы привязать объект к месту или нет.
Затем я создал класс ShipPart, который содержит некоторые вещи, такие как:
//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 ;
Он также содержит функции и свойства, которые помогут с перетаскиванием и проверкой состояния соседних ShipParts.
Важной функцией является функция Attach (), которая подключит этот ShipPart к вашему кораблю.
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);
}
Затем, наконец, класс Ship, отслеживает вашу базовую часть, все прикрепленные части, все данные о кораблях обрабатываются здесь. Вы можете raycast для частей корабля в этом классе. Проверьте ту часть, которую вы сейчас перетаскиваете, чтобы увидеть, сталкивается ли какой-либо из коллайдеров с другими частями.
Если есть столкновение, проверьте, находится ли вращение в пределах указанного порогового значения, а затем зафиксируйте его на месте.
Это на самом деле намного сложнее объяснить, чем я думал. Дайте мне знать, если у вас есть вопросы, и я подробно остановлюсь на том, что вам нужно.