12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- // Animancer // https://kybernetik.com.au/animancer // Copyright 2022 Kybernetik //
- namespace Animancer.FSM
- {
- public partial class StateMachine<TKey, TState>
- {
- /// <summary>
- /// A simple system that can <see cref="StateMachine{TState}.InputBuffer{TStateMachine}.State"/> a state then
- /// try to enter it every time <see cref="StateMachine{TState}.InputBuffer{TStateMachine}.Update(float)"/> is
- /// called until the <see cref="StateMachine{TState}.InputBuffer{TStateMachine}.TimeOut"/> expires.
- /// </summary>
- ///
- /// <remarks>
- /// Documentation: <see href="https://kybernetik.com.au/animancer/docs/manual/fsm/utilities#input-buffers">Input Buffers</see>
- /// </remarks>
- ///
- /// <example>See <see cref="StateMachine{TState}.InputBuffer{TStateMachine}"/>.</example>
- ///
- /// https://kybernetik.com.au/animancer/api/Animancer.FSM/InputBuffer
- ///
- public new class InputBuffer : InputBuffer<StateMachine<TKey, TState>>
- {
- /************************************************************************************************************************/
- /// <summary>The <typeparamref name="TKey"/> of the state this buffer is currently attempting to enter.</summary>
- public TKey Key { get; set; }
- /************************************************************************************************************************/
- /// <summary>Creates a new <see cref="InputBuffer"/>.</summary>
- public InputBuffer() { }
- /// <summary>Creates a new <see cref="InputBuffer"/> for the specified `stateMachine`.</summary>
- public InputBuffer(StateMachine<TKey, TState> stateMachine) : base(stateMachine) { }
- /************************************************************************************************************************/
- /// <summary>
- /// If a state is registered with the `key`, this method calls <see cref="Buffer(TKey, TState, float)"/>
- /// and returns true. Otherwise it returns false.
- /// </summary>
- /// <remarks>Doesn't actually attempt to enter the state until <see cref="Update(float)"/> is called.</remarks>
- public bool Buffer(TKey key, float timeOut)
- {
- if (StateMachine.TryGetValue(key, out var state))
- {
- Buffer(key, state, timeOut);
- return true;
- }
- else return false;
- }
- /// <summary>
- /// Sets the <see cref="Key"/>, <see cref="StateMachine{TState}.InputBuffer.State"/>, and
- /// <see cref="TimeOut"/>.
- /// </summary>
- /// <remarks>Doesn't actually attempt to enter the state until <see cref="Update(float)"/> is called.</remarks>
- public void Buffer(TKey key, TState state, float timeOut)
- {
- Key = key;
- Buffer(state, timeOut);
- }
- /************************************************************************************************************************/
- /// <inheritdoc/>
- protected override bool TryEnterState()
- => StateMachine.TryResetState(Key, State);
- /************************************************************************************************************************/
- /// <inheritdoc/>
- public override void Clear()
- {
- base.Clear();
- Key = default;
- }
- /************************************************************************************************************************/
- }
- }
- }
|