- Lieferkarton: server-authoritative Deckel-Toggle per NetworkVariable, Scharnier-Rotation um lokale X-Achse, modernes [Rpc(SendTo.Server)] - BoneVibration: neues IInteractable, das einen geskinnten Bone per NetworkVariable-gesteuertem Toggle vibrieren lässt - Beide Objekte in Shop.unity verdrahtet Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
78 lines
3.0 KiB
C#
78 lines
3.0 KiB
C#
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<bool> istOffen = new NetworkVariable<bool>(
|
|
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";
|
|
}
|
|
}
|
|
}
|