ue4中在物体上加ui_UE4 物体位置同步相关源码分析浅谈

前言

  • 多图, 不想在源代码写注释, 不想贴代码块, 看的不清楚
  • 版本4.21混4.22, 区别不大
  • 文章属于旧有文章搬运, 之前在csdn上面
  • 2019.10.27修改一版

物体位置信息同步, 或者说物体的移动同步, 是一个很大的坑, 从个人目前魔改UE4位置同步后, 感觉至少要考虑以下几点

  • 位置信息的数据结构
    • 要减少单次网络同步时的传输数据大小, 但也要包含所需要的完整的位置信息.
    • 同时在降低精度的情况下减少一些数据的大小, 例如降低Location和Rotation的精度, 用更少的位数传播
  • 位置信息的同步触发时间, 生成时间
    • 指控制什么时候位置进行网络同步, 什么时候不需要同步. 以及什么时候生成需要同步的位置信息
  • 位置信息的权威端
    • 以哪一端或者哪里的物体位置, 当做最新位置同步, 作为权威端
    • 如果权威端只在服务器, 那很简单.
    • 如果权威端只在单一客户端, 服务器做验证处理, 此时逻辑也比较简单, 客户端发送位置到服务器, 服务器直接应用(不考虑防作弊, 防作弊的话此时权威端还是服务器, 实现会很复杂和麻烦)
    • 如果权威端在多个客户端和服务器之间切换, 嗯, 坑很深....
  • 接受到位置信息之后的处理, 减少网络传输的延迟频率丢失的一些位置信息带来的影响, 使得整个物体移动平滑, 例如游戏中的角色运动同步
    • 这里面学问很深, 自行百度谷歌(找不到当初看学习的文章了)
  • 判断位置同步信息是否有意义, 丢弃掉无用的位置信息
    • 对旧的信息不做处理, 主要是解决网络的丢包, 延迟等带来的问题
    • 对不是权威端的信息不做处理, 解决一些事件调用先后顺序有别, 状态同步不及时等等的时序问题

UE4 的位置同步是一个比较常用的功能, 实现也比较简单, 只是服务器当方向向客户端同步物体的位置信息.

下文将深扒一下位置同步的代码实现, 以及对一些有坑的地方进行描述.


关键函数和结构体信息

/** Returns the properties used for network replication */
virtual void AActor::GetLifetimeReplicatedProps( TArray< FLifetimeProperty > & OutLifetimeProps ) const// 在属性同步前调用的一个函数, 这里生成需要同步的位置信息, 并重写是否需要位置同步
/*** Called on the actor right before replication occurs. * Only called on Server, and for autonomous proxies if recording a Client Replay.*/
virtual void AActor::PreReplication( IRepChangedPropertyTracker & ChangedPropertyTracker )// 生成物体同步信息的函数
/** Fills ReplicatedMovement property */
virtual void GatherCurrentMovement();// 位置同步的结构体信息
/** Used for replication of our RootComponent's position and velocity */
UPROPERTY(EditDefaultsOnly, ReplicatedUsing=OnRep_ReplicatedMovement, Category=Replication, AdvancedDisplay)
struct FRepMovement ReplicatedMovement;// Attach相关的结构体信息
/*** Used for replicating attachment of this actor's RootComponent to another actor.* This is filled in via GatherCurrentMovement() when the RootComponent has an AttachParent.*/
UPROPERTY(Transient, ReplicatedUsing=OnRep_AttachmentReplication)
struct FRepAttachment AttachmentReplication;

同步属性相关

从最开始的地方说起, UE4中物体位置同步是靠Actor本身属性同步实现的, 如下:

08d05ae859b4e1930907b42b0480ef1b.png
    • bReplicateMovement 控制是否进行同步
    • AttachmentReplication 同步Attach相关, 是一个FRepAttachment, 即Relative Position(相对位置)

31a1b3c700fc06b18809180726bcbdf5.png

4c2c2422f631e6b2ba807b684502ae3b.png

可以看到这个结构体里面是一个相对位置的同步信息

    • ReplicatedMovement 同步位置信息, 绝对位置

c006386f2ac0591eb4d5350c8aa0e935.png

