using System; using System.Collections.Generic; using Syntriax.Engine.Core.Abstract; namespace Syntriax.Engine.Core; public class BehaviourCacher : IAssignableGameManager where T : IBehaviour { public Action? OnUnassigned { get; set; } = null; public Action? OnGameManagerAssigned { get; set; } = null; public Action, T>? OnCached { get; set; } = null; public Action, T>? OnUncached { get; set; } = null; private readonly List _behaviours = new(32); public IReadOnlyList Behaviours => _behaviours; public IGameManager GameManager { get; private set; } = null!; public BehaviourCacher() { } public BehaviourCacher(IGameManager gameManager) => Assign(gameManager); private void OnGameObjectRegistered(GameManager manager, IGameObject gameObject) { gameObject.BehaviourController.OnBehaviourAdded += OnBehaviourAdded; gameObject.BehaviourController.OnBehaviourRemoved += OnBehaviourRemoved; } private void OnGameObjectUnregistered(GameManager manager, IGameObject gameObject) { gameObject.BehaviourController.OnBehaviourAdded -= OnBehaviourAdded; gameObject.BehaviourController.OnBehaviourRemoved -= OnBehaviourRemoved; } private void OnBehaviourAdded(IBehaviourController controller, IBehaviour behaviour) { if (behaviour is not T tBehaviour) return; _behaviours.Add(tBehaviour); OnCached?.Invoke(this, tBehaviour); } private void OnBehaviourRemoved(IBehaviourController controller, IBehaviour behaviour) { if (behaviour is not T tBehaviour) return; if (!_behaviours.Remove(tBehaviour)) return; OnUncached?.Invoke(this, tBehaviour); } public bool Assign(IGameManager gameManager) { if (GameManager is not null) return false; gameManager.OnGameObjectRegistered += OnGameObjectRegistered; gameManager.OnGameObjectUnRegistered += OnGameObjectUnregistered; GameManager = gameManager; return true; } public bool Unassign() { if (GameManager is null) return false; GameManager.OnGameObjectRegistered -= OnGameObjectRegistered; GameManager.OnGameObjectUnRegistered -= OnGameObjectUnregistered; GameManager = null!; return true; } }