public void PlaceTileColliders(SuperMap map, SuperTile tile, TileIdMath tileId, Vector3Int pos) { // Do we have any collider objects defined for this tile? if (!tile.m_CollisionObjects.IsEmpty()) { var polygons = AcquireTilePolygonCollection(tile, tileId, map.m_Orientation); foreach (var poly in polygons.Polygons) { // Offset the polygon so that it is in the location of the tile var offset = map.CellPositionToLocalPosition(pos.x, pos.y, m_ImportContext); var points = poly.Points.Select(pt => pt + offset).ToArray(); CollisionClipperKey key = poly.MakeKey(); CollisionClipper clipper; if (!m_CollisionClippers.TryGetValue(key, out clipper)) { // Add a new clipper for the layer clipper = new CollisionClipper(); m_CollisionClippers.Add(key, clipper); } // Add the path to our clipper if (poly.IsClosed) { clipper.AddClosedPath(points); } else { clipper.AddOpenPath(points); } } } }
public void PlaceTileColliders(SuperMap map, SuperTile tile, TileIdMath tileId, Vector3Int pos) { Assert.IsNotNull(m_Tilemap, "Need a Tilemap component if we are going to gather tile colliders"); // Tile y position is always off by one pos.y++; // Do we have any collider objects defined for this tile? if (!tile.m_CollisionObjects.IsEmpty()) { var polygons = AcquireTilePolygonCollection(tile, tileId); float cell_w = m_Tilemap.cellSize.x; float cell_h = m_Tilemap.cellSize.y; float halfCell_w = m_Tilemap.cellSize.x * 0.5f; float halfCell_h = m_Tilemap.cellSize.y * 0.5f; foreach (var poly in polygons.Polygons) { // Offset the polygon so that it is in the location of the tile var tileHeight = m_ImportContext.MakeScalar(tile.m_Height); var tileDiff = m_Tilemap.cellSize.y - tileHeight; var offset = Vector2.zero; // Our offset depends on map orientation. Isometric is such a pain in the ass. if (map.m_Orientation == MapOrientation.Isometric) { var x = (pos.x - pos.y) * halfCell_w; var y = (pos.x + pos.y) * halfCell_h; offset = new Vector2(x + halfCell_w, y - tileDiff); } else { offset = new Vector2(pos.x * cell_w, pos.y * cell_h - tileDiff); } var points = poly.Points.Select(pt => pt + offset).ToArray(); CollisionClipperKey key = poly.MakeKey(); CollisionClipper clipper; if (!m_CollisionClippers.TryGetValue(key, out clipper)) { // Add a new clipper for the layer clipper = new CollisionClipper(); m_CollisionClippers.Add(key, clipper); } // Add the path to our clipper if (poly.IsClosed) { clipper.AddClosedPath(points); } else { clipper.AddOpenPath(points); } } } }
public void PlaceTileColliders(SuperMap map, SuperTile tile, TileIdMath tileId, Vector3Int pos) { Assert.IsNotNull(m_Tilemap, "Need a Tilemap component if we are going to gather tile colliders"); // Do we have any collider objects defined for this tile? if (!tile.m_CollisionObjects.IsEmpty()) { var polygons = AcquireTilePolygonCollection(tile, tileId, map.m_Orientation); foreach (var poly in polygons.Polygons) { // Offset the polygon so that it is in the location of the tile var offset = map.CellPositionToLocalPosition(pos.x, pos.y); if (map.m_Orientation == MapOrientation.Isometric || map.m_Orientation == MapOrientation.Staggered) { offset -= m_ImportContext.MakePointPPU(map.m_TileWidth, 0) * 0.5f; } else if (map.m_Orientation == MapOrientation.Hexagonal) { offset -= m_ImportContext.MakePointPPU(map.m_TileWidth, map.m_TileHeight) * 0.5f; } var points = poly.Points.Select(pt => pt + offset).ToArray(); CollisionClipperKey key = poly.MakeKey(); CollisionClipper clipper; if (!m_CollisionClippers.TryGetValue(key, out clipper)) { // Add a new clipper for the layer clipper = new CollisionClipper(); m_CollisionClippers.Add(key, clipper); } // Add the path to our clipper if (poly.IsClosed) { clipper.AddClosedPath(points); } else { clipper.AddOpenPath(points); } } } }
public void PlaceTileColliders(SuperTile tile, TileIdMath tileId, Vector3Int pos) { Assert.IsNotNull(m_Tilemap, "Need a Tilemap component if we are going to gather tile colliders"); // Tile y position is always off by one pos.y++; // Do we have any collider objects defined for this tile? if (!tile.m_CollisionObjects.IsEmpty()) { var polygons = AcquireTilePolygonCollection(tile, tileId); foreach (var poly in polygons.Polygons) { // Offset the polygon so that it is in the location of the tile var tileHeight = m_ImportContext.MakeScalar(tile.m_Height); var tileDiff = m_Tilemap.cellSize.y - tileHeight; var offset = new Vector2(pos.x * m_Tilemap.cellSize.x, pos.y * m_Tilemap.cellSize.y - tileDiff); var points = poly.Points.Select(pt => pt + offset).ToArray(); CollisionClipperKey key = poly.MakeKey(); CollisionClipper clipper; if (!m_CollisionClippers.TryGetValue(key, out clipper)) { // Add a new clipper for the layer clipper = new CollisionClipper(); m_CollisionClippers.Add(key, clipper); } // Add the path to our clipper if (poly.IsClosed) { clipper.AddClosedPath(points); } else { clipper.AddOpenPath(points); } } } }