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

View File

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

View File

@ -16,7 +16,8 @@ public abstract class LevelTile : TileBase, ILevelObject
public Vector3 Position { get; protected set; } public Vector3 Position { get; protected set; }
private Tilemap _tilemap; private Tilemap _tilemap;
public string Tilemap public Tilemap Tilemap => _tilemap;
public string TilemapName
{ {
get => _tilemap.name; get => _tilemap.name;
} }
@ -30,7 +31,7 @@ public abstract class LevelTile : TileBase, ILevelObject
return other is LevelTile otherTile return other is LevelTile otherTile
&& Name == otherTile.Name && Name == otherTile.Name
&& Position == otherTile.Position && Position == otherTile.Position
&& Tilemap == otherTile.Tilemap; && TilemapName == otherTile.TilemapName;
} }
public override bool StartUp(Vector3Int position, ITilemap tilemap, GameObject go) 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.transform.SetTRS(Vector3.zero, Quaternion.identity, Vector3.one);
tileData.color = Color.white; 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() public virtual Dictionary<string, object> ToDictionary()
{ {
return new Dictionary<string, object>() return new Dictionary<string, object>()
{ {
{nameof(Name), Name }, {nameof(Name), Name },
{nameof(Position), new float[]{Position.x, Position.y, Position.z } }, {nameof(Position), new float[]{Position.x, Position.y, Position.z } },
{nameof(Tilemap), Tilemap }, {nameof(TilemapName), TilemapName },
{nameof(ILevelObject.ObjectType), nameof(ILevelObject.ObjectType.Tile) } {nameof(ILevelObject.ObjectType), nameof(ILevelObject.ObjectType.Tile) }
}; };
} }
@ -85,7 +96,7 @@ public abstract class LevelTile : TileBase, ILevelObject
{ {
Name = dict[nameof(Name)].ToString(); Name = dict[nameof(Name)].ToString();
Position = dict[nameof(Position)].ToVector3(); Position = dict[nameof(Position)].ToVector3();
var tilemapName = dict[nameof(Tilemap)].ToString(); var tilemapName = dict[nameof(TilemapName)].ToString();
_tilemap = FindObjectOfType<Grid>().GetComponentInChildren<Tilemap>(tilemapName); _tilemap = FindObjectOfType<Grid>().GetComponentInChildren<Tilemap>(tilemapName);
} }