当前位置: 首页 > article >正文

UE5 GAS框架解析内部数据处理机制——服务器与客户端

当, gas通过点击鼠标光标触发事件时,内部的处理机制。

当通过点击事件,命中中目标时, 可获取到对应的TargetData 目标数据。处理相应的操作。

仅有本地的客户端的情况下。命中并不会有什么异常。

当存在服务器时, 服务端并不能知道,客户端的命中结果。通过GAS框架内部具有一点的数据处理发送数据的实现。

当,通过RPC的方式,实现客户端请求服务器时,具有如下的两个问题。GAS通过 Activate的一个函数方法来激活技能系统, 客户端与服务器的通信只能是RPC的方式。 RPC与Activate所到达服务器的时间,具有不确定性。

考虑这样的一个场景: 当我们点中了屏幕上的一个敌人,我们需要对ta释放技能,造成伤害,击杀目标(这里的每一步都很难,我们先做最简单的,激活一个技能,搞明白GAS框架的激活流程)

我们需要知道这个敌人所在3D世界的虚拟坐标,或者说空间向量 位置信息,及这个Actor对象信息。 所以在客户端我们点中了目标,这个时候只能通RPC的方式,发送这些信息需要发送到服务器确认。 服务器确认信息,告知是否可以激活此次的技能。这UE5 GAS对技能处理最简单的一种方式。

下面看GAS 如何处理 客户端 到服务器之间的RPC数据,至关重要!

当客户端需要与服务器发送数据时, GAS 内部有一个FGameplayAbilityTargetDataHandle 的结构体,用来存储RPC需要发送的数据,调用  AbilitySystemComponent->ServerSetReplicatedTargetData 用来发送数据,同时带有客户端预测的ScopedPredictionKey,服务器会校验这个Key值。服务器会有一个委托函数,来响应接受目标数据。 客户端ShouldBroadcastAbilityTaskDelegates  委托任务完成之后,广播当前数据。

	//窗口预测函数 FScopedPredictionWindow ScopedPredictionWindow(AbilitySystemComponent.Get());//RPC数据FGameplayAbilityTargetDataHandle DataHandle;/** Replicates targeting data to the server  复制数据发送到服务器*/AbilitySystemComponent->ServerSetReplicatedTargetData(GetAbilitySpecHandle(),GetActivationPredictionKey(),DataHandle,FGameplayTag(),AbilitySystemComponent->ScopedPredictionKey);//创建委托 广播通知if (ShouldBroadcastAbilityTaskDelegates())ValidData.Broadcast(DataHandle); //广播当前点中位置

在RPC数据到达时间不确定时,GAS内部会有自己的一个委托函数。重新绑定委托函数,广播数据。这就解决了数据的不确定性。

这是服务器 的接收数据的处理操作。GAS 通过委托的方式来处理客户端发送来的数据,及预测Key值。并绑定 我们需要回调的函数。

如果数据没有到达的情况下,bCalledDelegate为false 的情况下,就继续等待数据的到底。

这是源代码的注释说明。

http://www.lryc.cn/news/2380236.html

相关文章:

  • Unity实用技能-UI定位总结
  • 开源GPU架构RISC-V VCIX的深度学习潜力测试:从RTL仿真到MNIST实战
  • 服务间的“握手”:OpenFeign声明式调用与客户端负载均衡
  • 26、DAPO论文笔记(解耦剪辑与动态采样策略优化,GRPO的改进)
  • JQuery 禁止页面滚动(防止页面抖动)
  • Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(七)
  • Halcon与C#:工业级机器视觉开发
  • Unity序列化字段、单例模式(Singleton Pattern)
  • 【工具】Windows|外接的显示器怎么用软件调亮度(Brightness Slider)
  • 在 Java MyBatis 中遇到 “操作数类型冲突: varbinary 与 float 不兼容” 的解决方法
  • 系统架构设计(十四):解释器风格
  • 【Nextcloud】使用 LNMP 架构搭建私有云存储:Nextcloud 实战指南
  • VDC、SMC、MCU怎么协同工作的?
  • 【办公类-100-01】20250515手机导出教学照片,自动上传csdn+最小化Vscode界面
  • Java-List集合类全面解析
  • uniapp-商城-60-后台 新增商品(属性的选中和页面显示,数组join 的使用)
  • [c语言日寄]数据结构:栈
  • WEB安全--Java安全--LazyMap_CC1利用链
  • 【杂谈】-AI 重塑体育营销:从内容管理到创意释放的全面变革
  • 黑马k8s(六)
  • 【数据结构】二分查找(返回插入点)5.14
  • 如何设计一个二级缓存(Redis+Caffeine)架构?Redis 6.0多线程模型如何工作?
  • Java:logback-classic与slf4j版本对应关系
  • 【OpenGL学习】(一)创建窗口
  • AI大语言模型评测体系演进与未来展望
  • 微服务项目->在线oj系统(Java版 - 5)
  • disryptor和rabbitmq
  • HTTP与HTTPS协议的核心区别
  • Flink 并行度的设置
  • 【微服务】SpringBoot + Docker 实现微服务容器多节点负载均衡详解