UE4实现断线重连功能
断线重连的整体逻辑是 设备离线后,根据需要决定是否保留pawn,还是设备重连后再重新生成一个,然后是断线重连时的验证方式,最后是playerstate重连后的属性保留
- 重载Playercontroller的PawnLeavingGame,这里是设备断线后,不会删除pawn,根据自己的需求决定是否需要修改,如果不需要保存pawn,没有必要重载该函数。
void AMVNControllerBase::PawnLeavingGame()
{if (GetPawn() != NULL){//GetPawn()->Destroy();//SetPawn(NULL);}
}
2.如果要保留pawn的话,可以重载GameMode的AddInactivePlayer,这个函数原本是保留断线的playerstate的,如果也要保留pawn的话,可以在这个函数里参照保留PlayerState的方式,保存pawn,如果不需要保存pawn,没有必要重载该函数。
void AVTTSGameModeBase::AddInactivePlayer(APlayerState* PlayerState, APlayerController* PC)
{check(PlayerState)UWorld* LocalWorld = GetWorld();// don't store if it's an old PlayerState from the previous level or if it's a spectator... or if we are shutting downif (!PlayerState->IsFromPreviousLevel() && !MustSpectate(PC) && !LocalWorld->bIsTearingDown){APlayerState* const NewPlayerState = PlayerState->Duplicate();APawn* PolicePawn = PC->GetPawn();if (NewPlayerState && PolicePawn){// Side effect of Duplicate() adding PlayerState to PlayerArray (see APlayerState::PostInitializeComponents)GameState->RemovePlayerState(NewPlayerState);// make PlayerState inactiveNewPlayerState->SetReplicates(false);// delete after some timeNewPlayerState->SetLifeSpan(InactivePlayerStateLifeSpan);//设置自动删除的时间PolicePawn->SetLifeSpan(InactivePlayerStateLifeSpan);// On console, we have to check the unique net id as network address isn't validconst bool bIsConsole = !PLATFORM_DESKTOP;// Assume valid unique ids means comparison should be via this methodconst bool bHasValidUniqueId = NewPlayerState->GetUniqueId().IsValid();// Don't accidentally compare empty network addresses (already issue with two clients on same machine during development)const bool bHasValidNetworkAddress = !NewPlayerState->SavedNetworkAddress.IsEmpty();const bool bUseUniqueIdCheck = bIsConsole || bHasValidUniqueId;// make sure no duplicatesfor (int32 Idx = 0; Idx < InactivePlayerArray.Num(); ++Idx){APlayerState* const CurrentPlayerState = InactivePlayerArray[Idx];if ((CurrentPlayerState == nullptr) || CurrentPlayerState->IsPendingKill()){// already destroyed, just remove itInactivePlayerArray.RemoveAt(Idx, 1);InactivePawnArray.RemoveAt(Idx, 1);Idx--;}else if ((!bUseUniqueIdCheck && bHasValidNetworkAddress && (CurrentPlayerState->SavedNetworkAddress == NewPlayerState->SavedNetworkAddress))|| (bUseUniqueIdCheck && (CurrentPlayerState->GetUniqueId() == NewPlayerState->GetUniqueId()))){// destroy the playerstate, then remove it from the trackingCurrentPlayerState->Destroy();InactivePlayerArray.RemoveAt(Idx, 1);InactivePawnArray.RemoveAt(Idx, 1); //保存角色Idx--;}}InactivePlayerArray.Add(NewPlayerState);InactivePawnArray.Add(PolicePawn);// make sure we dont go over the maximum number of inactive players allowedif (InactivePlayerArray.Num() > MaxInactivePlayers){int32 const NumToRemove = InactivePlayerArray.Num() - MaxInactivePlayers;// destroy the extra inactive playersfor (int Idx = 0; Idx < NumToRemove; ++Idx){APlayerState* const PS = InactivePlayerArray[Idx];if (PS != nullptr){PS->Destroy();}}// and then remove them from the tracking arrayInactivePlayerArray.RemoveAt(0, NumToRemove);InactivePawnArray.RemoveAt(0, NumToRemove);}}}
}
- 同理如果需要重新获得之前保留的pawn的话,重载gamemode的restartPlayerAtPlayerStart,默认的话是直接生成新的pawn,如果你想直接使用就的pawn修改响应的逻辑
- 重载时设备的验证,GameMode的FindInactivePlayer函数,默认设备重连时会比较网络的UniqueId,如果一致那么会复制原本的设备的playerstate数据,但是如果你的客户端设备经过重启的话,是会识别成新的客户端,所以根据需要自己去决定是否修改验证方式。
- 重载PlayerState的CopyProperties,将你自定义的变量进行重新复制
以上就是断线重连基本的涉及的函数了,这一切的前提是gamemode必须继承自AGameMode,然后如果你没有保留pawn,或者自己验证重新登录逻辑的话,只需要修改第5条对应的内容就可以实现断线重连了
相关文章:
UE4实现断线重连功能
断线重连的整体逻辑是 设备离线后,根据需要决定是否保留pawn,还是设备重连后再重新生成一个,然后是断线重连时的验证方式,最后是playerstate重连后的属性保留 重载Playercontroller的PawnLeavingGame,这里是设备断线后࿰…...
nginx笔记
1. nginx 简介 nginx性能比apache强,体现 在io模型方面 76 Pv: UV : 不同浏览器是不同的UV GET 获取 POST 上传 HEAT 只看头 访问网站的流程 1.dns解析 2.cdn 3.tcp 4.web服务器 处理 建立连接 接收请求 处理请求 GET POST等 获取资源 构…...
动态库的制作和使用
动态库和静态库的工作原理 配置环境变量 方式1: 坏处:环境变量是临时的 方式2: 1 用户级别的配置: 进入到/home,找到.bashrc,进入 先去找到库的路径 然后再到.bashrc最后一行输入路径 使其生效 2 系统…...
AWS Glue Pyspark+Athena基础学习汇总
Pyspark 基础学习汇总篇🍎 一、AWS 架构 ① AWS Glue:工作平台,包括脚本的编写以及管理脚本的运行状态以及调度等(主要:数据库配置、ETL和数据转换脚本编写、调度) ② Amazon S3 数据湖(数仓):数据的存储 ③ Athena:(雅典娜)SQL直接编写查询工作台(会产生费用) ④ Q…...
智能合约安全新范式,超越 `require`和`assert`
智能合约安全新范式,超越 require_assert 摘要 不要只为特定的函数写 require 语句;为你的协议写 require 语句。函数遵循检查(requirements)-生效(Effects)-交互(INteractions)协议不变性(Invariants)或 FREI-PI 模式可以帮助你的合约更加安全&#x…...
【ESP-S3-BOX-Lite花屏问题】:Github下载源码(出厂源码factory_demo)编译调试到ESP-S3-BOX-Lite中出现花屏现象
项目场景: 最近拿到了一块乐鑫的 ESP-S3-BOX-Lite (esp-box: ESP-BOX 是乐鑫信息科技) 详细资料(esp32_s3_box_lite) 版本信息 ESP-BOX依赖的 ESP-IDF分支信息支持状态master> release/v5.1 commit id: 22cfbf3…...
Redis集群3.2.11离线安装详细版本(使用Ruby)
1.安装软件准备 1.Redis版本下载 Index of /releases/http://download.redis.io/releases/ 1.2gcc环境准备 GCC(GNU Compiler Collection,GNU编译器套件)是一套用于编译程序代码的开源编译器工具集。它的主要用途是将高级编程语言(如C、C++、Fortran等)编写的源代码转换…...
Ansible自动化运维
目录 前言 一、概述 常见的开源自动化运维工具比较 二、ansible环境搭建 三、ansible模块 (一)、hostname模块 (二)、file模块 (三)、copy模块 (四)、fetch模块 ÿ…...
MSTP + Eth-Trunk配置实验 华为实验手册
1.1 实验介绍 1.1.1 关于本实验 以太网是当今现有局域网LAN(Local Area Network)采用的最通用的通信协议标准,以太网作为一种原理简单、便于实现同时又价格低廉的局域网技术已经成为业界的主流。 本实验主要介绍了LAN网络中的Eth-Trunk技术…...
滚动菜单 flutter
想实现这个功能: 下面的代码可以实现: import package:flutter/material.dart;void main() > runApp(MyApp());class MyApp extends StatelessWidget {static const String _title Flutter Code Sample;overrideWidget build(BuildContext context)…...
javaee springMVC数字类型转换之通过注解的方式
po 在属性上增加注解 NumberFormat(pattern “#,#.#”) package com.test.pojo;import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.NumberFormat;import java.util.Date;public class Users {private int uid;pr…...
SQL中CASE的用法
在SQL中,CASE语句是一种条件表达式,用于根据条件执行不同的操作。它有两种形式:简单CASE表达式和搜索CASE表达式。 简单CASE表达式的语法如下: CASE expressionWHEN value1 THEN result1WHEN value2 THEN result2...ELSE result …...
自己的碎碎念集合
自己的碎碎念集合 2023-09-07 c++叠加三目运算符闰年计算法2023-08-13 一个小题目 A+B problem一、问题及解答关碍总结2023-07-26 C的2至36进制转换函数一、itoa()函数的示例代码总结2023-07-19 平面坐标下判断三角形以及输出周长和面积一. 基本知识总结2023-06-25 达芬奇去除白…...
暂定名「码道功成:Coder启示录」
听人劝、吃饱饭,奉劝各位小伙伴,不要订阅该文所属专栏。 作者:不渴望力量的哈士奇(哈哥),十余年工作经验, 跨域学习者,从事过全栈研发、产品经理等工作,现任研发部门 CTO 。荣誉:2022年度博客之星Top4、博客专家认证、全栈领域优质创作者、新星计划导师,“星荐官共赢计…...
Apache HTTPD (CVE-2017-15715)换行解析漏洞复现
Apache HTTPD 换行解析漏洞 CVE-2017-15715漏洞简介 组件版本漏洞名称 Apache HTTPD 换行解析漏洞(CVE-2017-15715) 漏洞描述 Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞&…...
Spring Boot集成JasperReport生成文档
由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲染生成PDF文档。 一、使用Ireport designer 5.6设计模板 ireport的使用由于时间关系不便多…...
02-Tomcat打破双亲委派机制
上一篇:01-从JDK源码级别剖析JVM类加载机制 Tomcat 如果使用默认的双亲委派类加载机制行不行? 我们思考一下:Tomcat是个web容器, 那么它要解决什么问题: 一个web容器可能需要部署两个应用程序,不同的应用…...
怎么理解flink的异步检查点机制
背景 flink的checkpoint监控页面那里有两个指标Sync Duration 和Async Duration,一个是开始进行同步checkpoint所需的时间,一个是异步checkpoint过程所需的时间,你是否也有过疑惑,是否只是同步过程中的时间才会阻塞正常的数据处理…...
SpringMVC <url-pattern/>解读
1. < url-pattern/>的值 (1).使用拓展名的方式,语法*.xxx,xxx是自定义的拓展名,常用的方式*.do,*.action,不能使用*.jsp. (2).使用斜杠 "/"当项目中使用了 / ,他会替代tomcat中的default。导致所有的…...
大学毕业设计的益处:培养实践能力、深入专业领域、展示自信与建立联系
大学生做毕业设计有许多好处,以下是一些主要的原因和好处: 实践应用能力:毕业设计通常需要学生将所学的知识和技能应用到一个具体的项目中,这有助于他们将理论知识转化为实际应用能力。 独立思考和解决问题:毕业设计要…...
工业物联网长距离蓝牙环境监测方案解析
1. 项目概述在工业物联网和远程环境监测领域,如何实现低功耗、长距离的数据传输一直是个技术难点。传统蓝牙技术受限于通信距离(通常10米以内),而Wi-Fi方案又面临功耗过高的问题。最近我在一个工厂环境监测项目中,成功…...
【研报 A110】物理AI时代的具身数据采集需求研究:国家级训练场落地,开源生态加速建设
摘要:物理AI时代,具身智能与世界模型的发展,推动具身数据采集成为下一代数据基建的核心浪潮。具身大模型对数据有着EB级的海量需求,同时对多模态、异构性与质量要求极高,当前数据缺口成为制约具身智能发展的核心瓶颈&a…...
STK Astrogator模块避坑指南:从Target Sequence优化失败到成功收敛的5个关键设置
STK Astrogator模块避坑指南:从Target Sequence优化失败到成功收敛的5个关键设置 轨道优化是航天任务设计中的关键环节,而STK的Astrogator模块作为行业标准工具,其Target Sequence功能既能实现复杂机动规划,也常因参数设置不当导致…...
别再只搜WOL教程了!华硕/微星主板BIOS里这两个隐藏选项没开,魔术包收到也白搭
华硕/微星主板WOL终极配置指南:破解BIOS隐藏选项的实战手册 深夜加班后想远程唤醒家里的台式机渲染视频,却发现魔术包石沉大海?你可能已经按照无数教程配置了网卡唤醒选项,却忽略了主板BIOS里那两个致命的隐藏开关。本文将用实验室…...
DICOM文件里除了图像,还藏了哪些信息?一份给开发者的隐私与元数据解析指南
DICOM文件里除了图像,还藏了哪些信息?一份给开发者的隐私与元数据解析指南 医疗影像数据是AI模型训练和医疗信息系统开发的重要基础,但许多开发者往往只关注图像像素本身,忽略了DICOM文件中蕴含的丰富元数据。这些元数据不仅包含关…...
SAP ABAP开发必看:FOR ALL ENTRIES性能翻倍的隐藏参数rsdb/max_blocking_factor实战调优
SAP ABAP性能调优实战:FOR ALL ENTRIES参数优化全解析 当你在ABAP开发中处理百万级数据时,是否遇到过这样的场景:明明使用了FOR ALL ENTRIES语句,程序却像蜗牛一样缓慢?这背后隐藏着一个关键参数——rsdb/max_blocking…...
手把手教你用STM32和电位器,临时搭建一个TTL转485调试器(附电路图)
应急调试利器:用STM32和电位器快速搭建TTL转485监听器 在嵌入式开发现场调试时,最让人头疼的莫过于设备串口输出异常却找不到合适的调试工具。上周在客户工厂就遇到了这样的窘境——需要监控设备TTL串口数据,但手边只有RS485转换器和几根杜邦…...
Java面试跳槽需要提前准备什么内容?
今年时间属实过得挺快的,想必有很多小伙伴这会已经在为下半年面试跳槽做准备了。临近面试肯定是要想办法提升自己的面试能力,这个时候如果还去一昧地提升自己的代码能力对面试是毫无帮助的。大多数人在面试的时候都会遇到以下几种情况(大家可…...
知网AI率30%50%80%哪个最难降?比话降AI知网专精方案!
知网AI率30%50%80%哪个最难降?比话降AI知网专精方案! 很多硕博毕业生有个直觉:知网 AI 率 80% 比 30% 难降很多。这个直觉只对了一半。 真相是:难度不是看数字高低,是看「工具的技术路线对不对知网的算法」。一篇 80% …...
技术Leader的困境:为什么你越努力,团队越依赖你?
在软件测试领域,我们比任何角色都更懂“依赖”这个词。测试环境依赖稳定、测试数据依赖真实、测试用例依赖需求文档。但有一种依赖,最致命却也最容易被忽视——团队对你的依赖。很多从一线测试骨干晋升为测试Leader的人,都会陷入一个怪圈&…...
