using UnityEngine; using UnityEngine.Tilemaps; /// /// can be inherited by tiles in order to be added to the level manager /// public abstract class LevelTile : TileBase, ILevelObject { [SerializeField] private Sprite _sprite; public Vector3 Position { get; protected set; } public Tilemap Tilemap { get; private set; } public abstract void LevelStart(); public abstract void LevelDestroy(); public abstract void LevelUpdate(); public abstract bool Equals(ILevelObject other); public override bool StartUp(Vector3Int position, ITilemap tilemap, GameObject go) { //only execute if application is in play mode if (!Application.isPlaying) { return base.StartUp(position, tilemap, go); } var comp = tilemap.GetComponent(); //need to create an instance of the tile, otherwise the position will change for all tiles instead of only this one. var instance = Instantiate(this); instance.Position = position; instance.Tilemap = comp; //lambda expression to be used to check if the tile already exists bool isSameTile(LevelTile tile) => tile.Equals(instance); //if tile is exactly the same as before, don't add. if (LevelManager.Instance.Has(isSameTile)) return base.StartUp(position, tilemap, go); LevelManager.Instance.Add(instance); return base.StartUp(position, tilemap, go); } public override void GetTileData(Vector3Int position, ITilemap tilemap, ref TileData tileData) { tileData.sprite = _sprite; tileData.transform.SetTRS(Vector3.zero, Quaternion.identity, Vector3.one); tileData.color = Color.white; } }