Files
beyond/Assets/Scripts/Billboard.cs
szczuras4 ec467225b6 intro aim
2025-07-18 05:12:05 +02:00

59 lines
2.3 KiB
C#

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'