[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实现的很美丽,很灵活.许多文章也对这样的组件实体的开发模式倍加推崇.由于它契合这么一条规则:优先使用组合而不是继承. 可是实际开发过程中,限制 ...
随机推荐
- Glide 加载图片
//通过model获取到图片的url,将Url转换成bitmap对象: //设置不保存内存和硬盘缓存, 1 Glide.with(mContext).load(model.getVideoUrl()) ...
- 模仿win10样式,基于jquery的时间控件
工作需要,写了一个基于jquery的时间控件,仿win10系统时间控件格式. 目前基本功能都有了,但时间格式只实现少数,但由于结构设计已经充分优化,填充起来非常容易. 这个控件相对网上其他的时间控件, ...
- JS入门之ActiveXObject对象(转载)
JS入门之ActiveXObject对象 此对象提供自动化对象的接口. function ActiveXObject(ProgID : String [, location : String] ...
- 谈谈Activiti中流程对象之间的关系
详细见:http://www.kafeitu.me/activiti/2012/03/22/workflow-activiti-action.html (咖啡兔好牛!) 详细见: http://blo ...
- html之如何让文字两端对齐
text-align: justify;/*英文*/ text-align-last: justify;/*中英文*/ text-align-last: justify;亲测有效(chrome)
- TFS 服务端默认端口更改
由于服务商限制8080,为了外网能访问.如果可以做映射还好.如果不能那就修改默认端口 以下为网上资源 安装完Team Foundation Server 2005 后,默认的端口是8080.如果想要事 ...
- 构造 & 析构 & 匿名对象
以前仅知道创建对象,但对匿名对象的了解基本为0. 通过阅读google chromium源代码 中关于 log 的使用,查阅相关资料,了解了一下匿名对象,予以记录. 什么是匿名对象 匿名对象可以理 ...
- 遇到IIS7配置PHP出现403和404错误的解决办法
服务器要配置PHP,总是出现403错误.服务器是新装的,操作系统是windows server 2008 R2,装的IIS7. IIS里PHP和本地服务器对比了好几遍,都没到出错的原因,后来通过cmd ...
- Ubuntu 安装tftp服务器
Ubuntu下搭建tftp服务器最简单方法 转 linux公社 今天开始调试ARM的板子,要通过tftp下载到板子上,所以又要配置tftp服务器,真的烦死了... (本人酷爱装系统,所 ...
- jQuery操作Table tr td常用的方法
虽然现在DIV+CSS进行页的布局大行其道,但是很多地方使用table还是有很多优势,用table展示数据是比较方便的,下面汇总了jQuery操作Table tr td常用的方法,熟记这些操作技巧,下 ...