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; | ||||
|         switch (RequiredButtonState) | ||||
|         { | ||||
|             // TODO: should it be (PrevInput & RequiredButtons) == RequiredButtons or what we have now?
 | ||||
|             case EFFButtonState::BTNS_Pressed: | ||||
|                 if(!(PrevInput & RequiredButtons | PrevDisable) &&  | ||||
|                    CurrInput & RequiredButtons & ~CurrDisable) | ||||
|  | ||||
| @ -10,6 +10,43 @@ | ||||
| // UE includes
 | ||||
| #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) | ||||
| { | ||||
|     if(InStateContext.Avatar) | ||||
| @ -54,43 +91,12 @@ void UFFState::Update(float OneFrame, 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; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -109,8 +109,7 @@ public: | ||||
| 	 *	all state entry conditions were met AND | ||||
| 	 *	at least one input sequence is present in the Owner's input buffer | ||||
| 	 */  | ||||
| 	UFUNCTION(BlueprintNativeEvent, Category="UFF|State") | ||||
| 	bool CanTransition(const FFFStateContext& InStateContext); | ||||
| 	virtual bool CanTransition(const FFFStateContext& InStateContext); | ||||
| 
 | ||||
|     /**
 | ||||
| 	 *	Called whenever this state is transitioned into. | ||||
| @ -151,6 +150,12 @@ public: | ||||
|     UFUNCTION(BlueprintCallable) | ||||
| 	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 | ||||
|      */ | ||||
|  | ||||
| @ -85,7 +85,16 @@ void UFFStateMachineComponent::RemoveState(FName StateToRemove) | ||||
|     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(NewState); | ||||
| @ -97,12 +106,12 @@ void UFFStateMachineComponent::SwitchStates(UFFState* NewState) | ||||
|     CurrentSubStateLabel = NAME_None; | ||||
| } | ||||
| 
 | ||||
| void UFFStateMachineComponent::SwitchToEntryState() | ||||
| void UFFStateMachineComponent::GoToEntryState() | ||||
| { | ||||
|     // can't have an entry state if there are no states
 | ||||
|     check(States.Num() > 0); | ||||
| 
 | ||||
|     SwitchStates(States[0]); | ||||
|     GoToState(States[0]); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| @ -170,7 +179,7 @@ void UFFStateMachineComponent::FixedTick(float OneFrame) | ||||
|     if(StateToTransitionTo &&  | ||||
|         (CurrentState->Name != StateToTransitionTo->Name || StateToTransitionTo->bCanTransitionToSelf)) | ||||
|     { | ||||
|         SwitchStates(StateToTransitionTo); | ||||
|         GoToState(StateToTransitionTo); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|  | ||||
| @ -62,19 +62,26 @@ public: | ||||
| 	 */ | ||||
| 	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 | ||||
| 	 * | ||||
| 	 *	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 | ||||
| 	 */ | ||||
| 	void SwitchToEntryState(); | ||||
| 	void GoToEntryState(); | ||||
| 
 | ||||
| 	UFUNCTION(BlueprintPure) | ||||
|     UFUNCTION(BlueprintPure) | ||||
| 	FORCEINLINE int64 GetTicksInState() const; | ||||
| 
 | ||||
|     /**
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user