Jamie Greunbaum bd2b80e9f9 - Added a placeholder jail call camera overlay.
- Tile floors and pedestals now have double-sided GI, making lightmaps cleaner.
- Removed unnecessary collision from the location board.
- Camera overlays now all default to inactive and zero scale.
2026-05-07 02:45:09 -04:00

115 lines
2.3 KiB
C#

using UdonSharp;
using UnityEngine;
using VRC.Udon.Common;
public enum OverlayFit
{
Stretch,
Equal
};
[ExecuteInEditMode]
[UdonBehaviourSyncMode(BehaviourSyncMode.Manual)]
public class CameraOverlay : UdonSharpBehaviour
{
[SerializeField] private Animator _Animator;
[SerializeField] private GameObject _OverlayElements;
[Space]
[SerializeField, Range(0.0f, 2.5f)] private float _AspectRatio = 1.7777777777777777777777777777777777777f;
[SerializeField] private OverlayFit _OverlayFit = OverlayFit.Stretch;
[UdonSynced] private bool _OverlayElementsEnabled = false;
[UdonSynced] private bool _FadeOutAnimation = false;
private Camera _Camera = null;
private const float NEAR_PLANE_OFFSET = 0.05f;
void Update()
{
if (transform.parent != null)
{
if (_Camera != null)
{
_UpdateCameraSettings();
return;
}
Camera ParentCamera = GetComponentInParent<Camera>();
if (ParentCamera)
{
_Camera = ParentCamera;
transform.localRotation = Quaternion.identity;
_UpdateCameraSettings();
}
else
{
_Camera = null;
}
}
}
public override void OnDeserialization(DeserializationResult Result)
{
_EnableOverlayElements_Synced();
_PlayFadeOutAnimation_Synced();
base.OnDeserialization(Result);
}
public void EnableOverlayElements(bool Enable)
{
_OverlayElementsEnabled = Enable;
_EnableOverlayElements_Synced();
_FadeOutAnimation = false;
_PlayFadeOutAnimation_Synced();
RequestSerialization();
}
private void _EnableOverlayElements_Synced()
{
_OverlayElements.SetActive(_OverlayElementsEnabled);
}
public void PlayFadeOutAnimation()
{
_FadeOutAnimation = true;
_PlayFadeOutAnimation_Synced();
RequestSerialization();
}
private void _PlayFadeOutAnimation_Synced()
{
if (_Animator)
{
_Animator.SetBool("Fade Out", _FadeOutAnimation);
}
}
private void _UpdateCameraSettings()
{
Vector3 Position = Vector3.zero;
Position.z = _Camera.nearClipPlane + NEAR_PLANE_OFFSET;
transform.localPosition = Position;
Vector3 Scale = Vector3.one;
Scale.y = 2.0f * Position.z * Mathf.Tan(_Camera.fieldOfView * 0.5f * Mathf.Deg2Rad);
switch (_OverlayFit)
{
case OverlayFit.Stretch:
Scale.x = Scale.y * _AspectRatio;
break;
case OverlayFit.Equal:
Scale.x = Scale.y;
break;
}
transform.localScale = Scale;
}
}