Skip to content

Commit a814fa2

Browse files
committed
save frame count when status changed
1 parent ea856c3 commit a814fa2

File tree

2 files changed

+43
-5
lines changed

2 files changed

+43
-5
lines changed

Packages/com.unity.inputsystem/InputSystem/Actions/InputAction.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1262,7 +1262,7 @@ public unsafe bool WasPressedThisFrame()
12621262
if (state != null)
12631263
{
12641264
var actionStatePtr = &state.actionStates[m_ActionIndexInState];
1265-
return actionStatePtr->frame == ExpectedFrame();
1265+
return actionStatePtr->framePressed == ExpectedFrame();
12661266
}
12671267

12681268
return false;
@@ -1348,7 +1348,7 @@ public unsafe bool WasReleasedThisFrame()
13481348
if (state != null)
13491349
{
13501350
var actionStatePtr = &state.actionStates[m_ActionIndexInState];
1351-
return actionStatePtr->frame == ExpectedFrame();
1351+
return actionStatePtr->frameReleased == ExpectedFrame();
13521352
}
13531353

13541354
return false;
@@ -1445,7 +1445,7 @@ public unsafe bool WasPerformedThisFrame()
14451445
if (state != null)
14461446
{
14471447
var actionStatePtr = &state.actionStates[m_ActionIndexInState];
1448-
return actionStatePtr->frame == ExpectedFrame();
1448+
return actionStatePtr->framePerformed == ExpectedFrame();
14491449
}
14501450

14511451
return false;
@@ -1559,7 +1559,7 @@ public unsafe bool WasCompletedThisFrame()
15591559
if (state != null)
15601560
{
15611561
var actionStatePtr = &state.actionStates[m_ActionIndexInState];
1562-
return actionStatePtr->frame == ExpectedFrame();
1562+
return actionStatePtr->frameCompleted == ExpectedFrame();
15631563
}
15641564

15651565
return false;

Packages/com.unity.inputsystem/InputSystem/Actions/InputActionState.cs

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)