using System;
using UnityEngine;
namespace Unity.VisualScripting
{
/// <summary>
/// Called when a specified number of seconds has elapsed.
/// </summary>
[UnitCategory("Events/Time")]
[Obsolete("Use Wait For Seconds or Timer instead.")]
public sealed class OnTimerElapsed : MachineEventUnit<EmptyEventArgs>
{
public new class Data : EventUnit<EmptyEventArgs>.Data
{
public float time;
public bool triggered;
}
public override IGraphElementData CreateData()
{
return new Data();
}
protected override string hookName => EventHooks.Update;
/// <summary>
/// The number of seconds to await.
/// </summary>
[DoNotSerialize]
[PortLabel("Delay")]
public ValueInput seconds { get; private set; }
/// <summary>
/// Whether to ignore the time scale.
/// </summary>
[DoNotSerialize]
[PortLabel("Unscaled")]
public ValueInput unscaledTime { get; private set; }
protected override void Definition()
{
base.Definition();
seconds = ValueInput(nameof(seconds), 0f);
unscaledTime = ValueInput(nameof(unscaledTime), false);
}
public override void StartListening(GraphStack stack)
{
base.StartListening(stack);
var data = stack.GetElementData<Data>(this);
data.triggered = false;
data.time = 0;
}
protected override bool ShouldTrigger(Flow flow, EmptyEventArgs args)
{
var data = flow.stack.GetElementData<Data>(this);
if (data.triggered)
{
return false;
}
var increment = flow.GetValue<bool>(unscaledTime) ? Time.unscaledDeltaTime : Time.deltaTime;
var threshold = flow.GetValue<float>(seconds);
data.time += increment;
if (data.time >= threshold)
{
data.triggered = true;
return true;
}
return false;
}
}
}