53 lines
1.3 KiB
C#
53 lines
1.3 KiB
C#
using UnityEngine;
|
|
|
|
[DisallowMultipleComponent]
|
|
[RequireComponent(typeof(Canvas))]
|
|
public sealed class WorldSpaceCanvasCameraBinder : MonoBehaviour
|
|
{
|
|
[SerializeField] private Canvas targetCanvas;
|
|
|
|
public Canvas TargetCanvas => targetCanvas;
|
|
|
|
private void Reset()
|
|
{
|
|
targetCanvas = GetComponent<Canvas>();
|
|
RefreshBinding();
|
|
}
|
|
|
|
private void Awake() => ResolveCanvas();
|
|
|
|
private void OnEnable()
|
|
{
|
|
LocalPlayerCameraRegistry.Changed += HandleLocalCameraChanged;
|
|
RefreshBinding();
|
|
}
|
|
|
|
private void OnDisable() =>
|
|
LocalPlayerCameraRegistry.Changed -= HandleLocalCameraChanged;
|
|
|
|
public void RefreshBinding()
|
|
{
|
|
ResolveCanvas();
|
|
|
|
if (targetCanvas == null || targetCanvas.renderMode != RenderMode.WorldSpace)
|
|
return;
|
|
|
|
targetCanvas.worldCamera = LocalPlayerCameraRegistry.Current;
|
|
}
|
|
|
|
private void ResolveCanvas()
|
|
{
|
|
if (targetCanvas == null)
|
|
targetCanvas = GetComponent<Canvas>();
|
|
}
|
|
|
|
private void HandleLocalCameraChanged(Camera localCamera)
|
|
{
|
|
if (targetCanvas != null && targetCanvas.renderMode == RenderMode.WorldSpace)
|
|
targetCanvas.worldCamera = localCamera;
|
|
}
|
|
|
|
[ContextMenu("Refresh Local Player Camera")]
|
|
private void RefreshFromContextMenu() => RefreshBinding();
|
|
}
|