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 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) { isPressed.Value = !isPressed.Value; ApplyState(isPressed.Value); } private void HandleStateChanged(bool _, bool currentValue) => ApplyState(currentValue); private void ApplyState(bool currentValue) => buttonStateChanged?.Invoke(currentValue); }