ue4-c++定时器和时间轴简易模板
定时器Delay
在头文件中需要声明TimerHandle和功能函数,功能函数是计时结束后执行的功能
在源文件中利用GetWorldTimerManager()实现定时器的开启(绑定功能函数)和清除。
//.h
//自动开火的定时器
FTimerHandle FireTime;
//定时器的开始绑定函数
void StartFireTimer();
//功能函数 Delay之后的功能
void FireTimeFinished();
//.cpp
void StartFireTimer()
{
GetWorldTimerManager().SetTimer(
FireTime, //FTimerHandle
this, //使用对象
FireTimeFinied, //功能函数
DelayTime //延迟时间
);
}
使用完定时器记得清除,防止其他一些情况导致定时器的开启
GetTimerManager().ClearTimer(FireTime);
时间轴
之前有一篇已经对时间轴有了较为详细的介绍
首先在.h中需要通过UCurveFloat创建一个Curve 用来接受我们在UE中创建好的曲线,这个曲线将作为时间轴中的结果曲线,第二点需要创建一个时间轴组件UTimelineComponent来实现时间轴的播放。第三点是创建一个轨道FOnTimelineFloat用于在时间轴中存放曲线(轨道的类型和曲线类型要相互对应)。第四点是功能函数Func1即利用曲线的返回值我们要对哪些参数进行修改。第五个是时间轴触发函数Func2,主要是被其他函数调用用于实现值的变化然后传给Func1。
除了第四点,其他都相当于蓝图中TimeLine模块,第四点相当于TimeLine模块之后连接的部分。
//.h
//时间轴组件
UPROPERTY(VisibleAnywhere)
UTimelineComponent* DissolveTimeline;
//时间轴曲线
UPROPERTY(EditAnywhere)
UCurveFloat* DissolveCurve;
//相当于蓝图中的轨道
FOnTimelineFloat DissolveTrack;
//获取曲线上的值,用于更新我们要操作的值,相当于蓝图中的输出
UFUNCTION()
void UpdateDissolveMaterial(float Dissolve);
//开始溶解,时间轴绑定上方那个获取值函数的地方,可以被外界调用
void StartDissolve();
//.cpp
//时间轴初始化操作
void AXCharacter::StartDissolve()
{
//绑定功能函数
DissolveTrack.BindDynamic(this, &AXCharacter::UpdateDissolveMaterial);
if (DissolveCurve && DissolveTimeline)
{
//为时间轴添加轨道和输出曲线
DissolveTimeline->AddInterpFloat(DissolveCurve, DissolveTrack);
//时间轴的正向播放,如果有其他的条件可以调用反向播放
DissolveTimeline->Play();
}
}
//功能函数UpdateDissolveMaterial,一般会有形参接受,该形参通过BindDynamic将时间轴上Curve值获得
void AXCharacter::UpdateDissolveMaterial(float Dissolve)
{
if (DynamicDissolveMaterialInstance)
{
DynamicDissolveMaterialInstance->SetScalarParameterValue(TEXT("Dissolve"), Dissolve);
}
}
之后就直接在外部调用StartDissolve这个函数即可。
UE4 网络同步 角色权威性
UE4提供了两种网络同步的方式,属性复制和RPC。
属性复制只能从服务器到客户端,可以通过设置DOREPLIFETIME的方式,体现出是只对本地客户端响应还是对所有客户端响应--(感觉有点类似ClientRPC 和 MulticastRPC)
其一般针对的是一个变量需要设置其变量属性UPROPERTY(ReplicatedUsing = OnRep_Func)
OnRep_Func会在变量改变时自动调用,其中的功能一般都是直接复制了服务器上Func的函数实现,并且OnRep_Func一般不携带参数,如果要携带也只能携带一个,且为该变量。
RPC在定义函数时需要在函数名之后加上_Implementation
RPC多用于客户端需要向服务器传递信息(ServerRPC),然后服务器处理完成之后再广播到客户端。比如本地客户端按下左键开火,这个状态就需要利用ServerRPC传递给服务器,服务器然后调用MulticastRPC传递给所有客户端。
具体操作就是,当我们角色开火时,调用ServerFire,如果是服务器那么就会执行ServerFire函数里的操作。如果ServerFire里面是一个Multicast那么就会服务器就会执行这个函数,将开火的这个客户端状态广播到所有客户端,具体是Multicast内部的实现,比如内部有一个Character实例,这个实例就是开火客户端上的这个actor。
如果要使用ClientRPC,一般也是通过ServerRPC调用执行的,因为ClientRPC只能在服务器上执行,而ServerRPC就是调用客户端上的函数在服务器上执行。所以如果想要获取服务器上的时间就需要在ServerRPC上实现GetTime,然后再ClientRPC上的GetTime就是客户端上的时间。
角色权威性可以用来区分是否是服务器,这样我们就可以将一些重要的数据操作放在服务器上执行。
if(HasAuthority())
{
ApplyDamage();
}
角色模拟,除了本地客户端其他客户端上actor都表现为模拟,模拟就意味着没有PlayerController。比如开火函数,在应用伤害时需要添加一个控制器来确定当前开火的actor。如果我们将判断这个控制器是否有效放在了外面,将会导致其他功能在其他客户端上的失效
if(..&&Controller)
{
if(HasAuthority())
{
ApplyDamage();
}
Func1();
Func2();
//func1 func2 不会在其他客户端实现
}
因为我们通过Multicast将这个函数传给了所有客户端执行,而其他客户端没有这个actor的Controller。
所以正确做法是
if(..)
{
if(HasAuthority()&&Controller)
{
ApplyDamage();
}
Func1();
Func2();
//func1 func2 不会在其他客户端实现
}
ue4-c++定时器和时间轴简易模板的更多相关文章
- WPF Timeline简易时间轴控件的实现
原文:WPF Timeline简易时间轴控件的实现 效果图: 由于整个控件是实现之后才写的教程,因此这里记录的代码是最终实现后的,前后会引用到其他的一些依赖属性或者代码,需要阅读整篇文章. 1.确定T ...
- android 简易时间轴(实质是ListView)
ListView的应用 1.在很多时候是要用到时间轴的,有些处理的时间轴比较复杂,这里就给出一个比较简单的时间轴,其实就是ListView里面的Item的设计. 直接上代码: ListView,ite ...
- Android 类似时间轴的实现
想要实现图片中的的时间轴的效果,设定了三种颜色,但是出来的只有一个黑色,还不是设定好的,而且长度很长的话不能滚动,下面上代码: 布局文件: <LinearLayout xmlns:android ...
- SNF开发平台WinForm之十五-时间轴控件使用-SNF快速开发平台3.3-Spring.Net.Framework
一.显示效果如下: 二.在控件库里选择UCTimeAxis 拖拽到窗体里. 三.加入以下代码,在load事件里进行调用就可以运行了. #region 给时间轴控件加载数据 private void U ...
- echart 时间轴、以及y轴值过大但是变化不大显示感觉不出变化的问题+弹出框拖动div事件
1.时间轴 echart 提供了一种图表,如果x轴是一个时间范围,并且是连续的,如果用传统的数据驱动会很慢,所以用时间轴的方式 function initCurve(_data){ var resul ...
- 【前端图表】echarts实现散点图x轴时间轴
话不多说,老规矩,先上图,实现echarts实现散点图,x轴数据为时间年月日. 实现代码如下: <!DOCTYPE html> <html> <head> < ...
- QT动画时间轴控制 QTimeLine
QTimeLine类提供用于控制动画的时间轴 比如控制进度条的增长,图片,窗口的旋转,平移等等 QTimeLine有一个frameChanged(int)信号 当调用QTimeLine::start( ...
- Laya的动画制作,整图动画,序列图动画,时间轴动画,龙骨动画
参考: Laya动画基础 Egret帧动画工具类 版本:2.1.1.1 序列图动画 白鹭的序列图动画,使用TexureMerger合图,然后使用MovieClip类播放. Laya的话,使用图集打包工 ...
- echarts使用结合时间轴timeline动态刷新案例
1.echarts简介 ECharts,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Fire ...
- 如何关闭Win10系统的时间轴功能?
Win10系统新增了时间轴的功能,可以根据用户使用电脑的情况来进行记录,以方便用户查找之前的电脑使用记录,并且可以打开之前的任务状态. 但有些用户不想让系统记录下自己的活动记录,那我们该怎么清除这些记 ...
随机推荐
- 学习go语言编程之数据类型
数据类型概述 Golang语言内置了如下基础数据类型: 布尔类型:bool 整型:int8,unit8,int16,uint16,int32,uint32,int64,uint64,int,uint, ...
- Docker实践之05-限制Docker容器运行资源
Docker容器在默认情况下会使用宿主机的所有CPU和内存资源,为了明确限制每一个Docker容器的运行资源,需按如下操作进行设置. 首先,执行:sudo docker info,如果提示:" ...
- 零难度指南:手把手教你如何通过在线Excel实现资产负债表
前言 作为财务分析中的三大报表之一,资产负债表的作用是展示一个企业在特定时间点上的财务状况.今天小编就为大家介绍一下如何使用葡萄城公司的纯前端在线表格控件SpreadJS实现一个资产负债表. 环境准备 ...
- Hi3516开发笔记(十一):通过HiTools使用网口将uboot、kernel、roofts烧写进eMMC
前言 前面烧写一直时烧写进入flush,是按照分区烧写.定制的板子挂的是eMMC,前面的烧写步骤一致,但是在烧写目标则时烧写eMMC了. 重新走一遍从无到有通过网口刷定制板卡的uboot.ker ...
- OpenCV开发笔记(六十六):红胖子8分钟带你总结形态学操作-膨胀、腐蚀、开运算、闭运算、梯度、顶帽、黑帽(图文并茂+浅显易懂+程序源码)
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- python中如何使两个序列相加不改变内存地址的几种方式
# 方式1 a = [1,2,3] print(a) # 4551311680 a.extend([4,5]) print(a) # 4551311680 # 方式2 b = [1,2,3] prin ...
- linux下安装nginx(yum源安装)
备份yum源 cd /etc/yum.repos.d mkdir repo_bak mv *.repo repo_bak/ 下载阿里云repo文件 wget -O /etc/yum.repos.d/C ...
- 【算法day3】小和、荷兰国旗、快排
小和问题 现有数组[1,3,4,2,5] 1左边是0(小于1),所以1的小和为0 3左边是1(小于3),所以3的小和为1 4左边是1.3(均小于4),所以4的小和为1+3=4 2左边是1.3.4(只有 ...
- consul 的 HTTP API 和使用方法
目录 搭建起 consul Consul 的 HTTP API Service API 简单地注册服务 健康检查的配置和查询 建议读者先学习笔者的另一篇文章 学习搭建 Consul 服务发现与服务网格 ...
- vue3自定义Hooks
比较简单的小demo,直接上代码吧 ts使用defineComponent,setup()里面使用 Composition API 写法,逻辑块清晰,不用前后文查找,拒绝 spaghetti code ...