using System; using System.Collections.Generic; namespace Cryville.Common.Unity.Input { public class SimpleInputConsumer { readonly InputManager _manager; readonly object _lock = new object(); readonly Dictionary _vectors = new Dictionary(); readonly List _events = new List(); public SimpleInputConsumer(InputManager manager) { _manager = manager; } public void Activate() { lock (_lock) { _events.Clear(); } _manager.EnumerateHandlers(h => h.OnInput += OnInput); } public void Deactivate() { _manager.EnumerateHandlers(h => h.OnInput -= OnInput); } protected void OnInput(InputIdentifier id, InputVector vec) { lock (_lock) { InputVector vec0; if (_vectors.TryGetValue(id, out vec0)) { _events.Add(new InputEvent { Id = id, From = vec0, To = vec, }); if (vec.IsNull) _vectors.Remove(id); else _vectors[id] = vec; } else { _events.Add(new InputEvent { Id = id, From = new InputVector(vec.Time), To = vec, }); _vectors.Add(id, vec); } } } public void EnumerateEvents(Action cb) { lock (_lock) { foreach (var ev in _events) cb(ev); _events.Clear(); } } } }