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系统新增了时间轴的功能,可以根据用户使用电脑的情况来进行记录,以方便用户查找之前的电脑使用记录,并且可以打开之前的任务状态. 但有些用户不想让系统记录下自己的活动记录,那我们该怎么清除这些记 ...
随机推荐
- java利用hdfs api进行上传下载操作
1.说明 最近项目中一部分大文件需要存储到hadoop的hdfs组件中,自己本地用3台centos7虚拟机搭建了一套集群.本地写点java代码测试一下. 代码部分改编自网络. 环境说明 一主二仆结构. ...
- golang常用库:gorilla/mux-http路由库使用
golang常用库:gorilla/mux-http路由库使用 golang常用库:配置文件解析库/管理工具-viper使用 golang常用库:操作数据库的orm框架-gorm基本使用 一:gola ...
- 【Android逆向】破解看雪9月算法破解第二题
1. apk安装到手机,一样的界面,随便输入一样的报错 2. apk拖入到jadx重看看 public native String sha1(String str); static { System. ...
- 使用Java线程同步工具类CyclicBarrier
如何使用 java.util.concurrent.CyclicBarrier是Java并发并发编程中的线程同步工具类,基于java.util.concurrent.locks.ReentrantLo ...
- Vue框架设计:性能权衡的艺术
"框架设计里到处都体现了权衡的艺术." 当我们设计一个框架的时候,框架本身的各个模块之间并不是相互独立的,而是相互关联.相互制约的.因此作为框架设计者,一定要对框架的定位和方向拥有 ...
- pytho代码分析示例
a = 5 b = 6 c = 10 for i in range(n): for j in range(n): x = i * j y = j * j z = i * j for k in rang ...
- ASP.NET 上传文件导入Excel
前言 本文对应的场景是导入Excel数据,Excel对应的字段都配置在xml文件中.截图如下: 代码实战 工具类 实体类:XMLReadModel.cs public class XMLReadMod ...
- 以下总结了Java一些面试前准备和技术参考题,希望对你有所帮助
以下真实模拟JAVA面试场景: 感谢您参加我们的面试: 以下是我们总结一些面试前准备和技术参考题,希望对你有所帮助. 首先,你需要先准备下工作相关的自我介绍,包括以下内容: 几年 Java 开发经验, ...
- NodeJS开启GZIP功能
gzip是用于压缩,效果特别好,js.css等文件的压缩率一般高达70% 具体方法如下: 先安装一个依赖 npm install compression --save 然后在已有代码里(一般是app. ...
- 【Azure 应用服务】如何禁止chinacloudsites.cn 访问?
问题描述 Azure App Service创建后,默认会有一个 Azure App Service创建后,默认会有一个 https://xxxxxxxxxxxxx.chinacloudsites. ...