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