Unreal 断线重连、AI控制

这篇具有很好参考价值的文章主要介绍了Unreal 断线重连、AI控制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

流程说明

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

void APlayerController::Destroyed()
	if (Player == NULL && GetLocalRole() == ROLE_Authority)
		// 销毁Pawn
		PawnLeavingGame();
			GetPawn()->Destroy();
	else
		UnPossess();
	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);
		// 附加Player
		NewPlayerController->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信息给保存下来的PS
				PC->PlayerState->DispatchOverrideWith(OldPlayerState);
					OverrideWith(PlayerState);
					ReceiveOverrideWith(PlayerState);
			OldPlayerState->Destroy();

在AGameModeBase::PostLogin内,完成PS初始化后,调用HandleStartingNewPlayer,开始匹配、创建角色文章来源地址https://www.toymoban.com/news/detail-739294.html

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控制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 游戏编程中的AI与物理模拟——用Unreal Engine创建惊艳的游戏世界

    作者:禅与计算机程序设计艺术 作为游戏开发者,我们经常需要在游戏中加入一些视觉、听觉或者触觉等交互性元素,并且给用户提供更具个性化的游戏体验。游戏制作人员也喜欢利用人工智能(AI)来辅助游戏制作过程,例如制作游戏中的怪物和敌人具有潜在的危险性,能

    2024年02月07日
    浏览(50)
  • websocket断线重连&&心跳检测

    封装websocket 实现断线重连跟心态检测,使用的typeScript去封装 在nodejs 安装ws库 代码如下(示例):  服务端实现ws 创建一个server.js 文件 运行ws服务   node .server.js  客户端实现websocket 创建一个socket.ts 文件 vue 页面使用 断开ws服务 断线  启动服务后 自动重连

    2024年01月19日
    浏览(39)
  • uniapp websocket 封装断线重连

     1.新建一个工具类js文件 2. 把我封装的代码复制进去 我是用uniapp 的api封装的 在外面也可以直接用uniapp的api操作 只有在开始调用连接需要用封装的方法调用 在需要使用封装的方法的页面 引入js     import {         websocetObj     } from \\\"@/API/websocket.js\\\"  完善重连 在app.vue的

    2024年02月11日
    浏览(37)
  • WebSocket的心跳机制和断线重连

    在服务器重启或是弱网情况下,前端不能保证一直连接成功。因此在出现被动断开的情况下,需要有 心跳机制 和 断线重连 的功能。 心跳机制 :客户端每隔一段时间向服务端发送一个特有的心跳消息,每次服务端收到消息后只需将消息返回,此时,若二者还保持连接,则客

    2024年01月18日
    浏览(43)
  • Java连接websocket优雅断线、重连功能

          为了实现优雅重连和重试,您需要在代码中添加一些逻辑来处理连接失败或断开连接的情况。 实现代码如下:

    2024年02月10日
    浏览(36)
  • websocket前端封装代码,心跳机制断线重连

    websocket是一种全双工通信长链接,大多用来实现及时通讯,数据实时性要求较为高的地方,在websoket未出现的时候前端使用的setInterval轮训进行数据更新的,在那些对于数据实时性要求不高地方我们仍可以使用 轮训。 (1)建立在 TCP 协议之上,服务器端的实现比较容易。 (

    2024年02月11日
    浏览(52)
  • websocket的基础使用,心跳机制,断线重连

    websoket出现的原因: 传统的http请求只能是由前端向后台发送一个请求,然后后台把结果返回给前端,前端再进行展示。这里就暴露了一个问题,就是通信只能由前端发起,而后台无法主动与前端通信。而websoket的出现就是为了解决这个问题,让前端可以主动联系后台,后台也

    2024年02月06日
    浏览(48)
  • uniapp使用WebSocket断线,心跳重连机制

    提示:我们在使用WebSocket,经常会遇到有的时候给别人发消息,别人会接收不到,这个时候就有可能是WebSocket断线了,所以这个时候心跳包就出现了 提示:可直接使用,记得把对应地址替换一下

    2024年04月12日
    浏览(41)
  • C# TcpClient 断线重连升级版--终结版

    针对 数据报 解析参考:  消息字节总长度+消息内容的解析参考: 调用方法: 增加了消息分割 

    2024年02月12日
    浏览(30)
  • java实现WebSocket客户端&&断线重连机制

    1、引入maven依赖(注意版本) 2、代码

    2024年02月16日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包