760adf08d1529b1504fe7e4405355ee8.png

同步基础的位置信息, 会同步物理状态

LocationQuantizationLevel, VelocityQuantizationLevel, RotationQuantizationLevel三个值是精度, 可以控制Vector和Rotator用多少位传输

437eddcf092a333bbf18f76d13820a47.png

控制属性同步及生成位置信息

ae221de8c7e7d3e0bc47319a575b1bc9.png

5a9a79ae9bc4fad586360d6e7ae52efb.png

在属性同步前, 需要生成位置同步信息, 并修改同步条件

ReplicatedMovement同步条件 bReplicateMovement为True
AttachmentReplication同步条件 根组件存在并且根组件不同步

然后我们看一下GatherCurrentMovement函数

  • 该函数在每次属性同步前都会被调用, 以生成相应的位置信息.
    • bReplicateMovement 生成 ReplicatedMovement
    • RootComponent->GetAttachParent() 生成 AttachmentReplication
  • 判断是否开启物理, 物理的同步和没有物理的同步方式不一样

08d4b69d27930f302a17b29b95f07309.png
  • 开启物理时
    • 会同步位置旋转速度和是否休眠
    • 同时注意在Welded时, 不会进行物理同步(没有接触过)

e1545b39dcb902b751aee3ff2e32d77e.png
  • 没有开启物理的情况下

a1f23a2c29acec4e7d535a63e4f551d5.png
    • 如果有父组件, 相对位置, 生成AttachementReplication
    • 如果无, 绝对位置, 生成ReplicatedMovement
/*** 因为工作项目对物体同步相关进行过魔改* 有时候会碰到服务器和客户端物体缩放不同步,  不确定是魔改后的问题还是UE4的问题* 这个问题未深入研究, 是否存在? 发生条件等都不明确* 可能什么时候深扒Actor的生成和初始化同步会明白些 */

同步后的处理

这个时候的处理就比较简单了, 在这两个函数中将这些信息设置到本地就行了

OnRep_ReplicatedMovement

5a0229899c9a3670e63d06ffebe166a8.png

有兴趣的自己扒吧

OnRep_AttachmentReplication

2999612c184f2cbe5d07d5f2adf5b5c7.png

判断AttachParent是否存在是Attach还是Detach

Detach就很简单了, 直接调用DetachFromActor然后判断是否同步位置, 如果同步, 则调用用OnRep_ReplicatedMovement, 应用绝对位置

有坑见下文


一个的问题

cda3625d54a5e499381ae647e16d74f4.png

8f7c0556f8b6ba19963e7ae143e943e6.png

注意一下这段长长的注释, 绝对是4.21版本修复的.

Attach相关的相对同步, 会造成上面说的那个问题

这个问题会导致什么呢?
Detach相关的函数同步处理时, 会调用OnRep_ReplicateMovement函数

但由于没有开启bReplicateMovement, ReplicatedMovement属性为空, 是无效值
但由于数据不存在, 会让Actor位置, 旋转归零.

所以, 如果版本较低的请注意了
4.19前绝对有这个bug, 那时候魔改物体同步时, 踩过这个坑
4.20 应该也没有, 工作用的20, 最近再次碰到过这个坑
但自己电脑上只装了15和21(其他的都卸载了), 没有办法(懒)验证了

4.21版本才修复4.21版本才修复4.21版本才修复


结语

  • 能用UE4最新的版本就有最新的版本, 虽然会踩很多新坑, 但比踩那些已知bug待修复的坑好的多
    • 2019.10.27, 有时候踩坑踩着, 最后查到官方, 一句已知bug, 某某版本修复.... 很无语...
  • UE4同步相关的处理做好, 这里位置同步的是实现感觉很简单了
  • 骗赞了, 骗评论了, 不要再一次单机啊.
    • 2019.10.27, 看到这个单机.... 嗯, 没有单机了....

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507025.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算占比并保证百分比和为1

