public static void SetWorldPosition(this SuperLayer layer, SuperMap map, SuperImportContext context) { // Accumlate positions up the tree Vector3 position_w = new Vector3(); foreach (var parent in layer.gameObject.GetComponentsInParent <SuperLayer>()) { position_w += (Vector3)context.MakePoint(parent.m_OffsetX, parent.m_OffsetY); position_w.z += parent.gameObject.GetSuperPropertyValueFloat(StringConstants.Unity_ZPosition, 0); } // Add an additional offset if our tileset is present. These coordinates have already been transformed. if (layer is SuperTileLayer || layer.GetComponent <Tilemap>() != null || layer.GetComponent <SuperTilesAsObjectsTilemap>() != null) { position_w += context.TilemapOffset; } layer.transform.position = position_w; // This sucks but we have to correct for isometric orientation for image layers if (layer is SuperImageLayer && map.m_Orientation == MapOrientation.Isometric) { float dx = context.MakeScalar(map.m_Height * map.m_TileHeight); layer.transform.Translate(-dx, 0, 0); } }
private void CalculateTransform() { Matrix4x4 matTileOffset = Matrix4x4.Translate(m_ImportContext.MakePoint(m_Tile.m_TileOffsetX, m_Tile.m_TileOffsetY)); if (!m_TileId.HasFlip) { m_Transform = matTileOffset; return; } var tileCenter = m_ImportContext.MakeSize(m_Tile.m_Width, -m_Tile.m_Height) * 0.5f; Matrix4x4 matTransIn = Matrix4x4.identity; Matrix4x4 matFlip = Matrix4x4.identity; Matrix4x4 matTransOut = Matrix4x4.identity; // Go to the tile center matTransIn = Matrix4x4.Translate(-tileCenter); // Do the flips if (m_TileId.HasHorizontalFlip) { matFlip *= HorizontalFlipMatrix; } if (m_TileId.HasVerticalFlip) { matFlip *= VerticalFlipMatrix; } if (m_TileId.HasDiagonalFlip) { matFlip *= DiagonalFlipMatrix; } // Go out of the tile center if (!m_TileId.HasDiagonalFlip) { matTransOut = Matrix4x4.Translate(tileCenter); } else { float diff = m_ImportContext.MakeScalar(m_Tile.m_Height - m_Tile.m_Width) * 0.5f; tileCenter.x += diff; tileCenter.y -= diff; matTransOut = Matrix4x4.Translate(tileCenter); } // Put it all together Matrix4x4 mat = matTileOffset * matTransOut * matFlip * matTransIn; // Remember our transformation matrix m_Transform = mat; }
private static void AddBoxCollider(GameObject go, CollisionObject collision, SuperTile tile, SuperImportContext importContext) { var box = go.AddComponent <BoxCollider2D>(); box.offset = importContext.MakePoint(collision.m_Size) * 0.5f; box.size = importContext.MakeSize(collision.m_Size); float height = importContext.MakeScalar(tile.m_Height); var xpos = importContext.MakeScalar(collision.m_Position.x); var ypos = importContext.MakeScalar(collision.m_Position.y); go.transform.localPosition = new Vector3(xpos, height - ypos); go.transform.localEulerAngles = new Vector3(0, 0, importContext.MakeRotation(collision.m_Rotation)); go.AddComponent <SuperColliderComponent>(); }
// Creates a new object, attached to the parent, with a specialized layer component public static T AddSuperLayerGameObject <T>(this GameObject goParent, SuperLayerLoader loader, SuperImportContext importContext) where T : SuperLayer { GameObject goLayer = new GameObject(); // Read in the fields common across our Tiled layer types var layerComponent = loader.CreateLayer(goLayer) as T; Assert.IsNotNull(layerComponent); // Add the object to the parent goLayer.name = layerComponent.m_TiledName; goParent.AddChildWithUniqueName(goLayer); // Position the layer based on the x, y offsets and pixels per unit goLayer.transform.localPosition = importContext.MakePoint(layerComponent.m_OffsetX, layerComponent.m_OffsetY); return(layerComponent); }
public static void SetWorldPosition(this SuperLayer layer, SuperImportContext context) { // Accumlate positions up the tree Vector3 position_w = new Vector3(); foreach (var parent in layer.gameObject.GetComponentsInParent <SuperLayer>()) { position_w += (Vector3)context.MakePoint(parent.m_OffsetX, parent.m_OffsetY); position_w.z += parent.gameObject.GetSuperPropertyValueFloat(StringConstants.Unity_ZPosition, 0); } // Add an additional offset if our tileset is present. These coordinates have already been transformed. if (layer is SuperTileLayer || layer.GetComponent <Tilemap>() != null || layer.GetComponent <SuperTilesAsObjectsTilemap>() != null) { position_w += context.TilemapOffset; } layer.transform.position = position_w; }
// Creates a new object, attached to the parent, with a specialized layer component public static T AddSuperLayerGameObject <T>(this GameObject goParent, SuperLayerLoader loader, SuperImportContext importContext) where T : SuperLayer { GameObject goLayer = new GameObject(); // Read in the fields common across our Tiled layer types var layerComponent = loader.CreateLayer(goLayer) as T; Assert.IsNotNull(layerComponent); // Add the object to the parent goLayer.name = layerComponent.m_TiledName; goParent.AddChildWithUniqueName(goLayer, loader.WorldPositionStays); // fixit - tile layers use local space, other layers don't // fixit - object placement is now broken because they are no longer using localPosition and layers may have an offset // Position the layer based on the x, y offsets and pixels per unit goLayer.transform.localPosition += (Vector3)importContext.MakePoint(layerComponent.m_OffsetX, layerComponent.m_OffsetY); return(layerComponent); }
private static void AddEllipseCollider(GameObject go, CollisionObject collision, SuperTile tile, SuperImportContext importContext) { // Add a circle collider if width == height. Otherwise, we have to use am approximate polygon representation. if (collision.m_Size.x == collision.m_Size.y) { var cirlce = go.AddComponent <CircleCollider2D>(); cirlce.offset = importContext.MakePoint(collision.m_Size) * 0.5f; cirlce.radius = importContext.MakeScalar(collision.m_Size.x) * 0.5f; float height = importContext.MakeScalar(tile.m_Height); var xpos = importContext.MakeScalar(collision.m_Position.x); var ypos = importContext.MakeScalar(collision.m_Position.y); go.transform.localPosition = new Vector3(xpos, height - ypos); go.transform.localEulerAngles = new Vector3(0, 0, importContext.MakeRotation(collision.m_Rotation)); go.AddComponent <SuperColliderComponent>(); } else { AddPolygonCollider(go, collision, tile, importContext); } }
private void ProcessLayerData(GameObject goLayer, XElement xData) { Assert.IsNotNull(goLayer); Assert.IsNotNull(goLayer.GetComponent <SuperTileLayer>()); Assert.IsNotNull(xData); SuperTileLayer superComp = goLayer.GetComponent <SuperTileLayer>(); var chunk = new Chunk(); chunk.Encoding = xData.GetAttributeAs <DataEncoding>("encoding"); chunk.Compression = xData.GetAttributeAs <DataCompression>("compression"); bool tilesAsObjects = m_MapComponent.m_Orientation == MapOrientation.Isometric || m_TilesAsObjects; // Are we reading in data in smaller chunks (for infinite maps) or one big chunk (the full map) var xChunks = xData.Elements("chunk"); if (xChunks.Any()) { foreach (var xChunk in xChunks) { chunk.XmlChunk = xChunk; chunk.X = xChunk.GetAttributeAs <int>("x"); chunk.Y = xChunk.GetAttributeAs <int>("y"); chunk.Width = xChunk.GetAttributeAs <int>("width"); chunk.Height = xChunk.GetAttributeAs <int>("height"); // Each chunk is a separate game object on the super layer GameObject goChunk = new GameObject(string.Format("Chunk ({0},{1})", chunk.X, chunk.Y)); goLayer.AddChildWithUniqueName(goChunk); // Possition the chunk Vector3Int int3 = m_MapComponent.TilePositionToGridPosition(chunk.X, chunk.Y); Vector3 translate = SuperImportContext.MakePoint(int3.x, int3.y); translate.x *= m_MapComponent.CellSize.x; translate.y *= m_MapComponent.CellSize.y; goChunk.transform.localPosition = translate; // Create the tilemap for the layer if needed if (!tilesAsObjects) { var tilemap = goChunk.AddComponent <Tilemap>(); tilemap.tileAnchor = Vector3.zero; tilemap.animationFrameRate = AnimationFramerate; tilemap.color = new Color(1, 1, 1, superComp.CalculateOpacity()); // Create the renderer for the layer var renderer = goChunk.AddComponent <TilemapRenderer>(); renderer.sortOrder = MapRenderConverter.Tiled2Unity(m_MapComponent.m_RenderOrder); AssignSortingLayer(renderer, superComp.m_SortingLayerName, superComp.m_SortingOrder); } ProcessLayerDataChunk(goChunk, chunk); } } else { // Regular maps only have one chunk with the Tilemap and TileRenderer being on the layer object // Add the tilemap components if needed if (!tilesAsObjects) { var tilemap = goLayer.AddComponent <Tilemap>(); tilemap.tileAnchor = Vector3.zero; tilemap.animationFrameRate = AnimationFramerate; tilemap.color = new Color(1, 1, 1, superComp.CalculateOpacity()); // Create the renderer for the layer var renderer = goLayer.AddComponent <TilemapRenderer>(); renderer.sortOrder = MapRenderConverter.Tiled2Unity(m_MapComponent.m_RenderOrder); AssignSortingLayer(renderer, superComp.m_SortingLayerName, superComp.m_SortingOrder); } // For regular maps the 'chunk' is the same as the layer data chunk.XmlChunk = xData; chunk.X = 0; chunk.Y = 0; chunk.Width = m_MapComponent.m_Width; chunk.Height = m_MapComponent.m_Height; ProcessLayerDataChunk(goLayer, chunk); } }