96 lines
2.0 KiB
C#
96 lines
2.0 KiB
C#
|
|
using UdonSharp;
|
|
using UnityEngine;
|
|
using VRC.SDKBase;
|
|
using VRC.Udon;
|
|
using VRC.Udon.Common;
|
|
|
|
|
|
[UdonBehaviourSyncMode(BehaviourSyncMode.Manual)]
|
|
public class TimerOverlay : UdonSharpBehaviour
|
|
{
|
|
[SerializeField] private Animator _Animator;
|
|
[SerializeField] private GameObject _OverlayElements;
|
|
|
|
[UdonSynced] private bool _OverlayElementsEnabled = false;
|
|
[UdonSynced] private bool _FadeOutAnimation = false;
|
|
|
|
private Camera _Camera = null;
|
|
|
|
private const float ASPECT_16_9 = 1.7777777777777777777777777777777777777f;
|
|
private const float NEAR_PLANE_OFFSET = 0.0001f;
|
|
|
|
|
|
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()
|
|
{
|
|
_Animator.SetBool("Fade Out Elements", _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);
|
|
Scale.x = Scale.y * ASPECT_16_9;
|
|
transform.localScale = Scale;
|
|
}
|
|
}
|