@@ -885,6 +885,10 @@ public void ResetActionState(int actionIndex, InputActionPhase toPhase = InputAc
885885 actionState ->lastCompletedInUpdate = default ;
886886 actionState ->pressedInUpdate = default ;
887887 actionState ->releasedInUpdate = default ;
888+ actionState ->framePerformed = default ;
889+ actionState ->frameCompleted = default ;
890+ actionState ->framePressed = default ;
891+ actionState ->frameReleased = default ;
888892 actionState ->frame = default ;
889893 }
890894
@@ -1563,6 +1567,7 @@ private void ProcessButtonState(ref TriggerState trigger, int actionIndex, Bindi
15631567 var actionState = & actionStates [ actionIndex ] ;
15641568 if ( ! actionState ->isPressed && actuation >= pressPoint )
15651569 {
1570+ actionState ->framePressed = Time . frameCount ;
15661571 actionState ->pressedInUpdate = InputUpdate . s_UpdateStepCount ;
15671572 actionState ->isPressed = true ;
15681573 actionState ->frame = Time . frameCount ;
@@ -1572,6 +1577,7 @@ private void ProcessButtonState(ref TriggerState trigger, int actionIndex, Bindi
15721577 var releasePoint = pressPoint * ButtonControl . s_GlobalDefaultButtonReleaseThreshold ;
15731578 if ( actuation <= releasePoint )
15741579 {
1580+ actionState ->frameReleased = Time . frameCount ;
15751581 actionState ->releasedInUpdate = InputUpdate . s_UpdateStepCount ;
15761582 actionState ->isPressed = false ;
15771583 actionState ->frame = Time . frameCount ;
@@ -2436,6 +2442,7 @@ private void ChangePhaseOfActionInternal(int actionIndex, TriggerState* actionSt
24362442 newState . frame = Time . frameCount ;
24372443 if ( newPhase == InputActionPhase . Performed )
24382444 {
2445+ newState . framePerformed = Time . frameCount ;
24392446 newState . lastPerformedInUpdate = InputUpdate . s_UpdateStepCount ;
24402447 newState . lastCanceledInUpdate = actionState ->lastCanceledInUpdate ;
24412448
@@ -2463,10 +2470,16 @@ private void ChangePhaseOfActionInternal(int actionIndex, TriggerState* actionSt
24632470 // When we go from Performed to Disabling, we take a detour through Canceled.
24642471 // To replicate the behavior of releasedInUpdate where it doesn't get updated when the action is disabled
24652472 // from being performed, we skip updating lastCompletedInUpdate if Disabled is the phase after Canceled.
2466- if ( actionState ->phase == InputActionPhase . Performed && newPhase != InputActionPhase . Performed && ! isDisablingAction )
2473+ if ( actionState ->phase == InputActionPhase . Performed && newPhase != InputActionPhase . Performed &&
2474+ ! isDisablingAction )
2475+ {
2476+ newState . frameCompleted = Time . frameCount ;
24672477 newState . lastCompletedInUpdate = InputUpdate . s_UpdateStepCount ;
2478+ }
24682479 else
2480+ {
24692481 newState . lastCompletedInUpdate = actionState ->lastCompletedInUpdate ;
2482+ }
24702483
24712484 newState . pressedInUpdate = actionState ->pressedInUpdate ;
24722485 newState . releasedInUpdate = actionState ->releasedInUpdate ;
@@ -3641,6 +3654,10 @@ public struct TriggerState
36413654 [ FieldOffset ( 44 ) ] private uint m_ReleasedInUpdate ;
36423655 [ FieldOffset ( 48 ) ] private uint m_LastCompletedInUpdate ;
36433656 [ FieldOffset ( 52 ) ] private int m_Frame ;
3657+ [ FieldOffset ( 52 ) ] private int m_FramePerformed ;
3658+ [ FieldOffset ( 52 ) ] private int m_FramePressed ;
3659+ [ FieldOffset ( 52 ) ] private int m_FrameReleased ;
3660+ [ FieldOffset ( 52 ) ] private int m_FrameCompleted ;
36443661
36453662 /// <summary>
36463663 /// Phase being triggered by the control value change.
@@ -3802,6 +3819,27 @@ internal int frame
38023819 set => m_Frame = value ;
38033820 }
38043821
3822+ internal int framePerformed
3823+ {
3824+ get => m_FramePerformed ;
3825+ set => m_FramePerformed = value ;
3826+ }
3827+ internal int framePressed
3828+ {
3829+ get => m_FramePressed ;
3830+ set => m_FramePressed = value ;
3831+ }
3832+ internal int frameReleased
3833+ {
3834+ get => m_FrameReleased ;
3835+ set => m_FrameReleased = value ;
3836+ }
3837+ internal int frameCompleted
3838+ {
3839+ get => m_FrameCompleted ;
3840+ set => m_FrameCompleted = value ;
3841+ }
3842+
38053843 /// <summary>
38063844 /// Update step count (<see cref="InputUpdate.s_UpdateStepCount"/>) in which action completed last.
38073845 /// Zero if the action did not become completed yet. Also reset to zero when the action is hard reset.
0 commit comments