Files
dungeons/Assets/UltimateXR/Runtime/Scripts/Animation/GameObjects/UxrToggleObject.cs
2024-08-06 21:58:35 +02:00

87 lines
2.8 KiB
C#

// --------------------------------------------------------------------------------------------------------------------
// <copyright file="UxrToggleObject.cs" company="VRMADA">
// Copyright (c) VRMADA, All rights reserved.
// </copyright>
// --------------------------------------------------------------------------------------------------------------------
using UltimateXR.Core.Components;
using UnityEngine;
namespace UltimateXR.Animation.GameObjects
{
/// <summary>
/// Component that allows to toggle <see cref="GameObject" /> active state back and forth at random times.
/// </summary>
public class UxrToggleObject : UxrComponent
{
#region Inspector Properties/Serialized Fields
[SerializeField] private GameObject _gameObject;
[SerializeField] private float _enabledDurationMin;
[SerializeField] private float _enabledDurationMax;
[SerializeField] private float _disabledDurationMin;
[SerializeField] private float _disabledDurationMax;
[SerializeField] private bool _useUnscaledTime;
#endregion
#region Unity
/// <summary>
/// Called each time the component is enabled. Sets up the next toggle time.
/// </summary>
protected override void OnEnable()
{
base.OnEnable();
_startTime = _useUnscaledTime ? Time.unscaledTime : Time.time;
_nextToggleTime = GetNextRelativeToggleTime();
}
/// <summary>
/// Called on each update. Checks if it is time to toggle the GameObjects.
/// </summary>
private void Update()
{
float time = (_useUnscaledTime ? Time.unscaledTime : Time.time) - _startTime;
if (time > _nextToggleTime)
{
_gameObject.SetActive(!_gameObject.activeSelf);
_startTime = _useUnscaledTime ? Time.unscaledTime : Time.time;
_nextToggleTime = GetNextRelativeToggleTime();
}
}
#endregion
#region Private Methods
/// <summary>
/// Gets the next time the objects will be toggled.
/// </summary>
/// <returns>Next toggle time in seconds relative to the current time</returns>
private float GetNextRelativeToggleTime()
{
if (_gameObject && _gameObject.activeSelf)
{
return Random.Range(_enabledDurationMin, _enabledDurationMax);
}
if (_gameObject && !_gameObject.activeSelf)
{
return Random.Range(_disabledDurationMin, _disabledDurationMax);
}
return 0.0f;
}
#endregion
#region Private Types & Data
private float _startTime;
private float _nextToggleTime;
#endregion
}
}