Unreal 断线重连、AI控制

2023-11-02 17:01
文章标签 ai 控制 重连 断线 unreal

本文主要是介绍Unreal 断线重连、AI控制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

浅析UE5 DS的断线重连机制
wizardcell.com
ReloginProject

流程说明

当服务器判断某个玩家掉线的时候,会删除对应的PlayerController

void APlayerController::Destroyed()if (Player == NULL && GetLocalRole() == ROLE_Authority)// 销毁PawnPawnLeavingGame();GetPawn()->Destroy();elseUnPossess();Super::Destroyed();void AController::Destroyed()if (GetLocalRole() == ROLE_Authority && PlayerState != NULL)GameMode->Logout(this);CleanupPlayerState();UnPossess();

在GameMode的Logout重载内,会复制一份当前PC的PS,在之后重新登录的时候恢复PS:

void AGameMode::Logout( AController* Exiting )RemovePlayerControllerFromPlayerCount(PC);AddInactivePlayer(PC->PlayerState, PC);APlayerState* const NewPlayerState = PlayerState->Duplicate();DispatchCopyProperties(NewPlayerState);// PS子类需要重写这个函数,保留自己的信息到复制PS上CopyProperties(PlayerState);GameState->RemovePlayerState(NewPlayerState);NewPlayerState->SetReplicates(false);// 保留一定时间,时间到了后还没重连就不管了NewPlayerState->SetLifeSpan(InactivePlayerStateLifeSpan);InactivePlayerArray.Add(NewPlayerState);

在服务器检测到新加入一个Player时,会创建一个新的PlayerController:

APlayerController* UWorld::SpawnPlayActor(UPlayer* NewPlayer, ENetRole RemoteRole, const FURL& InURL, const FUniqueNetIdRepl& UniqueId, FString& Error, uint8 InNetPlayerIndex)if (AGameModeBase* const GameMode = GetAuthGameMode())APlayerController* const NewPlayerController = GameMode->Login(NewPlayer, RemoteRole, *InURL.Portal, Options, UniqueId, Error);APlayerController* const NewPlayerController = SpawnPlayerController(InRemoteRole, Options);InitNewPlayer(NewPlayerController, UniqueId, Options, Portal);NewPlayerController->SetRole(ROLE_Authority);// 附加PlayerNewPlayerController->SetPlayer(NewPlayer);GameMode->PostLogin(NewPlayerController);FindInactivePlayer(NewPlayer);HandleStartingNewPlayer(NewPlayer); // AGameModeBase::PostLogin

还原之前保存的PS:

bool AGameMode::FindInactivePlayer(APlayerController* PC)for (int32 i=0; i < InactivePlayerArray.Num(); i++)if ((bUseUniqueIdCheck && (CurrentPlayerState->GetUniqueId() == PC->PlayerState->GetUniqueId())) ||(!bUseUniqueIdCheck && bHasValidNetworkAddress && (FCString::Stricmp(*CurrentPlayerState->SavedNetworkAddress, *NewNetworkAddress) == 0) && (FCString::Stricmp(*CurrentPlayerState->GetPlayerName(), *NewName) == 0)))APlayerState* OldPlayerState = PC->PlayerState;PC->PlayerState = CurrentPlayerState;PC->PlayerState->SetOwner(PC);OverridePlayerState(PC, OldPlayerState);// 复制当前的PS信息给保存下来的PSPC->PlayerState->DispatchOverrideWith(OldPlayerState);OverrideWith(PlayerState);ReceiveOverrideWith(PlayerState);OldPlayerState->Destroy();

在AGameModeBase::PostLogin内,完成PS初始化后,调用HandleStartingNewPlayer,开始匹配、创建角色

