manage when tiles or objects are removed

problème : Le level manager n'était pas notified quand un objet ou une tile était enlevée du niveau

solution : LevelTile et LevelObject gèrent l'effaçage avec RefreshTile et OnDestroy.
This commit is contained in:
Felix Boucher 2023-05-28 23:02:33 -04:00
parent 8b5d0370dc
commit c1f008104e
3 changed files with 23 additions and 15 deletions

View File

@ -17,9 +17,6 @@ public class LevelManager : Singleton<LevelManager>
public delegate void LevelAction(ILevelObject levelObject);
public delegate bool LevelPredicate<T>(T levelObject) where T : ILevelObject;
public event LevelAction Added;
public event LevelAction Removed;
private readonly List<ILevelObject> _toAdd;
private readonly List<ILevelObject> _toRemove;
private readonly List<ILevelObject> _levelObjects;
@ -84,21 +81,19 @@ public class LevelManager : Singleton<LevelManager>
{
_levelObjects.ForEach(levelObject => levelObject.LevelUpdate());
var toAdd = new List<ILevelObject>(this._toAdd);
var toAdd = new List<ILevelObject>(_toAdd);
toAdd.ForEach(addedObject =>
{
this._toAdd.Remove(addedObject);
_toAdd.Remove(addedObject);
_levelObjects.Add(addedObject);
Added?.Invoke(addedObject);
addedObject.LevelStart();
});
var toRemove = new List<ILevelObject>(this._toRemove);
var toRemove = new List<ILevelObject>(_toRemove);
toRemove.ForEach(removedObject =>
{
this._toRemove.Remove(removedObject);
_toRemove.Remove(removedObject);
_levelObjects.Remove(removedObject);
Removed?.Invoke(removedObject);
removedObject.LevelDestroy();
});
toRemove.Clear();

View File

@ -14,10 +14,12 @@ public abstract class LevelObject : MonoBehaviour, ILevelObject
void Awake()
{
if (LevelManager.Instance.Has<LevelObject>(obj => obj.Equals(this))) return;
LevelManager.Instance.Add(this);
}
void OnDestroy()
{
LevelManager.Instance.Remove(this);
}
public virtual void LevelStart()
{
}

View File

@ -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<string, object> ToDictionary()
{
return new Dictionary<string, object>()
{
{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<Grid>().GetComponentInChildren<Tilemap>(tilemapName);
}