using System; using System.Collections.Generic; public class LevelManager : SingletonBehaviour { public event Action Added; public event Action Removed; private List toAdd; private List toRemove; private List levelObjects; public LevelManager() { toAdd = new List(); toRemove = new List(); levelObjects = new List(); } public void Add(ILevelObject levelObject) { if (levelObjects.Exists(obj => obj.Equals(levelObject))) return; toAdd.Add(levelObject); } public void Remove(ILevelObject levelObject) { if (!levelObjects.Contains(levelObject)) return; toRemove.Add(levelObject); } public void Clear() { toAdd.Clear(); toRemove.Clear(); levelObjects.Clear(); } public T Get(Func predicate = null) where T : ILevelObject { if (predicate == null) predicate = (t) => true; return (T)levelObjects.Find(t => t is T t1 && predicate(t1)); } public List GetAll(Func predicate = null) where T : ILevelObject { if (predicate == null) predicate = (t) => true; List ret = new List(); foreach (var t in levelObjects) if (t is T t1 && predicate(t1)) ret.Add(t1); return ret; } public int Count(Func predicate = null) where T : ILevelObject { return GetAll(predicate).Count; } public bool Has(Func predicate = null) { if (predicate == null) predicate = (t) => true; return levelObjects.Exists(t => t is T && predicate((T)t)); } void Update() { levelObjects.ForEach(obj => obj.LevelUpdate()); toAdd.ForEach(tile => { levelObjects.Add(tile); Added?.Invoke(tile); tile.LevelStart(); }); toAdd.Clear(); toRemove.ForEach(tile => { levelObjects.Remove(tile); Removed?.Invoke(tile); tile.LevelDestroy(); }); toRemove.Clear(); } }