[UE4]逻辑状态机组件
逻辑状态机
为了实现对目标状态的控制,以及广播改变状态后的事件,可在蓝图中继续处理不同状态下的行为。
实现过程:
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;
}
蓝图使用
[UE4]逻辑状态机组件的更多相关文章
- 【UE4 设计模式】组件模式 Components Pattern
概述 描述 在单一实体跨越了多个领域时,为了保持领域之间相互解耦,可以将每部分代码放入各自的组件类中,将实体简化为组件的容器. 套路 参考 UE4中的 Componet 组件使用方式 使用场景 有一个 ...
- [UE4]自定义MovementComponent组件
自定义Movement组件 目的:实现自定义轨迹如抛物线,线性,定点等运动方式,作为组件控制绑定对象的运动. 基类:UMovementComponent 过程: 1.创建UCustomMovement ...
- vue应用或者是项目其实就是 实例(完成基本逻辑) + 组件(单文件组件,全局组件,局部组件,内置组件)来完成 ;
以上! 组件里面包含HTML,css, js,也就是一个完整的功能!
- [UE4]自动旋转组件
- Unity Animator动画状态机 深入理解(一)
接触Unity以来就已经有了Animator,Animation用的少,不过也大概理解他俩之间的一个区别于联系. 图中其实就是Animator和Animation之间的区别于联系了,啊!你肯定会告诉我 ...
- Quick StateMachine状态机
状态机quick中是一个亮点,假设我们做一款RPG游戏,一个角色通常会拥有idle,attack,walk.run,death这些状态,假设游戏角色的状态採用分支条件推断的话.会造成很庞大而难以维护. ...
- 【JAVASCRIPT】React学习-如何构建一个组件
摘要 react 学习包括几个部分: 文本渲染 JSX 语法 组件化思想 数据流 组件化思想 组件就是 UI + UI 交互逻辑,组件有三个常规map , 分别为state 状态 . props 数据 ...
- UE4杂记
一些学习UE4时的笔记,转载请注明出处. ☆ UE4逻辑 Actor 是由 AActor 类派生而来的类实例:能被放入游戏世界场景的所有游戏性对象的基础类.对象是继承自 UObject 类的类实例:虚 ...
- Unityclient框架笔记二(组件实体开发模式的思考)
Unity的Entity-Component-System实现的很美丽,很灵活.许多文章也对这样的组件实体的开发模式倍加推崇.由于它契合这么一条规则:优先使用组合而不是继承. 可是实际开发过程中,限制 ...
随机推荐
- OAF 中的EO 和VO
EO :oracle.apps.fnd.framework.server.OAEntityImpl VO:oracle.apps.fnd.framework.server.OAViewRowImpl ...
- wkhtmltopdf中文显示空白或者乱码方框
中文乱码或者空白解决方法 如果wkhtmltopdf中文显示空白或者乱码方框 打开windows c:\Windows\fonts\simsun.ttc拷贝到linux服务器/usr/share/fo ...
- char类型输出地址
问题描述: 当输出char的地址时,发现输出的是一个字符: char ch = 'a'; cout<<&ch<<endl;//a @ 因为cout得到一个char类型的 ...
- codeforces 742D (分组背包)
D. Arpa's weak amphitheater and Mehrdad's valuable Hoses Just to remind, girls in Arpa's land are ...
- js中常用的操作
1.js中常用的数组操作 2.js中常用的字符串操作 3.js中常用的时间日期操作 4.定时器
- 2016. last day in office
外面黑了,水面上黑魆魆的看不清楚了. 明天请假了,2017年再见! 2017加油! 2017 English improving!
- 自动生成查找组件的lua代码
本篇主要解决的问题是使用lua脚本编写unity业务逻辑时,自动生成一些查找组件及绑定控件事件的lua代码! 现在很多unity项目都是用ulua作为热更新解决方案,因此需要用lua来写相关的逻辑,经 ...
- django搭建论坛之一环境配置
环境情况: Description: Ubuntu 15.04 Python版本: Python 2.7.9 django版本: 1.8.4 安装django: pip install ...
- 在 JQuery Mobile 中实现瀑布流图库布局
先来看在Windows系统的1080P显示器中显示的效果: 这个整合方式几乎没有现存的实例,是自己总结出来的方法,在此记录下来. 首先访问Masonry官网下载masonry.pkgd.min.js: ...
- SQL SERVER增加、删除、更改表中的字段名 (详询请加qq:2085920154)
1. 向表中添加新的字段 alter table table_name add column_name varchar2(20) not null 2. 删除表中的一个字段 delete t ...