定时器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++定时器和时间轴简易模板的更多相关文章

  1. WPF Timeline简易时间轴控件的实现

    原文:WPF Timeline简易时间轴控件的实现 效果图: 由于整个控件是实现之后才写的教程,因此这里记录的代码是最终实现后的,前后会引用到其他的一些依赖属性或者代码,需要阅读整篇文章. 1.确定T ...

  2. android 简易时间轴(实质是ListView)

    ListView的应用 1.在很多时候是要用到时间轴的,有些处理的时间轴比较复杂,这里就给出一个比较简单的时间轴,其实就是ListView里面的Item的设计. 直接上代码: ListView,ite ...

  3. Android 类似时间轴的实现

    想要实现图片中的的时间轴的效果,设定了三种颜色,但是出来的只有一个黑色,还不是设定好的,而且长度很长的话不能滚动,下面上代码: 布局文件: <LinearLayout xmlns:android ...

  4. SNF开发平台WinForm之十五-时间轴控件使用-SNF快速开发平台3.3-Spring.Net.Framework

    一.显示效果如下: 二.在控件库里选择UCTimeAxis 拖拽到窗体里. 三.加入以下代码,在load事件里进行调用就可以运行了. #region 给时间轴控件加载数据 private void U ...

  5. echart 时间轴、以及y轴值过大但是变化不大显示感觉不出变化的问题+弹出框拖动div事件

    1.时间轴 echart 提供了一种图表,如果x轴是一个时间范围,并且是连续的,如果用传统的数据驱动会很慢,所以用时间轴的方式 function initCurve(_data){ var resul ...

  6. 【前端图表】echarts实现散点图x轴时间轴

    话不多说,老规矩,先上图,实现echarts实现散点图,x轴数据为时间年月日. 实现代码如下: <!DOCTYPE html> <html> <head> < ...

  7. QT动画时间轴控制 QTimeLine

    QTimeLine类提供用于控制动画的时间轴 比如控制进度条的增长,图片,窗口的旋转,平移等等 QTimeLine有一个frameChanged(int)信号 当调用QTimeLine::start( ...

  8. Laya的动画制作,整图动画,序列图动画,时间轴动画,龙骨动画

    参考: Laya动画基础 Egret帧动画工具类 版本:2.1.1.1 序列图动画 白鹭的序列图动画,使用TexureMerger合图,然后使用MovieClip类播放. Laya的话,使用图集打包工 ...

  9. echarts使用结合时间轴timeline动态刷新案例

    1.echarts简介 ECharts,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Fire ...

  10. 如何关闭Win10系统的时间轴功能?

    Win10系统新增了时间轴的功能,可以根据用户使用电脑的情况来进行记录,以方便用户查找之前的电脑使用记录,并且可以打开之前的任务状态. 但有些用户不想让系统记录下自己的活动记录,那我们该怎么清除这些记 ...

随机推荐

  1. spring事务的传播

    目录 事务的传播行为类型 注意事项 关于事务的传播,我们先确定一个场景:方法A调用方法B,方法A可能存在事务,也可能不存在事务,我们这里重点关注方法B上定义的事务传播行为,以及方法B中出现异常时,方法 ...

  2. MongoDB的安装及启动

    下载地址 https://www.mongodb.com/try/download/community 安装步骤 自定义安装目录 配置环境 下面是你安装后的mongodb的目录 在电脑的环境变量Pat ...

  3. ProtoBuffer-nanopb介绍

    目录 一.需求 二.环境 三.相关概念 3.1 protocol buffer介绍 3.2 nanopb(支持C语言) 3.3 proto文件 四.proto基本语法 4.1 proto文件的定义 4 ...

  4. 全表查询sql执行链路排查

    问题描述: 发现有sql查询全表数据,慢查询语句,根据druid上的sql监控查看到. 主要根据标红的列确定问题sql. 点击进去可以看到详细sql信息. 问题排查目标: 发现这个语句高层调用方特别多 ...

  5. canal实现mysql跨机房备份

    背景介绍 跨机房数据库数据备份 数据库增量异构系统分发(cache,mq等) 数据内容聚合分析组件 摘录作者的描述 原理图 canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL ...

  6. c++复习笔记——STL(vector)

    c++-----STL容器系列(1) vector 1 介绍 Vector是stl容器中一种常见的容器 ,基本和数组类似,其大小(size)可变,常用于数组长度不确定时来代替数组,当数据超过vecto ...

  7. Java 多线程------解决 实现继承 Thread类 方式线程的线程安全问题 方式二:同步方法

    1 package bytezero.threadsynchronization; 2 3 4 5 /** 6 * 使用同步方法解决实现 继承 Thread类 的线程安全问题 7 * 8 * 9 * ...

  8. 深入浅出Java多线程(十一):AQS

    引言 大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第十一篇内容:AQS(AbstractQueuedSynchronizer).大家觉得有用请点赞,喜欢请关注!秀才在此谢 ...

  9. Java开发中String.format的妙用

    format方法是String类中的一个方法,主要作用是用来格式化字符串.当前做 的一个功能当中,刚好用到了这个方法,代码处理起来非常简便.因此就写篇博客 记录下来. 分析使用场景:前端App需要根据 ...

  10. DatePicker 日期选择器 split-panels 数组的时候,清空这个费劲啊,最后走的后门

    这里的核心问题就是验证的时候value值不对,总是初始化的值,不论怎么设置,开始觉得是数组指针的问题,最后也不行,null也不行,组件的props都已经是null了,验证就是这么神奇,最后把this放 ...