using System; using System.Collections.Generic; using UnityEngine; namespace AlicizaX.UI { [DisallowMultipleComponent] [AddComponentMenu("UX/UX Controller State Recorder")] public class UXControllerStateRecorder : MonoBehaviour { [SerializeField] private int _id; [SerializeField] private UXController _controller; internal int ID => _id; internal UXController Controller => _controller; [Serializable] public class StateEntry { [SerializeReference] public ControllerStateBase State = null; public string ControllerName = string.Empty; public int ControllerIndex = 0; } [SerializeField] private List _stateEntries = new List(); internal List StateEntries => _stateEntries; private bool _initialized = false; #region Unity Lifecycle private void Awake() { Initialize(); } private void OnDestroy() { if (_controller != null) { _controller.UnregisterRecorder(this); } } #endregion #region Public API public void Initialize() { if (_initialized) return; _initialized = true; foreach (var entry in _stateEntries) { if (entry?.State != null) { entry.State.Init(this); } } } public void SetController(UXController controller) { if (_controller != null) { _controller.UnregisterRecorder(this); } _controller = controller; if (_controller != null) { _controller.RegisterRecorder(this); } } #endregion #region Internal API internal void OnControllerIndexChanged(string controllerName, int selectedIndex) { for (int i = 0; i < _stateEntries.Count; i++) { var entry = _stateEntries[i]; if (entry != null && entry.ControllerName == controllerName && entry.State != null) { try { entry.State.Execute(this, entry.ControllerIndex, selectedIndex); } catch (Exception ex) { Debug.LogError($"Error executing state {entry.State.GetType().Name}: {ex.Message}", this); } } } } internal void GenerateID() { if (_id <= 0) { _id = UnityEngine.Random.Range(10000000, 99999999); } } #endregion } }