using AfterHours.Interaction; using Unity.Netcode; using UnityEngine; namespace AfterHours.Shop { [RequireComponent(typeof(NetworkObject))] public class BoneVibration : NetworkBehaviour, IInteractable { [Header("Knochen")] [SerializeField] private Transform _topBone; [Header("Einstellungen")] [SerializeField] private float _intensity = 0.05f; // Eine synchronisierte Variable, die den Zustand speichert private readonly NetworkVariable _istAmVibrieren = new NetworkVariable( false, NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Server // Nur der Server darf den Zustand ändern ); private Quaternion _ausgangsRotation; private void Awake() { if (_topBone != null) _ausgangsRotation = _topBone.localRotation; } private void LateUpdate() { if (_topBone == null) return; if (_istAmVibrieren.Value) { // Erzeugt zufälliges Auslenken um die Ursprungsrotation float randomX = Random.Range(-_intensity, _intensity); float randomZ = Random.Range(-_intensity, _intensity); _topBone.localRotation = _ausgangsRotation * Quaternion.Euler(randomX * 100, 0, randomZ * 100); } else { // Zurück zur Ausgangsposition _topBone.localRotation = _ausgangsRotation; } } // Wird von deinem Interaktionssystem aufgerufen (z. B. wenn "E" gedrückt wird) public void Interact(NetworkObject actor) { ToggleVibrationServerRpc(); } // Der Server verarbeitet den Aufruf und synchronisiert den Zustand im Netzwerk [Rpc(SendTo.Server)] private void ToggleVibrationServerRpc() { _istAmVibrieren.Value = !_istAmVibrieren.Value; } // Gibt den dynamischen Text für das UI-Prompt zurück public string GetPrompt(ulong clientId) { return _istAmVibrieren.Value ? "Ausschalten" : "Einschalten"; } } }