[UE4]逻辑状态机组件
来源:互联网 发布:visio mac 官方中文版 编辑:程序博客网 时间:2024/06/11 06:08
逻辑状态机
为了实现对目标状态的控制,以及广播改变状态后的事件,可在蓝图中继续处理不同状态下的行为。
实现过程:
1.继承ActorComponent实现LogicStateMachine;
2.被击中时触发设置状态;
3.状态进入/退出时触发事件。
主要代码
LogicStateMachine.h
/**author : Jia Zhipeng*class : LogicStateMachine*///use enum metadata to save priorityUENUM(BlueprintType)enum LogicStateEnum{LS_Default = 0 UMETA(DisplayName = "Default", Priority = 1),LS_FrozenUMETA(DisplayName = "Frozen", Priority = 1),LS_Fly UMETA(DisplayName = "Fly", Priority = 1),LS_OnGround UMETA(DisplayName = "OnGround", Priority = 1),LS_Faint UMETA(DisplayName = "Faint", Priority = 1),LS_BackUMETA(DisplayName = "Back", Priority = 1),LogicStateNum UMETA(Hidden),};DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FChangeStateSignature, LogicStateEnum, LogicState);UCLASS(ClassGroup = LogicState, meta = (BlueprintSpawnableComponent), ShowCategories = (LogicState))class CLIENT_API ULogicStateMachine : public UActorComponent{GENERATED_UCLASS_BODY()public://After during time, state will be reset to default.UFUNCTION(BlueprintCallable, Category = LogicStateMachine)bool SetState(LogicStateEnum NewState, float DuringTime=1.0f);//Event used in BPUPROPERTY(BlueprintAssignable, Category = LogicStateMachine)FChangeStateSignature OnEnterLogicState;UPROPERTY(BlueprintAssignable, Category = LogicStateMachine)FChangeStateSignature OnRefreshLogicState;UPROPERTY(BlueprintAssignable, Category = LogicStateMachine)FChangeStateSignature OnExitLogicState;virtual void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction) override;virtual void OnRegister() override;float GetElapsedTime() { return ElapsedTime; }void SetElapsedTime(float Time) {ElapsedTime = Time;}private:LogicStateEnum CurrentState;//On currentState timefloat ElapsedTime;//after this time, it will be reset to Defaultfloat ResetToDefaultTime;};
LogicStateMachine.cpp
/**author : Jia Zhipeng*class : LogicStateMachine*///主要改变状态代码bool ULogicStateMachine::SetState(LogicStateEnum NewState, float DuringTime){int NewStatePriority = 0;int CurrentStatePriority = 0;const UEnum* EnumPtr = FindObject<UEnum>(ANY_PACKAGE, TEXT("LogicStateEnum"), true);FString str = EnumPtr->GetMetaData(TEXT("Priority"), CurrentState);if (!str.IsEmpty())CurrentStatePriority = FCString::Atoi(*str);str = EnumPtr->GetMetaData(TEXT("Priority"), NewState);if (!str.IsEmpty())NewStatePriority = FCString::Atoi(*str);//根据优先级判断是否改变/刷新状态if ( (NewState != LogicStateEnum::LS_Default) && (NewStatePriority<CurrentStatePriority))return false;//Time recordElapsedTime = 0;ResetToDefaultTime = DuringTime;//状态相同则刷新,不同则退出旧状态,进入新状态if (NewState == CurrentState)OnRefreshLogicState.Broadcast(CurrentState);if (NewState != CurrentState){OnExitLogicState.Broadcast(CurrentState);}CurrentState = NewState;OnEnterLogicState.Broadcast(CurrentState);return true;}
蓝图使用
添加LogicStateMachine组件后,选中组件添加相关触发事件:
击中时改变目标Actor的状态:
进入相应状态改变后的行为:如击飞,击退。
0 0
- [UE4]逻辑状态机组件
- ue 逻辑状态机
- PVFS2 源代码分析之公有组件src/common/misc/state-machine状态机执行逻辑
- ue4-混合动画及动画状态机
- 关于 状态机中的组合逻辑
- [UE4]自定义MovementComponent组件
- UE4自定义MovementComponent组件
- 服务器公共组件实现 -- 状态机
- 服务器公共组件实现 -- 状态机
- Android的组件设计与状态机
- Unity3D开发小贴士(十五)状态机组件
- ue4-Network相关-组件及数据同步
- ue4-UDecalComponent组件,紧贴Mesh的材质
- UE4 C++计时器,创建对象,组件
- 用状态机模式消除复杂的 if else 逻辑
- AI逻辑实现-用行为树取代状态机
- 游戏简单控制逻辑 一个轻量级的状态机
- 游戏简单控制逻辑 一个轻量级的状态机
- Scala 基础入门教程
- Java并发编程:并发容器之ConcurrentHashMap
- android 资源(开源项目、library,框架{完善中})
- 【LeetCode-63】Unique Paths II
- TCP协议疑难杂症全景解析
- [UE4]逻辑状态机组件
- 合并符串
- canvas绘制圆环百分比进度的动态效果
- 如何在Windows下开发Python:在cmd下运行Python脚本
- java并发编程:并发容器之CopyOnWriteArrayList(转载)
- sigma-delta adc
- 十个有用的php片段
- Java中Vector、ArrayList、LinkedList的区别
- sed awk grep 同时匹配多个条件