position | Position of the Tile on the Tilemap. |
tilemap | The Tilemap the tile is present on. |
This method is called when the tile is refreshed.
Implement this and call Tilemap.RefreshTile on all affected tiles on the Tilemap including the tile at the given position to refresh them. This is also useful if the placement of a tile affects the properties of neighboring tiles.
using UnityEngine; using UnityEngine.Tilemaps;
// Tile that displays a Sprite when it is alone and a different Sprite when it is orthogonally adjacent to the same NeighourTile [CreateAssetMenu] public class NeighbourTile : TileBase { public Sprite spriteA; public Sprite spriteB;
public override void RefreshTile(Vector3Int position, ITilemap tilemap) { for (int yd = -1; yd <= 1; yd++) { Vector3Int location = new Vector3Int(position.x, position.y + yd, position.z); if (IsNeighbour(location, tilemap)) tilemap.RefreshTile(location); } for (int xd = -1; xd <= 1; xd++) { Vector3Int location = new Vector3Int(position.x + xd, position.y, position.z); if (IsNeighbour(location, tilemap)) tilemap.RefreshTile(location); } }
public override void GetTileData(Vector3Int position, ITilemap tilemap, ref TileData tileData) { tileData.sprite = spriteA; for (int yd = -1; yd <= 1; yd += 2) { Vector3Int location = new Vector3Int(position.x, position.y + yd, position.z); if (IsNeighbour(location, tilemap)) tileData.sprite = spriteB; } for (int xd = -1; xd <= 1; xd += 2) { Vector3Int location = new Vector3Int(position.x + xd, position.y, position.z); if (IsNeighbour(location, tilemap)) tileData.sprite = spriteB; } }
private bool IsNeighbour(Vector3Int position, ITilemap tilemap) { TileBase tile = tilemap.GetTile(position); return (tile != null && tile == this); } }