add Source property for EcsRunner

This commit is contained in:
Mikhail 2023-03-29 15:09:00 +08:00
parent 899cd9f40b
commit e422e83d51
2 changed files with 14 additions and 11 deletions

View File

@ -191,35 +191,38 @@ namespace DCFApixels.DragonECS
#endregion #endregion
#region Instantiate #region Instantiate
private static TInterface Instantiate(TInterface[] targets, bool isHasFilter, object filter) private static TInterface Instantiate(EcsSystems source, TInterface[] targets, bool isHasFilter, object filter)
{ {
if (_subclass == null) if (_subclass == null)
EcsRunnerActivator.InitFor<TInterface>(); EcsRunnerActivator.InitFor<TInterface>();
var instance = (EcsRunner<TInterface>)Activator.CreateInstance(_subclass); var instance = (EcsRunner<TInterface>)Activator.CreateInstance(_subclass);
return (TInterface)(IEcsSystem)instance.Set(targets, isHasFilter, filter); return (TInterface)(IEcsSystem)instance.Set(source, targets, isHasFilter, filter);
} }
public static TInterface Instantiate(IEnumerable<IEcsSystem> targets) public static TInterface Instantiate(EcsSystems source)
{ {
return Instantiate(FilterSystems(targets), false, null); return Instantiate(source, FilterSystems(source.AllSystems), false, null);
} }
public static TInterface Instantiate(IEnumerable<IEcsSystem> targets, object filter) public static TInterface Instantiate(EcsSystems source, object filter)
{ {
return Instantiate(FilterSystems(targets, filter), true, filter); return Instantiate(source, FilterSystems(source.AllSystems, filter), true, filter);
} }
#endregion #endregion
private EcsSystems _source;
protected TInterface[] targets; protected TInterface[] targets;
private ReadOnlyCollection<TInterface> _targetsSealed; private ReadOnlyCollection<TInterface> _targetsSealed;
private object _filter; private object _filter;
private bool _isHasFilter; private bool _isHasFilter;
public EcsSystems Source => _source;
public IList Targets => _targetsSealed; public IList Targets => _targetsSealed;
public object Filter => _filter; public object Filter => _filter;
public bool IsHasFilter => _isHasFilter; public bool IsHasFilter => _isHasFilter;
private EcsRunner<TInterface> Set(TInterface[] targets, bool isHasFilter, object filter) private EcsRunner<TInterface> Set(EcsSystems source, TInterface[] targets, bool isHasFilter, object filter)
{ {
_source = source;
this.targets = targets; this.targets = targets;
_targetsSealed = new ReadOnlyCollection<TInterface>(targets); _targetsSealed = new ReadOnlyCollection<TInterface>(targets);
_filter = filter; _filter = filter;
@ -230,12 +233,12 @@ namespace DCFApixels.DragonECS
protected virtual void OnSetup() { } protected virtual void OnSetup() { }
internal void Rebuild(IEnumerable<IEcsSystem> targets) internal void Rebuild()
{ {
if(_isHasFilter) if(_isHasFilter)
Set(FilterSystems(targets), _isHasFilter, _filter); Set(_source, FilterSystems(_source.AllSystems), _isHasFilter, _filter);
else else
Set(FilterSystems(targets, _filter), _isHasFilter, _filter); Set(_source, FilterSystems(_source.AllSystems, _filter), _isHasFilter, _filter);
} }
} }
} }

View File

@ -43,7 +43,7 @@ namespace DCFApixels.DragonECS
Type type = typeof(T); Type type = typeof(T);
if (_runners.TryGetValue(type, out IEcsRunner result)) if (_runners.TryGetValue(type, out IEcsRunner result))
return (T)result; return (T)result;
result = (IEcsRunner)EcsRunner<T>.Instantiate(_allSystems); result = (IEcsRunner)EcsRunner<T>.Instantiate(this);
_runners.Add(type, result); _runners.Add(type, result);
return (T)result; return (T)result;
} }