计算占比并保证百分比和为1常用场景代码常用场景 用于动态计算页面元素的百分比占比可视化中扇形统计图的显示数值修正 代码 /*** 计算数组中各项的占比&#xff0c;保证百分比和等于1* param arr 需要计算百分比的数组,传入时必须降序排序* param precision 精度 比如 4 …

tomcat配置自动服务器地址,修改eclipse部署tomcat时服务器部署地址

有时候我们在eclipse部署web项目至本地的tomcat但在webapps中找不到一、发现问题在eclipse中新建Dynamic Web Project&#xff0c;配置好本地的tomcat并写好代码后选择Run on Server,但运行后发现在tomcat的安装目录下的webapps并没有出现所建立的工程名字。二、验证很明显项目…

linux ns级定时器_linux用户空间获得ns纳秒级时间示例

一、引言我们在测试程序的性能的时候往往需要获得ns级的精确时间去衡量一个程序的性能&#xff0c;下面介绍下linux中用户空间获得ns级时间的方法二、用户空间获得ns级时间使用clock_gettime函数&#xff0c;函数原型如下&#xff1a;long sys_clock_gettime (clockid_t which_…

Prime算法生成迷宫

prime迷宫生成结果展示算法解析实现代码结果展示 算法解析 参考链接 Prime迷宫生成算法的原理&#xff1a; (1)初始地图所有位置均设为墙 (2)任意插入一个墙体进墙队列 (3)判断此时墙体是否可以设置为路(判断依据在于上下左右四个位置是否只有一个位置是路) (4)若设置为路&…

wifi密码公式计算机,求一些高数公式,做wifi密码用?

满意答案thyk72832018.06.08采纳率&#xff1a;55% 等级&#xff1a;13已帮助&#xff1a;8612人1)∫kdxkxc2)∫x^udx(x^(u1))/(u c3)∫1/xdxln|x|c4) ∫a^xdx(a^x)/lnac5)∫e^xdxe^xc6)∫sinxdx-cosxc7)∫cosxdxsinxc8)∫1/(cosx)^2dxtanxc9)∫1/(sinx)^2dx-cotxc10)∫1/√…

canvas简单五子棋

canvas简单五子棋效果思路代码效果 思路 canvans 绘制棋盘&#xff0c;绘制时候边缘预留棋子位置监听点击事件绘制落子并记录到字典中获胜判定&#xff0c;在四个方向上检测是否有足够数量的连贯棋子 代码 <!DOCTYPE html> <html lang"en"> <head…

unet作为服务器不显示画面,UNet:无法生成服务器对象(不使用NetworkManager)

我m playing around with Unity 5的网络HLAPI . I dont want to use the NetworkManager &#xff0c;因为我没有t want to pay for Unity的多人游戏服务(Matchmaker和Relay服务器) .当客户端连接到服务器时&#xff0c;我正在尝试在客户端上生成播放器 . 我可以让客户端正确连…

viewBox视图缩放(1)

文章目录前言一、案例解析前言 svg 的viewBox 可以重新定义视口的显示范围&#xff0c;通常表现为平移&#xff0c;缩放内容&#xff0c;之前测试的一直是viewBox 和viewPort 之间的等比缩放&#xff0c;后来发现不等比情况与认知有些出入&#xff0c;如下 <svg width&quo…

sklearn svm如何选择核函数_文本挖掘篇|利用SVM进行短文本分类

何为数据挖掘&#xff0c;顾名思义就是从大量数据中挖掘或抽取出知识。在实际中&#xff0c;进行数据挖掘的数据不仅仅有数值型数据&#xff0c;还有图片型数据&#xff0c;文本型数据等。而所谓文本挖掘&#xff0c;就是从大量文本数据中&#xff0c;提取出对信息使用者有价值…

svg 折线添加新的折点

问题 现有已知折线 有多段&#xff0c;当双击折线的时候&#xff0c;需要将该双击的位置点Q 添加到折线上&#xff08;排除端点情况&#xff09;&#xff0c;如何去判断Q要添加在折线的哪一段&#xff0c;或者Q分割了折线的哪一段&#xff1f;&#xff1f; 分析 方式1 一开始…

微信企业号已停止提供企业消息会话服务器,企业微信注册时显示会话服务已经被安装了怎么解决 解决攻略教程大全...

2016年4月18日&#xff0c;腾讯正式发布全平台企业办公工具“企业微信”&#xff0c;并通过腾讯应用宝独家首发安卓版。“企业微信”的推出将为企业员工提供最基础和最实用的办公服务&#xff0c;并加入贴合办公场景的特色功能、轻OA工具&#xff0c;合理化区分工作与生活&…

hashmap 扩容是元素还是数组_曹工说JDK源码(1)--ConcurrentHashMap,扩容前大家同在一个哈希桶,为啥扩容后,你去新数组的高位,我只能去低位?...

如何计算&#xff0c;一对key/value应该放在哪个哈希桶大家都知道&#xff0c;hashmap底层是数组链表(不讨论红黑树的情况)&#xff0c;其中&#xff0c;这个数组&#xff0c;我们一般叫做哈希桶&#xff0c;大家如果去看jdk的源码&#xff0c;会发现里面有一些变量&#xff0c…

ftp服务器文件名存在,有什么办法根据已知文件名来检测FTP服务器上是否存在该文件? 急...

蛊毒传说我不敢说_________________using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net;using System.IO;namespace test{ class Program { static void Main(string[] args) { string path "ftp://192.168.1.200/ser…

A* 寻路 +寻路演示(js)

效果 每个单元格内文字&#xff1a; (F) (Price) (G) (H) 原理 原理是参考另一篇csdn博文&#xff0c;不过忘记收藏找不到了 初始化 open_set和 close_set。将 起点 加入open_set中&#xff0c;并设置优先级为0&#xff08;优先级最高&#xff09;。如果open_set不为空&…

pc端无法ping android模拟器_【内附下载方式】PC端最新宝可梦 Lets Go去皮去伊模拟器+最新dlc+mod...

游戏名称&#xff1a;精灵宝可梦 Let‘s go 皮卡丘 伊布游戏总大小&#xff1a;9GB游戏简介&#xff1a;《精灵宝可梦 Lets Go 皮卡丘/伊布》是宝可梦系列全新作品&#xff0c;也是该系列首次登上Switch主机&#xff0c;为后续作品的开发奠定了基础。本作可以视为是对第一世代红…

自定义处理网页选区字符并实时显示(js)

概述 浏览网页的时候&#xff0c;可能需要去数一下某段文字的字符数量&#xff0c;或者需要对选中内容做些实时翻译&#xff0c;比如进制的转化&#xff0c;可以使用脚本做个简单的实时翻译。 效果 选中内容&#xff0c;并且鼠标移动时会在左下角显示翻译后的结果。示例为翻…

css文本行高是哪个属性_CSS中的line-height行高属性的使用技巧小结

CSS中的line-hight属性是用来控制文本行之间的空隙的。它一般情况下没有单位的设定(如&#xff1a;line-height:1.4;)所以这是一个按字体尺寸的比例来计算。这对印刷版来说是一个很重要的属性。线条过低就会挤在一起&#xff0c;线条过高就会相距甚远&#xff0c;这两种情况都会…

模2运算及模2运算式计算 (js)

概述 学习二维码生成的时候卡在纠错码部分&#xff0c;然后就接触到了伽罗华域&#xff0c;了解到模2运算&#xff0c;恰好前不久刚了解了波兰表达式&#xff0c;就尝试写一个支持模2运算的算式解析计算。 结果 10011*101101.M2Calc() >"1011010" 涉及内容 模…

react配合python_部署React前端和Django后端的3种方法

Python部落(python.freelycode.com)组织翻译&#xff0c;禁止转载&#xff0c;欢迎转发。2020年4月7日星期二&#xff0c;马修西格尔类别&#xff1a;Django如果您要用Django REST开发web应用程序后端&#xff0c;并使用React或Vue开发应用程序前端。有很多方法实现。你需要做出…

伽罗瓦域(256) 生成指定纠错码字的生成多项式 (js)

效果 使用 复制code 保存为html 涉及内容 1、有限域、伽罗瓦域(256) 2、对数反对数 3、XOR 异或 两个因式各项相乘&#xff0c;当系数项相乘时&#xff0c;指数相加并mod(255) 合并同类项时&#xff0c;相同项的系数合并为 XOR操作&#xff1b; 伽罗瓦域依旧有些犯懵&…