diff --git a/Assets/Scripts/LevelManager/LevelManager.cs b/Assets/Scripts/LevelManager/LevelManager.cs index bd0fe4c..e7c8fff 100644 --- a/Assets/Scripts/LevelManager/LevelManager.cs +++ b/Assets/Scripts/LevelManager/LevelManager.cs @@ -17,9 +17,6 @@ public class LevelManager : Singleton public delegate void LevelAction(ILevelObject levelObject); public delegate bool LevelPredicate(T levelObject) where T : ILevelObject; - public event LevelAction Added; - public event LevelAction Removed; - private readonly List _toAdd; private readonly List _toRemove; private readonly List _levelObjects; @@ -84,21 +81,19 @@ public class LevelManager : Singleton { _levelObjects.ForEach(levelObject => levelObject.LevelUpdate()); - var toAdd = new List(this._toAdd); + var toAdd = new List(_toAdd); toAdd.ForEach(addedObject => { - this._toAdd.Remove(addedObject); + _toAdd.Remove(addedObject); _levelObjects.Add(addedObject); - Added?.Invoke(addedObject); addedObject.LevelStart(); }); - var toRemove = new List(this._toRemove); + var toRemove = new List(_toRemove); toRemove.ForEach(removedObject => { - this._toRemove.Remove(removedObject); + _toRemove.Remove(removedObject); _levelObjects.Remove(removedObject); - Removed?.Invoke(removedObject); removedObject.LevelDestroy(); }); toRemove.Clear(); diff --git a/Assets/Scripts/LevelManager/LevelObject.cs b/Assets/Scripts/LevelManager/LevelObject.cs index 68c1078..6457024 100644 --- a/Assets/Scripts/LevelManager/LevelObject.cs +++ b/Assets/Scripts/LevelManager/LevelObject.cs @@ -14,10 +14,12 @@ public abstract class LevelObject : MonoBehaviour, ILevelObject void Awake() { if (LevelManager.Instance.Has(obj => obj.Equals(this))) return; - LevelManager.Instance.Add(this); } - + void OnDestroy() + { + LevelManager.Instance.Remove(this); + } public virtual void LevelStart() { } diff --git a/Assets/Scripts/LevelManager/LevelTile.cs b/Assets/Scripts/LevelManager/LevelTile.cs index 772d270..8a9fe70 100644 --- a/Assets/Scripts/LevelManager/LevelTile.cs +++ b/Assets/Scripts/LevelManager/LevelTile.cs @@ -16,7 +16,8 @@ public abstract class LevelTile : TileBase, ILevelObject public Vector3 Position { get; protected set; } private Tilemap _tilemap; - public string Tilemap + public Tilemap Tilemap => _tilemap; + public string TilemapName { get => _tilemap.name; } @@ -30,7 +31,7 @@ public abstract class LevelTile : TileBase, ILevelObject return other is LevelTile otherTile && Name == otherTile.Name && Position == otherTile.Position - && Tilemap == otherTile.Tilemap; + && TilemapName == otherTile.TilemapName; } public override bool StartUp(Vector3Int position, ITilemap tilemap, GameObject go) { @@ -69,14 +70,24 @@ public abstract class LevelTile : TileBase, ILevelObject tileData.transform.SetTRS(Vector3.zero, Quaternion.identity, Vector3.one); tileData.color = Color.white; } + public override void RefreshTile(Vector3Int position, ITilemap tilemap) + { + if (!Application.isPlaying) return; + //this will check if tile was removed from tilemap + if (tilemap.GetTile(position) == null) + { + LevelManager.Instance.Remove(this); + } + base.RefreshTile(position, tilemap); + } public virtual Dictionary ToDictionary() { return new Dictionary() { {nameof(Name), Name }, {nameof(Position), new float[]{Position.x, Position.y, Position.z } }, - {nameof(Tilemap), Tilemap }, + {nameof(TilemapName), TilemapName }, {nameof(ILevelObject.ObjectType), nameof(ILevelObject.ObjectType.Tile) } }; } @@ -85,7 +96,7 @@ public abstract class LevelTile : TileBase, ILevelObject { Name = dict[nameof(Name)].ToString(); Position = dict[nameof(Position)].ToVector3(); - var tilemapName = dict[nameof(Tilemap)].ToString(); + var tilemapName = dict[nameof(TilemapName)].ToString(); _tilemap = FindObjectOfType().GetComponentInChildren(tilemapName); }