void AGameMode::HandleStartingNewPlayer_Implementation(APlayerController* NewPlayer)if (IsMatchInProgress() && PlayerCanRestart(NewPlayer))RestartPlayer(NewPlayer);else if (GetMatchState() == MatchState::WaitingToStart)StartMatch();
void AGameModeBase::RestartPlayer(AController* NewPlayer)AActor* StartSpot = FindPlayerStart(NewPlayer);RestartPlayerAtPlayerStart(NewPlayer, StartSpot);APawn* NewPawn = SpawnDefaultPawnFor(NewPlayer, StartSpot);return SpawnDefaultPawnAtTransform(NewPlayer, Transform);APawn* ResultPawn = GetWorld()->SpawnActor<APawn>(PawnClass, SpawnTransform, SpawnInfo);

修改

  • 重写PawnLeavingGame
    • 服务器在判断玩家掉线的时候,不进行角色删除
  • 重写AddInactivePlayer
    • 改为创建默认AIController,控制该目标
    • 将PC的PS给AIController持有
  • 重写FindInactivePlayer
    • 当玩家重连的时候,寻找到之前持有PS的AIController
    • 取得PS和Pawn的所有权
  • AGameModeBase::RestartPlayer
    • 因为已经存在Pawn,所以不会再次创建

这篇关于Unreal 断线重连、AI控制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/332024

相关文章

Python实现局域网远程控制电脑

《Python实现局域网远程控制电脑》这篇文章主要为大家详细介绍了如何利用Python编写一个工具,可以实现远程控制局域网电脑关机,重启,注销等功能,感兴趣的小伙伴可以参考一下... 目录1.简介2. 运行效果3. 1.0版本相关源码服务端server.py客户端client.py4. 2.0版本相关源码1

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

AI绘图怎么变现?想做点副业的小白必看!

在科技飞速发展的今天,AI绘图作为一种新兴技术,不仅改变了艺术创作的方式,也为创作者提供了多种变现途径。本文将详细探讨几种常见的AI绘图变现方式,帮助创作者更好地利用这一技术实现经济收益。 更多实操教程和AI绘画工具,可以扫描下方,免费获取 定制服务:个性化的创意商机 个性化定制 AI绘图技术能够根据用户需求生成个性化的头像、壁纸、插画等作品。例如,姓氏头像在电商平台上非常受欢迎,

从去中心化到智能化:Web3如何与AI共同塑造数字生态

在数字时代的演进中,Web3和人工智能(AI)正成为塑造未来互联网的两大核心力量。Web3的去中心化理念与AI的智能化技术,正相互交织,共同推动数字生态的变革。本文将探讨Web3与AI的融合如何改变数字世界,并展望这一新兴组合如何重塑我们的在线体验。 Web3的去中心化愿景 Web3代表了互联网的第三代发展,它基于去中心化的区块链技术,旨在创建一个开放、透明且用户主导的数字生态。不同于传统

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

AI hospital 论文Idea

一、Benchmarking Large Language Models on Communicative Medical Coaching: A Dataset and a Novel System论文地址含代码 大多数现有模型和工具主要迎合以患者为中心的服务。这项工作深入探讨了LLMs在提高医疗专业人员的沟通能力。目标是构建一个模拟实践环境,人类医生(即医学学习者)可以在其中与患者代理进行医学

AI行业应用(不定期更新)

ChatPDF 可以让你上传一个 PDF 文件,然后针对这个 PDF 进行小结和提问。你可以把各种各样你要研究的分析报告交给它,快速获取到想要知道的信息。https://www.chatpdf.com/

【北交大信息所AI-Max2】使用方法

BJTU信息所集群AI_MAX2使用方法 使用的前提是预约到相应的算力卡,拥有登录权限的账号密码,一般为导师组共用一个。 有浏览器、ssh工具就可以。 1.新建集群Terminal 浏览器登陆10.126.62.75 (如果是1集群把75改成66) 交互式开发 执行器选Terminal 密码随便设一个(需记住) 工作空间:私有数据、全部文件 加速器选GeForce_RTX_2080_Ti