using System; using Unity.Netcode; using UnityEngine; using UnityEngine.Events; public sealed class NetworkButtonInteractable : NetworkInteractable { [SerializeField] private UnityEvent buttonStateChanged; private readonly NetworkVariable isPressed = new( false, NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Server); public bool IsPressed => isPressed.Value; public event Action Pressed; public event Action StateChanged; public override void OnNetworkSpawn() { isPressed.OnValueChanged += HandleStateChanged; ApplyState(isPressed.Value); } public override void OnNetworkDespawn() { isPressed.OnValueChanged -= HandleStateChanged; } protected override bool CanInteractOnServer(ulong senderClientId) => true; protected override void InteractOnServer(ulong senderClientId, NetworkObject playerObject) { Pressed?.Invoke(); isPressed.Value = !isPressed.Value; } private void HandleStateChanged(bool _, bool currentValue) => ApplyState(currentValue); private void ApplyState(bool currentValue) { StateChanged?.Invoke(currentValue); buttonStateChanged?.Invoke(currentValue); } }