逻辑状态机

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

实现过程:

1.继承ActorComponent实现LogicStateMachine;

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

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

主要代码

LogicStateMachine.h

/*
*author : Jia Zhipeng
*class : LogicStateMachine
*/
//use enum metadata to save priority
UENUM(BlueprintType)
enum LogicStateEnum
{
LS_Default = 0 UMETA(DisplayName = "Default", Priority = 1),
LS_Frozen UMETA(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_Back UMETA(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 BP
UPROPERTY(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 time
float ElapsedTime;
//after this time, it will be reset to Default
float 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 record
ElapsedTime = 0;
ResetToDefaultTime = DuringTime;
//状态相同则刷新,不同则退出旧状态,进入新状态
if (NewState == CurrentState)
OnRefreshLogicState.Broadcast(CurrentState);
if (NewState != CurrentState)
{
OnExitLogicState.Broadcast(CurrentState);
}
CurrentState = NewState;
OnEnterLogicState.Broadcast(CurrentState);
return true;
}

蓝图使用

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



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



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



[UE4]逻辑状态机组件的更多相关文章

  1. 【UE4 设计模式】组件模式 Components Pattern

    概述 描述 在单一实体跨越了多个领域时,为了保持领域之间相互解耦,可以将每部分代码放入各自的组件类中,将实体简化为组件的容器. 套路 参考 UE4中的 Componet 组件使用方式 使用场景 有一个 ...

  2. [UE4]自定义MovementComponent组件

    自定义Movement组件 目的:实现自定义轨迹如抛物线,线性,定点等运动方式,作为组件控制绑定对象的运动. 基类:UMovementComponent 过程: 1.创建UCustomMovement ...

  3. vue应用或者是项目其实就是 实例(完成基本逻辑) + 组件(单文件组件,全局组件,局部组件,内置组件)来完成 ;

    以上! 组件里面包含HTML,css, js,也就是一个完整的功能!

  4. [UE4]自动旋转组件

  5. Unity Animator动画状态机 深入理解(一)

    接触Unity以来就已经有了Animator,Animation用的少,不过也大概理解他俩之间的一个区别于联系. 图中其实就是Animator和Animation之间的区别于联系了,啊!你肯定会告诉我 ...

  6. Quick StateMachine状态机

    状态机quick中是一个亮点,假设我们做一款RPG游戏,一个角色通常会拥有idle,attack,walk.run,death这些状态,假设游戏角色的状态採用分支条件推断的话.会造成很庞大而难以维护. ...

  7. 【JAVASCRIPT】React学习-如何构建一个组件

    摘要 react 学习包括几个部分: 文本渲染 JSX 语法 组件化思想 数据流 组件化思想 组件就是 UI + UI 交互逻辑,组件有三个常规map , 分别为state 状态 . props 数据 ...

  8. UE4杂记

    一些学习UE4时的笔记,转载请注明出处. ☆ UE4逻辑 Actor 是由 AActor 类派生而来的类实例:能被放入游戏世界场景的所有游戏性对象的基础类.对象是继承自 UObject 类的类实例:虚 ...

  9. Unityclient框架笔记二(组件实体开发模式的思考)

    Unity的Entity-Component-System实现的很美丽,很灵活.许多文章也对这样的组件实体的开发模式倍加推崇.由于它契合这么一条规则:优先使用组合而不是继承. 可是实际开发过程中,限制 ...

随机推荐

  1. OAF 中的EO 和VO

    EO :oracle.apps.fnd.framework.server.OAEntityImpl VO:oracle.apps.fnd.framework.server.OAViewRowImpl ...

  2. wkhtmltopdf中文显示空白或者乱码方框

    中文乱码或者空白解决方法 如果wkhtmltopdf中文显示空白或者乱码方框 打开windows c:\Windows\fonts\simsun.ttc拷贝到linux服务器/usr/share/fo ...

  3. char类型输出地址

    问题描述: 当输出char的地址时,发现输出的是一个字符: char ch = 'a'; cout<<&ch<<endl;//a @ 因为cout得到一个char类型的 ...

  4. codeforces 742D (分组背包)

    D. Arpa's weak amphitheater and Mehrdad's valuable Hoses   Just to remind, girls in Arpa's land are ...

  5. js中常用的操作

    1.js中常用的数组操作 2.js中常用的字符串操作 3.js中常用的时间日期操作 4.定时器

  6. 2016. last day in office

    外面黑了,水面上黑魆魆的看不清楚了. 明天请假了,2017年再见! 2017加油! 2017 English improving!

  7. 自动生成查找组件的lua代码

    本篇主要解决的问题是使用lua脚本编写unity业务逻辑时,自动生成一些查找组件及绑定控件事件的lua代码! 现在很多unity项目都是用ulua作为热更新解决方案,因此需要用lua来写相关的逻辑,经 ...

  8. django搭建论坛之一环境配置

    环境情况: Description:    Ubuntu 15.04   Python版本:   Python 2.7.9 django版本: 1.8.4 安装django: pip install ...

  9. 在 JQuery Mobile 中实现瀑布流图库布局

    先来看在Windows系统的1080P显示器中显示的效果: 这个整合方式几乎没有现存的实例,是自己总结出来的方法,在此记录下来. 首先访问Masonry官网下载masonry.pkgd.min.js: ...

  10. SQL SERVER增加、删除、更改表中的字段名 (详询请加qq:2085920154)

    1. 向表中添加新的字段 alter  table  table_name  add  column_name  varchar2(20) not null 2. 删除表中的一个字段 delete t ...