using UnityEngine; [DisallowMultipleComponent] [RequireComponent(typeof(Canvas))] public sealed class WorldSpaceCanvasCameraBinder : MonoBehaviour { [SerializeField] private Canvas targetCanvas; public Canvas TargetCanvas => targetCanvas; private void Reset() { targetCanvas = GetComponent(); 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(); } private void HandleLocalCameraChanged(Camera localCamera) { if (targetCanvas != null && targetCanvas.renderMode == RenderMode.WorldSpace) targetCanvas.worldCamera = localCamera; } [ContextMenu("Refresh Local Player Camera")] private void RefreshFromContextMenu() => RefreshBinding(); }