Define whether most recent is disabled per state
This commit is contained in:
parent
d7920802cf
commit
afc6781f5c
@ -36,6 +36,10 @@ bool UFFInputBufferComponent::CheckInputSequence(const FFFInputSequence& InputSe
|
||||
switch (RequiredButtonState)
|
||||
{
|
||||
// TODO: should it be (PrevInput & RequiredButtons) == RequiredButtons or what we have now?
|
||||
// TODO: If you have a sequence that is defined as something like button 1 pressed + button 2 pressed
|
||||
// and the buttons are pressed on the same exact frame, then this implementation will not
|
||||
// account for that. We should keep checking the sequences against the current frame's
|
||||
// inputs until no sequences are detected, then continue on checking through the input buffer.
|
||||
case EFFButtonState::BTNS_Pressed:
|
||||
if(!(PrevInput & RequiredButtons | PrevDisable) &&
|
||||
CurrInput & RequiredButtons & ~CurrDisable)
|
||||
|
@ -64,6 +64,15 @@ bool UFFState::CanTransition(const FFFStateContext& InStateContext)
|
||||
void UFFState::Enter(const FFFStateContext& InStateContext)
|
||||
{
|
||||
PlayMontage(InStateContext);
|
||||
|
||||
if(bDisableMostRecentInputOnEntry)
|
||||
{
|
||||
IFFStateOwnerInterface* PC = Cast<IFFStateOwnerInterface>(InStateContext.Owner);
|
||||
if(PC)
|
||||
{
|
||||
PC->DisableMostRecentInput();
|
||||
}
|
||||
}
|
||||
|
||||
OnEnter(InStateContext);
|
||||
}
|
||||
|
@ -112,6 +112,13 @@ public:
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="UFF State Properties")
|
||||
TArray<FFFInputSequence> InputSequences;
|
||||
|
||||
/**
|
||||
* Should the most recent input in the controlling player's input buffer be disabled when
|
||||
* entering this state?
|
||||
*/
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="UFF State Properties")
|
||||
bool bDisableMostRecentInputOnEntry = true;
|
||||
|
||||
/**
|
||||
* If true the state can transition from itself into itself without having to go through
|
||||
* another state like Idle
|
||||
|
@ -102,19 +102,7 @@ void UFFStateMachineComponent::GoToState(UFFState* NewState, EFFStateFinishReaso
|
||||
{
|
||||
check(CurrentState);
|
||||
check(NewState);
|
||||
|
||||
// if state being transitioned into requires an input sequence we need to disable the most
|
||||
// recent input in the player controller input buffer to prevent unwanted "double firing" of
|
||||
// actions that have short durations but very lenient required input sequences
|
||||
if(NewState->InputSequences.Num() > 0)
|
||||
{
|
||||
IFFStateOwnerInterface* PC = Cast<IFFStateOwnerInterface>(Owner);
|
||||
if(PC)
|
||||
{
|
||||
PC->DisableMostRecentInput();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
CurrentState->Exit(GetCurrentStateContext(), StateFinishReason);
|
||||
TicksInState = 0;
|
||||
OnLandedTick = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user