using UnityEngine; // Ten nawias otwiera przestrzeń nazw 'Beyond' namespace Beyond { // Ten nawias otwiera klasę 'Billboard' public class Billboard : MonoBehaviour { [Tooltip("Referencja do kamery, w stronę której obiekt ma patrzeć. Jeśli puste, automatycznie użyje Camera.main.")] [SerializeField] private Camera _cameraToLookAt; [Tooltip("Jak szybko obiekt ma się obracać w stronę kamery. Ustaw na dużą wartość (np. 1000) dla natychmiastowego obrotu.")] [SerializeField] private float _rotationSpeed = 20f; [Tooltip("Czy zablokować rotację na osi X, aby obiekt obracał się tylko w poziomie? Przydatne dla sprajtów 2D w świecie 3D.")] [SerializeField] private bool _lockXAxis = false; void Awake() { // Jeśli w Inspektorze nie przypisano żadnej kamery, spróbuj znaleźć główną kamerę przy starcie. if (_cameraToLookAt == null) { _cameraToLookAt = Camera.main; } } // Używamy LateUpdate(), aby mieć pewność, że wykonujemy obrót PO tym, // jak kamera zaktualizowała swoją pozycję i rotację w danej klatce. void LateUpdate() { if (_cameraToLookAt == null) { // Jeśli nadal nie ma kamery (np. główna została wyłączona), nie rób nic. return; } // Oblicz docelową rotację Quaternion targetRotation; if (_lockXAxis) { // Wersja z zablokowaną osią X (obraca się tylko w lewo/prawo) Vector3 cameraPosition = _cameraToLookAt.transform.position; cameraPosition.y = transform.position.y; targetRotation = Quaternion.LookRotation(transform.position - cameraPosition, Vector3.up); } else { // Wersja pełna (klasyczny billboard) targetRotation = _cameraToLookAt.transform.rotation; } // Płynnie interpoluj (Slerp) od aktualnej rotacji do docelowej. transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, _rotationSpeed * Time.deltaTime); } } // <-- TEN ZNAK ZAMYKA KLASĘ 'Billboard' } // <-- TEN ZNAK ZAMYKA PRZESTRZEŃ NAZW 'Beyond'