Hello, new customer here. When I realized what this was and that you were focusing on multiplayer lately I couldn't resist.
Where exactly do I find the demo project?
Where exactly do I find the demo project?
OtherActor->StateMachine->GetState(uint8 Id)->OnBeginState.AddDynamic(this,&AThisClass::OnSomeStateBegin)
virtual void InitializeFSM() override; void UMYStateMachine::InitializeFSM() { Super::InitializeFSM(); // Bind your functions to States here... GetState(ID)->OnBeginState.AddDynamic(this,&UMYStateMachine::OnSomeStateBegin); GetState(ID)->OnUpdateState.AddDynamic(this,&UMYStateMachine::OnSomeStateUpdate); GetState(ID)->OnExitState.AddDynamic(this,&UMYStateMachine::OnSomeStateExit); }
void AThisClass::PostInitializeComponents() { OtherActor->StateMachine->OnInitialized.AddDynamic(this,&AThisClass::OnOtherActorFSMCompletedInitialization); } void AThisClass::OnOtherActorFSMCompletedInitialization(const UStateMachineComponent* Context) { if (Context != OtherActor->StateMachine) {return;} // Now we know that the another FSM is fully initialized, so now we can safely bind to its States... OtherActor->StateMachine->GetState(ID)->OnBeginState.AddDynamic(this,&AThisClass::OnOtherActorFSMStateBegin); OtherActor->StateMachine->GetState(ID)->OnUpdateState.AddDynamic(this,&AThisClass::OnOtherActorFSMUpdate); OtherActor->StateMachine->GetState(ID)->OnExitState.AddDynamic(this,&AThisClass::OnOtherActorFSMStateExit); }
#pragma once #include "UFSM.h" #include "GameFramework/Character.h" #include "FSM_NativeCharacter.generated.h" UCLASS() class MYGAMEAPI AFSM_NativeCharacter : public ACharacter, public IFSMInterface { GENERATED_BODY() public: // Sets default values for this character's properties AFSM_NativeCharacter(); UPROPERTY() UStateMachineComponent* StateMachine; protected: // Called when the game starts or when spawned virtual void BeginPlay() override; public: // Called every frame virtual void Tick(float DeltaTime) override; // Called to bind functionality to input virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override; UFUNCTION() void BindBeginIdle(); UFUNCTION() void BindUpdateIdle(); UFUNCTION() void BindExitIdle(); public: /// FSM: Initialization Interface. UFUNCTION(Category = "FSM", BlueprintNativeEvent, BlueprintCallable, meta = (DisplayName = "FSM: On Initialized", Keywords = "FSM Initialization Interface")) void OnInitializedFSM(const UStateMachineComponent* Context); // /// FSM: On Any 'On Begin' Event. UFUNCTION(Category = "FSM", BlueprintNativeEvent, BlueprintCallable, meta = (DisplayName = "FSM: On Any Begin", Keywords = "FSM Begin Event")) void OnAnyBeginState(const UStateMachineComponent* Context, const FName WithStateName, const uint8 WithStateID, const uint8 WithPrevious); // /// FSM: On Any 'On Update' Event. UFUNCTION(Category = "FSM", BlueprintNativeEvent, BlueprintCallable, meta = (DisplayName = "FSM: On Any Update", Keywords = "FSM Update Event")) void OnAnyUpdateState(const UStateMachineComponent* Context, const FName WithStateName, const uint8 WithStateID, const float WithStateTime); // /// FSM: On Any 'On Exit' Event. UFUNCTION(Category = "FSM", BlueprintNativeEvent, BlueprintCallable, meta = (DisplayName = "FSM: On Any Exit", Keywords = "FSM Exit Event")) void OnAnyExitState(const UStateMachineComponent* Context, const FName WithStateName, const uint8 WithStateID); };
#include "FSM_NativeCharacter.h" #include "Unreal_FSM.h" AFSM_NativeCharacter::AFSM_NativeCharacter() { PrimaryActorTick.bCanEverTick = true; StateMachine = CreateDefaultSubobject<UStateMachineComponent>(TEXT("StateMachine")); if (StateMachine->IsValidLowLevelFast()) { StateMachine->AddState(0,FName("Idle")); StateMachine->AddState(1,FName("Stand")); StateMachine->AddState(2,FName("Run")); StateMachine->AddState(3,FName("Push")); StateMachine->SetActive(true,true); StateMachine->bAutoActivate = true; StateMachine->Debug = true; } } void AFSM_NativeCharacter::BeginPlay() { Super::BeginPlay(); FSM_Transition Trans; StateMachine->SetStateID(0,Trans); } void AFSM_NativeCharacter::Tick(float DeltaTime) { Super::Tick(DeltaTime); FSM_Transition Trans; if (StateMachine->GetTime() > 4 && (StateMachine->GetCurrentStateID() < StateMachine->GetLastStateID())) { StateMachine->SetStateID(StateMachine->GetCurrentStateID()+1,Trans); } else if (StateMachine->GetTime() > 4) { StateMachine->SetStateID(0,Trans); } } void AFSM_NativeCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) { Super::SetupPlayerInputComponent(PlayerInputComponent); } void AFSM_NativeCharacter::OnInitializedFSM_Implementation(const UStateMachineComponent* Context) { if (Context != StateMachine) {return;} // StateMachine->GetState(0)->OnBeginState.AddDynamic(this,&AFSM_NativeCharacter::BindBeginIdle); StateMachine->GetState(0)->OnUpdateState.AddDynamic(this,&AFSM_NativeCharacter::BindUpdateIdle); StateMachine->GetState(0)->OnExitState.AddDynamic(this,&AFSM_NativeCharacter::BindExitIdle); } void AFSM_NativeCharacter::OnAnyBeginState_Implementation(const UStateMachineComponent* Context, const FName WithStateName, const uint8 WithStateID, const uint8 WithPrevious) {/*...*/} void AFSM_NativeCharacter::OnAnyUpdateState_Implementation(const UStateMachineComponent* Context, const FName WithStateName, const uint8 WithStateID, const float WithStateTime) {/*...*/} void AFSM_NativeCharacter::OnAnyExitState_Implementation(const UStateMachineComponent* Context, const FName WithStateName, const uint8 WithStateID) {/*...*/} void AFSM_NativeCharacter::BindBeginIdle() { UE_LOG(LogTemp,Warning,TEXT("{FSM}:: %s"),TEXT("BINDED Begin!")); } void AFSM_NativeCharacter::BindUpdateIdle() { UE_LOG(LogTemp,Warning,TEXT("{FSM}:: %s"),TEXT("BINDED Update!")); } void AFSM_NativeCharacter::BindExitIdle() { UE_LOG(LogTemp,Warning,TEXT("{FSM}:: %s"),TEXT("BINDED Exit!")); }
Comment