le fait qu'il faille updater des tiles du tilemap posait un réel problème création d'un système d'héritage pour que les game objects et les tiles puissent cohabiter dans une même game loop - ILevelObject contient des fonctions de start, de destroy, d'update, d'égalité et une position - LevelTile et LevelObject héritent de ILevelObject et peuvent être hérité par des tiles ou des MonoBehaviours. - le level manager est un monobehaviour singleton qui update tous les ILevelObjects à chaque frame.
79 lines
2.2 KiB
C#
79 lines
2.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
|
|
public class LevelManager : SingletonBehaviour<LevelManager>
|
|
{
|
|
public event Action<ILevelObject> Added;
|
|
public event Action<ILevelObject> Removed;
|
|
|
|
private List<ILevelObject> toAdd;
|
|
private List<ILevelObject> toRemove;
|
|
private List<ILevelObject> levelObjects;
|
|
public LevelManager()
|
|
{
|
|
toAdd = new List<ILevelObject>();
|
|
toRemove = new List<ILevelObject>();
|
|
levelObjects = new List<ILevelObject>();
|
|
}
|
|
|
|
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<T>(Func<T, bool> predicate = null) where T : ILevelObject
|
|
{
|
|
if (predicate == null) predicate = (t) => true;
|
|
return (T)levelObjects.Find(t => t is T t1 && predicate(t1));
|
|
}
|
|
public List<T> GetAll<T>(Func<T, bool> predicate = null) where T : ILevelObject
|
|
{
|
|
if (predicate == null) predicate = (t) => true;
|
|
List<T> ret = new List<T>();
|
|
foreach (var t in levelObjects) if (t is T t1 && predicate(t1)) ret.Add(t1);
|
|
return ret;
|
|
}
|
|
|
|
public int Count<T>(Func<T, bool> predicate = null) where T : ILevelObject
|
|
{
|
|
return GetAll(predicate).Count;
|
|
}
|
|
|
|
public bool Has<T>(Func<T, bool> 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();
|
|
}
|
|
} |