public void ConstructGateIfNotExists(RoomInfo roomFrom, RoomInfo roomTo) { if (roomFrom.Gates.Exists(x => rooms[x.RoomTo.x, x.RoomTo.y] != null && rooms[x.RoomTo.x, x.RoomTo.y].Equals(roomTo)) && roomTo.Gates.Exists(x => rooms[x.RoomTo.x, x.RoomTo.y] != null && rooms[x.RoomTo.x, x.RoomTo.y].Equals(roomFrom))) { return; } Vector2Int localPosFrom = new Vector2Int(); Vector2Int localPosTo = new Vector2Int(); RoomInfo roomFromCopy = new RoomInfo(roomFrom.Position) { Size = roomFrom.Size }; roomFromCopy.GenerateGates(rooms); RoomInfo roomToCopy = new RoomInfo(roomTo.Position) { Size = roomTo.Size }; roomToCopy.GenerateGates(rooms); foreach (GateInfo gate in roomFromCopy.Gates) { if (rooms[gate.RoomTo.x, gate.RoomTo.y] != null && rooms[gate.RoomTo.x, gate.RoomTo.y].Position == roomTo.Position) { localPosFrom = gate.LocalPosition; } } foreach (GateInfo gate in roomToCopy.Gates) { if (rooms[gate.RoomTo.x, gate.RoomTo.y] != null && rooms[gate.RoomTo.x, gate.RoomTo.y].Position == roomFrom.Position) { localPosTo = gate.LocalPosition; } } roomFrom.AddGate(localPosFrom, rooms); roomTo.AddGate(localPosTo, rooms); }