using AfterHours.Interaction; using Unity.Netcode; using UnityEngine; namespace AfterHours.Shop { [RequireComponent(typeof(NetworkObject))] public class Lieferkarton : NetworkBehaviour, IInteractable { [Header("Deckel Objekte")] [SerializeField] private Transform deckelLinks; [SerializeField] private Transform deckelRechts; [Header("Rotations-Einstellungen")] [SerializeField] private float oeffnungsWinkel = 110f; // Winkel in Grad nach außen [SerializeField] private float geschwindigkeit = 5f; // Geschwindigkeit des Aufklappens // Eine synchronisierte Variable, die den Zustand des Kartons speichert private NetworkVariable istOffen = new NetworkVariable( false, NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Server // Nur der Server darf den Zustand ändern ); // Interne Variablen zum Speichern der Ziel-Rotationen private Quaternion linksGeschlossen; private Quaternion linksOffen; private Quaternion rechtsGeschlossen; private Quaternion rechtsOffen; private void Awake() { // Start-Rotationen (Geschlossen) direkt beim Laden sichern if (deckelLinks != null) linksGeschlossen = deckelLinks.localRotation; if (deckelRechts != null) rechtsGeschlossen = deckelRechts.localRotation; // Ziel-Rotationen berechnen (X-Achse = Scharnierkante entlang der Längsseite) linksOffen = linksGeschlossen * Quaternion.Euler(-oeffnungsWinkel, 0, 0); rechtsOffen = rechtsGeschlossen * Quaternion.Euler(oeffnungsWinkel, 0, 0); } private void Update() { // Beide Deckel weich auf jedem Client rotieren lassen basierend auf der NetworkVariable if (deckelLinks != null) { Quaternion zielLinks = istOffen.Value ? linksOffen : linksGeschlossen; deckelLinks.localRotation = Quaternion.Slerp(deckelLinks.localRotation, zielLinks, Time.deltaTime * geschwindigkeit); } if (deckelRechts != null) { Quaternion zielRechts = istOffen.Value ? rechtsOffen : rechtsGeschlossen; deckelRechts.localRotation = Quaternion.Slerp(deckelRechts.localRotation, zielRechts, Time.deltaTime * geschwindigkeit); } } // Wird von deinem Interaktionssystem aufgerufen (z. B. wenn "E" gedrückt wird) public void Interact(NetworkObject actor) { ToggleKartonServerRpc(); } // Der Server verarbeitet den Aufruf und synchronisiert den Zustand im Netzwerk [Rpc(SendTo.Server)] private void ToggleKartonServerRpc() { istOffen.Value = !istOffen.Value; } // Gibt den dynamischen Text für das UI-Prompt zurück public string GetPrompt(ulong clientId) { return istOffen.Value ? "Karton schließen" : "Karton öffnen"; } } }