OldBlueWater/BlueWater/Assets/Doozy/Runtime/Reactor/Ticker/Heartbeat.cs
2023-08-02 15:08:03 +09:00

109 lines
4.3 KiB
C#

// Copyright (c) 2015 - 2023 Doozy Entertainment. All Rights Reserved.
// This code can only be used under the standard Unity Asset Store End User License Agreement
// A Copy of the EULA APPENDIX 1 is available at http://unity3d.com/company/legal/as_terms
using Doozy.Runtime.Reactor.Internal;
namespace Doozy.Runtime.Reactor.Ticker
{
/// <summary> Base class that registers to a tick service and ticks a target callback (when registered) </summary>
public abstract class Heartbeat : IUseTickService
{
public bool isActive { get; private set; }
/// <summary> Time updater </summary>
public virtual double timeSinceStartup => 0f;
public double lastUpdateTime { get; set; }
public double deltaTime
{
get
{
double delta = timeSinceStartup - lastUpdateTime;
lastUpdateTime = timeSinceStartup;
return delta;
}
}
/// <summary>
/// Callback invoked every time the tick service (this Heartbeat is registered to) ticks
/// <para/> Register to a tick service to Start invoking on every tick
/// <para/> Unregister from the tick service to Stop invoking on every tick
/// </summary>
public ReactionCallback onTickCallback { get; internal set; }
/// <summary> Construct a Heartbeat with a target callback </summary>
/// <param name="onTickCallback"> Target callback </param>
protected Heartbeat(ReactionCallback onTickCallback) =>
this.onTickCallback = onTickCallback;
/// <summary> Tick the target callback </summary>
public virtual void Tick() =>
onTickCallback?.Invoke();
/// <summary> Register to a Tick Service to Start ticking the callback </summary>
public virtual void RegisterToTickService()
{
isActive = true;
lastUpdateTime = timeSinceStartup;
}
/// <summary> Unregister from the Tick Service to Stop ticking the callback </summary>
public virtual void UnregisterFromTickService()
{
isActive = false;
}
}
public static class HeartbeatExtensions
{
/// <summary>
/// Clear any callbacks from being called by onTickCallback
/// <para/> This method sets onTickCallback to null
/// </summary>
/// <param name="target"> Target Heartbeat </param>
public static T ClearOnTickCallback<T>(this T target) where T : Heartbeat
{
target.onTickCallback = null;
return target;
}
/// <summary>
/// Set a target callback that will be invoked every time the tick service (this Heartbeat is registered to) ticks
/// <para/> This method clears any other callbacks for onTickCallback and sets a single one
/// </summary>
/// <param name="target"> Target Heartbeat </param>
/// <param name="callback"> Target callback </param>
public static T SetOnTickCallback<T>(this T target, ReactionCallback callback) where T : Heartbeat
{
target.onTickCallback = callback;
return target;
}
/// <summary>
/// Add a target callback that will be invoked every time the tick service (this Heartbeat is registered to) ticks
/// <para/> This method allows adding multiple callbacks for onTickCallback
/// </summary>
/// <param name="target"> Target Heartbeat </param>
/// <param name="callback"> Target callback </param>
public static T AddOnTickCallback<T>(this T target, ReactionCallback callback) where T : Heartbeat
{
target.onTickCallback -= callback; //sanity check
target.onTickCallback += callback;
return target;
}
/// <summary>
/// Remove a target callback from being invoked every time the tick service (this Heartbeat is registered to) ticks
/// </summary>
/// <param name="target"> Target Heartbeat </param>
/// <param name="callback"> Target callback </param>
public static T RemoveOnTickCallback<T>(this T target, ReactionCallback callback) where T : Heartbeat
{
target.onTickCallback -= callback;
return target;
}
}
}