using UnityEngine; [DisallowMultipleComponent] public sealed class MapControlBinder : MonoBehaviour { [SerializeField] private MapController mapController; [SerializeField] private NetworkPhysicalWheelInteractable horizontalWheel; [SerializeField] private NetworkPhysicalWheelInteractable verticalWheel; [SerializeField] private NetworkPhysicalLeverInteractable fireLever; [SerializeField] private NetworkButtonInteractable scanButton; private bool controlsBound; private bool initialValuesApplied; private void Reset() => mapController = GetComponent(); private void OnEnable() => TryBindControls(); private void OnDisable() => UnbindControls(); private void Update() { TryBindControls(); if (!controlsBound || initialValuesApplied || horizontalWheel == null || verticalWheel == null) { return; } initialValuesApplied = true; HandleHorizontalChanged(horizontalWheel.NormalizedValue); HandleVerticalChanged(verticalWheel.NormalizedValue); } private void TryBindControls() { if (controlsBound || !AreNetworkObjectsReady()) return; if (horizontalWheel != null) horizontalWheel.ValueChanged += HandleHorizontalChanged; if (verticalWheel != null) verticalWheel.ValueChanged += HandleVerticalChanged; if (fireLever != null) fireLever.StateChanged += HandleFireChanged; if (scanButton != null) scanButton.Pressed += HandleScanPressed; controlsBound = true; } private void UnbindControls() { if (!controlsBound) return; if (horizontalWheel != null) horizontalWheel.ValueChanged -= HandleHorizontalChanged; if (verticalWheel != null) verticalWheel.ValueChanged -= HandleVerticalChanged; if (fireLever != null) fireLever.StateChanged -= HandleFireChanged; if (scanButton != null) scanButton.Pressed -= HandleScanPressed; controlsBound = false; initialValuesApplied = false; } private bool AreNetworkObjectsReady() { return mapController != null && mapController.IsSpawned && (horizontalWheel == null || horizontalWheel.IsSpawned) && (verticalWheel == null || verticalWheel.IsSpawned) && (fireLever == null || fireLever.IsSpawned) && (scanButton == null || scanButton.IsSpawned); } private void HandleHorizontalChanged(float value) => ApplyOnServer(() => mapController.SetHorizontalNormalized(value)); private void HandleVerticalChanged(float value) => ApplyOnServer(() => mapController.SetVerticalNormalized(value)); private void HandleFireChanged(bool active) { if (active) ApplyOnServer(mapController.RequestPseudoFire); } private void HandleScanPressed() => ApplyOnServer(mapController.RequestRadarScan); private void ApplyOnServer(System.Action action) { if (mapController != null && mapController.IsSpawned && mapController.IsServer) action?.Invoke(); } }