Files
RoomAwareVR/Assets/VRMPAssets/Scripts/Helpers/UIComponentToggler.cs
2025-05-26 00:46:28 +02:00

195 lines
6.0 KiB
C#

using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.XR.Interaction.Toolkit.Utilities.Tweenables.Primitives;
namespace XRMultiplayer
{
public class UIComponentToggler : CalloutGazeController
{
[Header("Component Toggling")]
[SerializeField] CanvasGroup m_CanvasGroup;
[SerializeField] TooltipUI m_TooltipUI;
[SerializeField] float m_FadeDuration = .25f;
[SerializeField] Vector2 m_MinMaxThresholdDistance = new Vector2(2.0f, 5.0f);
[SerializeField] Vector2 m_MinMaxFacingThreshold = new Vector2(.8f, .995f);
[SerializeField] float m_MaxRenderingDistance = 15.0f;
[SerializeField] List<MonoBehaviour> m_ComponentsToToggle;
[SerializeField] GameObject[] m_ObjectsToToggle;
[SerializeField] bool m_StartHidden = true;
[SerializeField] bool m_DisableCanvasGroupObject = false;
#pragma warning disable CS0618 // Type or member is obsolete
FloatTweenableVariable m_FloatFadeTweenableVariable = new FloatTweenableVariable();
#pragma warning restore CS0618 // Type or member is obsolete
bool m_Hidden = false;
bool m_InRange = false;
Coroutine m_FadeRoutine;
// Start is called before the first frame update
void Start()
{
if (m_GazeTransform == null)
{
m_GazeTransform = Camera.main.transform;
}
if (m_CanvasGroup == null)
{
m_CanvasGroup = GetComponentInChildren<CanvasGroup>();
}
if (m_TooltipUI == null)
{
m_TooltipUI = GetComponentInChildren<TooltipUI>();
}
m_FacingThreshold = .98f;
m_FacingEntered.AddListener(delegate { ToggleFade(false); });
m_FacingExited.AddListener(delegate { ToggleFade(true); });
m_FloatFadeTweenableVariable.Subscribe(UpdateFade);
if (m_StartHidden)
{
ToggleFade(true);
}
}
protected override void Update()
{
base.Update();
float currentDistance = Vector3.Distance(transform.position, m_GazeTransform.position);
if (m_InRange)
{
float perc = (Mathf.Clamp(currentDistance, m_MinMaxThresholdDistance.x, m_MinMaxThresholdDistance.y) - m_MinMaxThresholdDistance.x) / (m_MinMaxThresholdDistance.y - m_MinMaxThresholdDistance.x);
m_FacingThreshold = Mathf.Lerp(m_MinMaxFacingThreshold.x, m_MinMaxFacingThreshold.y, perc);
if (currentDistance > m_MaxRenderingDistance)
{
m_InRange = false;
ToggleFade(true);
}
}
else
{
if (currentDistance <= m_MaxRenderingDistance)
{
m_InRange = true;
}
}
}
private void OnDestroy()
{
m_FacingEntered.RemoveListener(delegate { ToggleFade(false); });
m_FacingExited.RemoveListener(delegate { ToggleFade(true); });
}
[ContextMenu("Get References")]
void FindRendererReferences()
{
m_ComponentsToToggle = new List<MonoBehaviour>();
List<Image> images = new List<Image>(GetComponentsInChildren<Image>());
List<TMP_Text> texts = new List<TMP_Text>(GetComponentsInChildren<TMP_Text>());
foreach (Image image in images)
{
m_ComponentsToToggle.Add(image);
}
foreach (TMP_Text text in texts)
{
m_ComponentsToToggle.Add(text);
}
}
[ContextMenu("Toggle Components")]
void ToggleFade()
{
ToggleFade(!m_Hidden);
}
void ToggleFade(bool toggle)
{
m_Hidden = toggle;
if (!m_Hidden)
{
ToggleComponents(true);
}
if (m_FadeRoutine != null) StopCoroutine(m_FadeRoutine);
m_FadeRoutine = StartCoroutine(m_FloatFadeTweenableVariable.PlaySequence(m_FloatFadeTweenableVariable.Value, m_Hidden ? 0.0f : 1.0f, m_FadeDuration, CompleteFade));
}
void ToggleComponents(bool show)
{
foreach (var c in m_ComponentsToToggle)
{
if (c != null)
c.enabled = show;
else
Utils.Log("Component Toggler is missing references", 1);
}
foreach (GameObject go in m_ObjectsToToggle)
{
if (go != null)
go.SetActive(show);
else
Utils.Log("Component Toggler is missing references", 1);
}
if (m_DisableCanvasGroupObject)
{
if (m_CanvasGroup != null)
m_CanvasGroup.gameObject.SetActive(show);
else
Utils.Log("Component Toggler is missing references", 1);
}
if (m_TooltipUI != null)
{
if (!show)
{
if (m_TooltipUI != null)
m_TooltipUI.ResetTooltip();
else
Utils.Log("Component Toggler is missing references", 1);
}
}
}
void UpdateFade(float fadeAmount)
{
if (m_CanvasGroup != null)
{
m_CanvasGroup.alpha = fadeAmount;
}
}
void CompleteFade()
{
if (m_FloatFadeTweenableVariable.Value <= 0.0f)
{
ToggleComponents(false);
}
}
public void ToggleShow(bool show)
{
if (show)
{
m_FacingEntered.Invoke();
}
else
{
CheckPointerExit();
}
}
}
}