using UnityEngine; using UnityEngine.UI; using System.Collections; using MoreMountains.Tools; using System; using System.Collections.Generic; using UnityEngine.Tilemaps; namespace MoreMountains.Tools { /// /// A class to put on a tilemap so it acts as a shadow/copy of another reference tilemap. /// Useful for wall shadows for example. /// Offsetting the tilemap and changing its sorting order etc is done via the regular components /// [ExecuteAlways] [AddComponentMenu("More Mountains/Tools/Tilemaps/MMTilemapShadow")] [RequireComponent(typeof(Tilemap))] public class MMTilemapShadow : MonoBehaviour { /// the tilemap to copy public Tilemap ReferenceTilemap; [MMInspectorButton("UpdateShadows")] public bool UpdateShadowButton; protected Tilemap _tilemap; /// /// This method will copy the reference tilemap into the one on this gameobject /// public virtual void UpdateShadows() { if (ReferenceTilemap == null) { return; } _tilemap = this.gameObject.GetComponent(); Copy(ReferenceTilemap, _tilemap); } /// /// Copies the source tilemap on the destination tilemap /// /// /// public static void Copy(Tilemap source, Tilemap destination) { source.RefreshAllTiles(); destination.RefreshAllTiles(); List referenceTilemapPositions = new List(); // we grab all filled positions from the ref tilemap foreach (Vector3Int pos in source.cellBounds.allPositionsWithin) { Vector3Int localPlace = new Vector3Int(pos.x, pos.y, pos.z); if (source.HasTile(localPlace)) { referenceTilemapPositions.Add(localPlace); } } // we turn our list into an array Vector3Int[] positions = new Vector3Int[referenceTilemapPositions.Count]; TileBase[] allTiles = new TileBase[referenceTilemapPositions.Count]; int i = 0; foreach(Vector3Int tilePosition in referenceTilemapPositions) { positions[i] = tilePosition; allTiles[i] = source.GetTile(tilePosition); i++; } // we clear our tilemap and resize it destination.ClearAllTiles(); destination.RefreshAllTiles(); destination.size = source.size; destination.origin = source.origin; destination.ResizeBounds(); // we feed it our positions destination.SetTiles(positions, allTiles); } } }