using UnityEngine; namespace AfterHours.Shop { /// /// Rein kosmetisches, nicht genetzwertes Flug-Visual für ein Stück Ware, /// das vom Karton ins Regal wandert. Jeder Peer erzeugt seine eigene /// Instanz (ausgelöst über PlayerCarry.PlayFlightRpc) – keine /// Server-Autorität nötig, der eigentliche Bestand ist längst per /// NetworkVariable synchron. /// public sealed class FlyingPackage : MonoBehaviour { private const float ArcHeight = 0.35f; private Vector3 _start; private Vector3 _end; private Quaternion _startRotation; private Quaternion _endRotation; private float _duration; private float _elapsed; public static void Spawn(GameObject prefab, Vector3 start, Vector3 end, Quaternion endRotation, float duration) { if (prefab == null) return; var instance = Instantiate(prefab, start, Quaternion.identity); var flight = instance.AddComponent(); flight.Init(start, end, endRotation, duration); } private void Init(Vector3 start, Vector3 end, Quaternion endRotation, float duration) { _start = start; _end = end; _startRotation = transform.rotation; _endRotation = endRotation; _duration = Mathf.Max(0.05f, duration); } private void Update() { _elapsed += Time.deltaTime; float t = Mathf.Clamp01(_elapsed / _duration); Vector3 flat = Vector3.Lerp(_start, _end, t); float arc = ArcHeight * Mathf.Sin(t * Mathf.PI); transform.position = flat + Vector3.up * arc; transform.rotation = Quaternion.Slerp(_startRotation, _endRotation, t); if (t >= 1f) Destroy(gameObject); } } }