59 lines
2.3 KiB
C#
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' |