Move state macros to plugin and make CanTransition virtual function
This commit is contained in:
parent
8420f654e8
commit
e032ddaaa5
BIN
Content/BPML_StateMacros.uasset
Normal file
BIN
Content/BPML_StateMacros.uasset
Normal file
Binary file not shown.
@ -28,6 +28,7 @@ bool UFFInputBufferComponent::CheckInputSequence(const FFFInputSequence& InputSe
|
|||||||
int32 CurrDisable = InputBuffer[InpIdx].DisabledButtons;
|
int32 CurrDisable = InputBuffer[InpIdx].DisabledButtons;
|
||||||
switch (RequiredButtonState)
|
switch (RequiredButtonState)
|
||||||
{
|
{
|
||||||
|
// TODO: should it be (PrevInput & RequiredButtons) == RequiredButtons or what we have now?
|
||||||
case EFFButtonState::BTNS_Pressed:
|
case EFFButtonState::BTNS_Pressed:
|
||||||
if(!(PrevInput & RequiredButtons | PrevDisable) &&
|
if(!(PrevInput & RequiredButtons | PrevDisable) &&
|
||||||
CurrInput & RequiredButtons & ~CurrDisable)
|
CurrInput & RequiredButtons & ~CurrDisable)
|
||||||
|
@ -10,6 +10,43 @@
|
|||||||
// UE includes
|
// UE includes
|
||||||
#include "Components/SkeletalMeshComponent.h"
|
#include "Components/SkeletalMeshComponent.h"
|
||||||
|
|
||||||
|
bool UFFState::CanTransition(const FFFStateContext& InStateContext)
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Check to see if avatar implements StateAvatarInterface
|
||||||
|
* if so then
|
||||||
|
* Check if the avatar is in the correct stance to perform this action
|
||||||
|
* Check if the state is enabled
|
||||||
|
* Check that all state entry conditions are met if there are any
|
||||||
|
*
|
||||||
|
* Check to see if the owner implements the StateOwnerInterface
|
||||||
|
* Check input conditions if there are any
|
||||||
|
*
|
||||||
|
* If all state entry conditions are good and at least one input condition is good then we can transition
|
||||||
|
* so return true otherwise return false
|
||||||
|
*/
|
||||||
|
IFFStateAvatarInterface* SAI = Cast<IFFStateAvatarInterface>(InStateContext.Avatar);
|
||||||
|
if(SAI)
|
||||||
|
{
|
||||||
|
if(!(SAI->CheckStance(StanceRequired) && SAI->CheckStateEnabled(StateType) && SAI->CheckStateEntryConditions(EntryConditions)))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IFFStateOwnerInterface* SOI = Cast<IFFStateOwnerInterface>(InStateContext.Owner);
|
||||||
|
if(SOI)
|
||||||
|
{
|
||||||
|
if(!SOI->CheckInputSequences(InputSequences))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return OnCanTransition(InStateContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void UFFState::Enter(const FFFStateContext& InStateContext)
|
void UFFState::Enter(const FFFStateContext& InStateContext)
|
||||||
{
|
{
|
||||||
if(InStateContext.Avatar)
|
if(InStateContext.Avatar)
|
||||||
@ -54,43 +91,12 @@ void UFFState::Update(float OneFrame, const FFFStateContext& InStateContext)
|
|||||||
|
|
||||||
void UFFState::Finish(const FFFStateContext& InStateContext)
|
void UFFState::Finish(const FFFStateContext& InStateContext)
|
||||||
{
|
{
|
||||||
InStateContext.Parent->SwitchToEntryState();
|
InStateContext.Parent->GoToEntryState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool UFFState::CanTransition_Implementation(const FFFStateContext& InStateContext)
|
bool UFFState::OnCanTransition_Implementation(const FFFStateContext& InStateContext)
|
||||||
{
|
{
|
||||||
/**
|
|
||||||
* Check to see if avatar implements StateAvatarInterface
|
|
||||||
* if so then
|
|
||||||
* Check if the avatar is in the correct stance to perform this action
|
|
||||||
* Check if the state is enabled
|
|
||||||
* Check that all state entry conditions are met if there are any
|
|
||||||
*
|
|
||||||
* Check to see if the owner implements the StateOwnerInterface
|
|
||||||
* Check input conditions if there are any
|
|
||||||
*
|
|
||||||
* If all state entry conditions are good and at least one input condition is good then we can transition
|
|
||||||
* so return true otherwise return false
|
|
||||||
*/
|
|
||||||
IFFStateAvatarInterface* SAI = Cast<IFFStateAvatarInterface>(InStateContext.Avatar);
|
|
||||||
if(SAI)
|
|
||||||
{
|
|
||||||
if(!(SAI->CheckStance(StanceRequired) && SAI->CheckStateEnabled(StateType) && SAI->CheckStateEntryConditions(EntryConditions)))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
IFFStateOwnerInterface* SOI = Cast<IFFStateOwnerInterface>(InStateContext.Owner);
|
|
||||||
if(SOI)
|
|
||||||
{
|
|
||||||
if(!SOI->CheckInputSequences(InputSequences))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,8 +109,7 @@ public:
|
|||||||
* all state entry conditions were met AND
|
* all state entry conditions were met AND
|
||||||
* at least one input sequence is present in the Owner's input buffer
|
* at least one input sequence is present in the Owner's input buffer
|
||||||
*/
|
*/
|
||||||
UFUNCTION(BlueprintNativeEvent, Category="UFF|State")
|
virtual bool CanTransition(const FFFStateContext& InStateContext);
|
||||||
bool CanTransition(const FFFStateContext& InStateContext);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called whenever this state is transitioned into.
|
* Called whenever this state is transitioned into.
|
||||||
@ -151,6 +150,12 @@ public:
|
|||||||
UFUNCTION(BlueprintCallable)
|
UFUNCTION(BlueprintCallable)
|
||||||
virtual void Finish(const FFFStateContext& InStateContext);
|
virtual void Finish(const FFFStateContext& InStateContext);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Blueprint hook for overriding the CanTransition logic
|
||||||
|
*/
|
||||||
|
UFUNCTION(BlueprintNativeEvent, Category="UFF|State|Events")
|
||||||
|
bool OnCanTransition(const FFFStateContext& InStateContext);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Blueprint hook for whenever this state is transitioned into
|
* Blueprint hook for whenever this state is transitioned into
|
||||||
*/
|
*/
|
||||||
|
@ -85,7 +85,16 @@ void UFFStateMachineComponent::RemoveState(FName StateToRemove)
|
|||||||
UE_LOG(LogTemp, Error, TEXT("UFFStateMachineComponent::RemoveState is not yet implemented"));
|
UE_LOG(LogTemp, Error, TEXT("UFFStateMachineComponent::RemoveState is not yet implemented"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void UFFStateMachineComponent::SwitchStates(UFFState* NewState)
|
void UFFStateMachineComponent::GoToState(FName NewStateName)
|
||||||
|
{
|
||||||
|
UFFState* NewState = FindStateWithName(NewStateName);
|
||||||
|
if(NewState)
|
||||||
|
{
|
||||||
|
GoToState(NewState);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UFFStateMachineComponent::GoToState(UFFState* NewState)
|
||||||
{
|
{
|
||||||
check(CurrentState);
|
check(CurrentState);
|
||||||
check(NewState);
|
check(NewState);
|
||||||
@ -97,12 +106,12 @@ void UFFStateMachineComponent::SwitchStates(UFFState* NewState)
|
|||||||
CurrentSubStateLabel = NAME_None;
|
CurrentSubStateLabel = NAME_None;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UFFStateMachineComponent::SwitchToEntryState()
|
void UFFStateMachineComponent::GoToEntryState()
|
||||||
{
|
{
|
||||||
// can't have an entry state if there are no states
|
// can't have an entry state if there are no states
|
||||||
check(States.Num() > 0);
|
check(States.Num() > 0);
|
||||||
|
|
||||||
SwitchStates(States[0]);
|
GoToState(States[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -170,7 +179,7 @@ void UFFStateMachineComponent::FixedTick(float OneFrame)
|
|||||||
if(StateToTransitionTo &&
|
if(StateToTransitionTo &&
|
||||||
(CurrentState->Name != StateToTransitionTo->Name || StateToTransitionTo->bCanTransitionToSelf))
|
(CurrentState->Name != StateToTransitionTo->Name || StateToTransitionTo->bCanTransitionToSelf))
|
||||||
{
|
{
|
||||||
SwitchStates(StateToTransitionTo);
|
GoToState(StateToTransitionTo);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -62,17 +62,24 @@ public:
|
|||||||
*/
|
*/
|
||||||
void RemoveState(FName StateToRemove);
|
void RemoveState(FName StateToRemove);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transitions from CurrentState to the new state with the name passed to this function
|
||||||
|
*
|
||||||
|
* Triggers the Exit callback on the CurrentState and the Enter callback on the new state
|
||||||
|
*/
|
||||||
|
void GoToState(FName NewStateName);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Transitions from CurrentState to the new state passed to this function
|
* Transitions from CurrentState to the new state passed to this function
|
||||||
*
|
*
|
||||||
* Triggers the Exit callback on the CurrentState and the Enter callback on the new state
|
* Triggers the Exit callback on the CurrentState and the Enter callback on the new state
|
||||||
*/
|
*/
|
||||||
void SwitchStates(UFFState* NewState);
|
void GoToState(UFFState* NewState);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Transitions from CurrentState to the default entry state
|
* Transitions from CurrentState to the default entry state
|
||||||
*/
|
*/
|
||||||
void SwitchToEntryState();
|
void GoToEntryState();
|
||||||
|
|
||||||
UFUNCTION(BlueprintPure)
|
UFUNCTION(BlueprintPure)
|
||||||
FORCEINLINE int64 GetTicksInState() const;
|
FORCEINLINE int64 GetTicksInState() const;
|
||||||
|
Loading…
Reference in New Issue
Block a user