ue 逻辑状态机

逻辑状态机

为了实现对目标状态的控制,以及广播改变状态后的事件,可在蓝图中继续处理不同状态下的行为。

实现过程:

1.继承ActorComponent实现LogicStateMachine;

2.被击中时触发设置状态;

3.状态进入/退出时触发事件。

主要代码

LogicStateMachine.h

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /* 
  2. *author : Jia Zhipeng 
  3. *class : LogicStateMachine 
  4. */  
  5. //use enum metadata to save priority  
  6. UENUM(BlueprintType)  
  7. enum LogicStateEnum  
  8. {  
  9.     LS_Default = 0  UMETA(DisplayName = "Default", Priority = 1),  
  10.     LS_Frozen   UMETA(DisplayName = "Frozen", Priority = 1),  
  11.     LS_Fly  UMETA(DisplayName = "Fly", Priority = 1),  
  12.     LS_OnGround     UMETA(DisplayName = "OnGround", Priority = 1),  
  13.     LS_Faint    UMETA(DisplayName = "Faint", Priority = 1),  
  14.     LS_Back     UMETA(DisplayName = "Back", Priority = 1),  
  15.     LogicStateNum  UMETA(Hidden),  
  16. };  
  17. DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FChangeStateSignature, LogicStateEnum, LogicState);  
  18. UCLASS(ClassGroup = LogicState, meta = (BlueprintSpawnableComponent), ShowCategories = (LogicState))  
  19. class CLIENT_API ULogicStateMachine : public UActorComponent  
  20. {  
  21.     GENERATED_UCLASS_BODY()  
  22. public:  
  23.     //After during time, state will be reset to default.  
  24.     UFUNCTION(BlueprintCallable, Category = LogicStateMachine)  
  25.         bool SetState(LogicStateEnum NewState, float DuringTime=1.0f);    
  26.     //Event used in BP  
  27.     UPROPERTY(BlueprintAssignable, Category = LogicStateMachine)  
  28.         FChangeStateSignature OnEnterLogicState;  
  29.     UPROPERTY(BlueprintAssignable, Category = LogicStateMachine)  
  30.         FChangeStateSignature OnRefreshLogicState;  
  31.     UPROPERTY(BlueprintAssignable, Category = LogicStateMachine)  
  32.         FChangeStateSignature OnExitLogicState;  
  33.   
  34.     virtual void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction) override;  
  35.       
  36.     virtual void OnRegister() override;  
  37.     float GetElapsedTime() { return ElapsedTime; }  
  38.     void SetElapsedTime(float Time) {   ElapsedTime = Time; }  
  39. private:  
  40.     LogicStateEnum CurrentState;      
  41.     //On currentState time  
  42.     float ElapsedTime;  
  43.     //after this time, it will be reset to Default  
  44.     float ResetToDefaultTime;  
  45. };  

LogicStateMachine.cpp

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /* 
  2. *author : Jia Zhipeng 
  3. *class : LogicStateMachine 
  4. */  
  5. //主要改变状态代码  
  6. bool ULogicStateMachine::SetState(LogicStateEnum NewState, float DuringTime)  
  7. {  
  8.     int NewStatePriority = 0;  
  9.     int CurrentStatePriority = 0;  
  10.     const UEnum* EnumPtr = FindObject<UEnum>(ANY_PACKAGE, TEXT("LogicStateEnum"), true);  
  11.     FString str = EnumPtr->GetMetaData(TEXT("Priority"), CurrentState);  
  12.     if (!str.IsEmpty())  
  13.         CurrentStatePriority = FCString::Atoi(*str);  
  14.     str = EnumPtr->GetMetaData(TEXT("Priority"), NewState);  
  15.     if (!str.IsEmpty())  
  16.         NewStatePriority = FCString::Atoi(*str);  
  17.     //根据优先级判断是否改变/刷新状态  
  18.     if ( (NewState != LogicStateEnum::LS_Default) && (NewStatePriority<CurrentStatePriority))  
  19.         return false;  
  20.     //Time record  
  21.     ElapsedTime = 0;  
  22.     ResetToDefaultTime = DuringTime;  
  23.     //状态相同则刷新,不同则退出旧状态,进入新状态  
  24.     if (NewState == CurrentState)  
  25.         OnRefreshLogicState.Broadcast(CurrentState);  
  26.     if (NewState != CurrentState)  
  27.     {  
  28.         OnExitLogicState.Broadcast(CurrentState);  
  29.     }  
  30.     CurrentState = NewState;      
  31.     OnEnterLogicState.Broadcast(CurrentState);  
  32.     return true;  
  33. }  


蓝图使用

添加LogicStateMachine组件后,选中组件添加相关触发事件:



击中时改变目标Actor的状态:



进入相应状态改变后的行为:如击飞,击退。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值