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:
parent
8b5d0370dc
commit
c1f008104e
@ -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();
|
||||
|
||||
@ -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()
|
||||
{
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user