You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

98 lines
2.5 KiB
C#

3 weeks ago
namespace Fusion {
using UnityEngine;
/// <summary>
/// Companion component for <see cref="FusionStats"/>, which automatically faces this GameObject toward the supplied Camera. If Camera == null, will face towards Camera.main.
/// </summary>
[Fusion.ScriptHelp(BackColor = ScriptHeaderBackColor.Olive)]
[ExecuteAlways]
public class FusionStatsBillboard : Fusion.Behaviour {
/// <summary>
/// Force a particular camera to billboard this object toward. Leave null to use Camera.main.
/// </summary>
[InlineHelp]
public Camera Camera;
// Camera find is expensive, so do it once per update for ALL implementations
static float _lastCameraFindTime;
static Camera _currentCam;
FusionStats _fusionStats;
private void Awake() {
_fusionStats = GetComponent<FusionStats>();
}
private void OnEnable() {
UpdateLookAt();
}
private void OnDisable() {
transform.localRotation = default;
}
Camera MainCamera {
set {
_currentCam = value;
}
get {
var time = Time.time;
// Only look for the camera once per Update.
if (time == _lastCameraFindTime)
return _currentCam;
_lastCameraFindTime = time;
var cam = Camera.main;
_currentCam = cam;
return cam;
}
}
#if UNITY_EDITOR
private void OnDrawGizmos() {
LateUpdate();
}
#endif
private void LateUpdate() {
UpdateLookAt();
}
public void UpdateLookAt() {
// Save the CPU here if our FusionStats is in overlay. Billboarding does nothing.
if (_fusionStats && _fusionStats.CanvasType == FusionStats.StatCanvasTypes.Overlay) {
return;
}
var cam = Camera ? Camera : MainCamera;
if (cam) {
if (enabled) {
//var armOffset = transform.position - cam.transform.position;
//if (_canvasT == null) {
// _canvasT = GetComponentInChildren<Canvas>()?.transform;
// if (_canvasT) {
// _canvasT.localPosition = Offset;
// }
//} else {
// _canvasT.localPosition = Offset;
//}
transform.rotation = cam.transform.rotation;
//transform.LookAt(transform.position + armOffset, cam.transform.up);
}
}
}
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
static void ResetStatics() {
_currentCam = default;
_lastCameraFindTime = default;
}
}
}