2023-02-05 19:59:45 +08:00
|
|
|
|
using System.Collections.Generic;
|
2023-02-14 03:26:34 +08:00
|
|
|
|
using System;
|
2023-02-05 19:59:45 +08:00
|
|
|
|
|
|
|
|
|
namespace DCFApixels.DragonECS
|
|
|
|
|
{
|
2023-02-07 17:11:56 +08:00
|
|
|
|
public interface IEcsProcessorsMessenger
|
2023-02-05 19:59:45 +08:00
|
|
|
|
{
|
|
|
|
|
public EcsSession Source { get; }
|
|
|
|
|
}
|
2023-02-13 21:11:54 +08:00
|
|
|
|
public interface IEcsProcessorsMessenger<TMessage> : IEcsProcessorsMessenger where TMessage : IEcsMessage { }
|
2023-02-14 03:26:34 +08:00
|
|
|
|
public class EcsProcessorsMessenger<TMessage> : IEcsProcessorsMessenger<TMessage>, IDisposable
|
2023-02-05 19:59:45 +08:00
|
|
|
|
where TMessage : IEcsMessage
|
|
|
|
|
{
|
2023-02-13 21:11:54 +08:00
|
|
|
|
private readonly EcsSession _source;
|
|
|
|
|
private readonly IReceive<TMessage>[] _targets;
|
2023-02-05 19:59:45 +08:00
|
|
|
|
|
|
|
|
|
public EcsSession Source => _source;
|
2023-02-13 21:11:54 +08:00
|
|
|
|
public IReadOnlyList<IReceive<TMessage>> Targets => _targets;
|
2023-02-05 19:59:45 +08:00
|
|
|
|
|
2023-02-07 17:11:56 +08:00
|
|
|
|
internal EcsProcessorsMessenger(EcsSession source)
|
2023-02-05 19:59:45 +08:00
|
|
|
|
{
|
|
|
|
|
_source = source;
|
2023-02-13 21:11:54 +08:00
|
|
|
|
List<IReceive<TMessage>> list = new List<IReceive<TMessage>>();
|
2023-02-05 19:59:45 +08:00
|
|
|
|
|
2023-02-07 17:11:56 +08:00
|
|
|
|
foreach (var item in _source.AllProcessors)
|
2023-02-05 19:59:45 +08:00
|
|
|
|
{
|
2023-02-13 21:11:54 +08:00
|
|
|
|
if (item is IReceive<TMessage> targetItem)
|
2023-02-05 19:59:45 +08:00
|
|
|
|
{
|
|
|
|
|
list.Add(targetItem);
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-02-07 17:11:56 +08:00
|
|
|
|
_targets = list.ToArray();
|
2023-02-05 19:59:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Send(in TMessage message)
|
|
|
|
|
{
|
2023-02-07 17:11:56 +08:00
|
|
|
|
foreach (var item in _targets)
|
2023-02-05 19:59:45 +08:00
|
|
|
|
{
|
2023-02-13 21:11:54 +08:00
|
|
|
|
item.Do(_source, in message);
|
2023-02-05 19:59:45 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2023-02-13 21:11:54 +08:00
|
|
|
|
|
|
|
|
|
public void Destroy() => _source.OnMessengerDetroyed(this);
|
2023-02-14 03:26:34 +08:00
|
|
|
|
void IDisposable.Dispose() => Destroy();
|
2023-02-05 19:59:45 +08:00
|
|
|
|
}
|
|
|
|
|
}
|