UE4 C++ 多人游戏中的简单聊天窗口

news/2024/11/13 14:00:17/文章来源:https://www.cnblogs.com/XTG111/p/18279872

本质

不管是客户端还是服务器在输入文字后,按下回车发送,将触发RPC调用。然后通过RPC将发送者,输入文本等信息,传入到服务器,然后通过多播RPC传播到所有客户端的聊天框。

UI

UI利用三个组件

ScrollBox

用于在服务器以及每个客户端上显示消息的载体

TextBlock

本地将信息通过一个一个的TextBlock组装,然后将组装的结果添加到ScrollBox中实现消息的显示

UEditableText

每个机器上编辑发送消息的主体,该组件具有OnTextCommitted的委托,可以处理提交事件,可以在自定义一个OnSendText委托,用于当Committed时可以外部调用。

switch (CommitMethod){case ETextCommit::Default:break;case ETextCommit::OnEnter:UE_LOG(LogTemp, Warning, TEXT("TextCommitted_OnEnter"));OnSendText.Broadcast(Text);SendText->SetText(FText::FromString(""));UGameplayStatics::GetPlayerController(GetWorld(), 0)->SetInputMode(FInputModeGameOnly());GetNowUserComponent(GetOwningPlayer())->ToggleChatWindow();break;case ETextCommit::OnUserMovedFocus:break;case ETextCommit::OnCleared:break;default:break;}

实现

将直接在GameMode中的PlayerController中增加用于Chat的Component。

ServerSentText

该函数是一个ServerRPC,当接受到OnSendText委托后,调用。
在函数内部,通过遍历当前World中具有ChatComponent的Controller,获得所有客户端的Actor。然后调用多播RPC实现消息的滚动

TArray<AActor*> Actors;
UGameplayStatics::GetAllActorsOfClass(GetWorld(), AXBlasterPlayerController::StaticClass(), Actors);
for (auto& it : Actors)
{UActorComponent* cont = it->GetComponentByClass(UXChatComponent::StaticClass());if (cont && cont->Implements<UXChatInterface>()){IXChatInterface::Execute_ChatMessage(cont,Message,MessageType,PlayerName,SetMessageTypeColor(MessageType),ChatType);}
}

多播RPC MultiSendMessage

该函数在服务器上调用后,会在每个客户端进行执行,该函数主要处理发送信息的整合。
通过GetOwner()获取当前的Controller,然后判断Controller是不是本地的,如果不是那么就会跳过,只有是本地的才会进行消息的拼装,否则会出现多条相同的消息

	AXBlasterPlayerController* PIC = Cast<AXBlasterPlayerController>(GetOwner());if (!PIC->IsLocalController()) return;AXBlasterHUD* HUD = Cast<AXBlasterHUD>(PIC->GetHUD());if (HUD){if (HUD->ChatWdg){UXTextWidget* TextWidget = CreateWidget<UXTextWidget>(UGameplayStatics::GetPlayerController(GetWorld(), 0),HUD->ChatTextClass);if (TextWidget){TextWidget->PlayerName = FText::FromString(SendName);TextWidget->InText = Message;TextWidget->MessType = MessageType;TextWidget->ChatType = EChatTypes::ECT_All;HUD->ChatWdg->ChatScrollBox->AddChild(TextWidget);HUD->ChatWdg->ChatScrollBox->ScrollToEnd();}}}

通过接口实现多播RPC的调用

由于在Server里是遍历了World中所有的Controller,使用接口可以表面获取实例来进行调用而且可以放置选择到那些没有Chat功能的Controller,因为在C++中会首先检验当前的实例是否实现了接口

if (cont && cont->Implements<UXChatInterface>()){IXChatInterface::Execute_ChatMessage(cont,Message,MessageType,PlayerName,SetMessageTypeColor(MessageType),ChatType);}

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

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

相关文章

[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-24 基于FPGA简易示波器显示驱动设计

软件版本:Anlogic -TD5.9.1-DR1_ES1.1 操作系统:WIN10 64bit 硬件平台:适用安路(Anlogic)FPGA 实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台:https://milianke.tmall.com/ 登录"米联客"FPGA社区 http://www.uisrc.com 视频课程、答疑解惑! 1 概述F…

[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-23 RGB转HDMI显示方案

软件版本:Anlogic -TD5.9.1-DR1_ES1.1 操作系统:WIN10 64bit 硬件平台:适用安路(Anlogic)FPGA 实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台:https://milianke.tmall.com/ 登录"米联客"FPGA社区 http://www.uisrc.com 视频课程、答疑解惑! 1概述本…

VU13载板,2个FMC和3个FMC+接口,一个QSFP28(100G)光纤口,一个千兆网接口

VU13载板,2个FMC和3个FMC+接口,一个QSFP28(100G)光纤口,一个千兆网接口,8GB内存。基于XILINX Virtex UltraScale+系列,芯片型号为XCVU13P-2FHGB2104I的一款高性能FMC+载板。该板卡集成了3个FMC+(Vita 57.4)和2个FMC(Vita 57.1)连接器。可以与各种FMC子卡进行完美匹配,为用…

无影云电脑设置开机启动项

在msconfig及任务管理器的选项卡中,不可设置启动项。可通过以下步骤设置。Windows设置 应用 启动 打开或关闭相应启动项版权木有,侵权不究,欢迎转载

企业数字化转型的必备钥匙:数据思维|专题报告集

原文链接:https://tecdat.cn/?p=37165 本质上来讲,企业数字化转型,不仅是技术方面的升级,更是企业文化、思维方式的转变。那么,企业数字化转型究竟需要什么样的思维方式? 企业数字化转型,需要什么样的思维方式? 不知道你有没有过这样的感觉:不知道从什么时候开始,和…

【PHP系列】内存马(一)不死马

实验环境工具 phpstudy一、内存马概念 内存马是无文件攻击的一种常用手段,利用中间件的进程执行某些恶意代码。首先要讲的是PHP不死马,实质上就是直接用代码弄一个死循环,强占一个 PHP 进程,并不间断的写一个PHP shell,或者执行一段代码 二、不死马剖析 test.php: <?p…

[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-21 VTC视频时序控制器设计

软件版本:Anlogic -TD5.9.1-DR1_ES1.1 操作系统:WIN10 64bit 硬件平台:适用安路(Anlogic)FPGA 实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台:https://milianke.tmall.com/ 登录"米联客"FPGA社区 http://www.uisrc.com 视频课程、答疑解惑! 1概述Vi…

【视频讲解】Python用LSTM、Wavenet神经网络、LightGBM预测股价

原文链接:https://tecdat.cn/?p=37184 原文出处:拓端数据部落公众号 分析师:Yuyan Ye 在金融科技的浪潮中,量化投资方法以其数据驱动和模型导向的特性,日益成为资本市场分析的重要工具。特别是,长短期记忆网络(LSTM)、Wavenet以及LightGBM等先进的机器学习算法,因其…

easyFrida指南

easyFrida使用python运行 python easyFrida.py -h usage: easyFrida.py [-h] [-R] [-S S] [-f F | -p P] [--className CLASSNAME] [--plugin PLUGIN] [-l]_____ _ ____ __ _ ___ _ _| ___| __(_) __| | __ _/ _ \/ _` / __| | | | |_ | __| |/ _` |/ _` || __/ (…

生物相容性相关知识

生物相容性常规五项是指哪五项? 编辑于 2024-06-21 10:51 发布于:广东省一、生物相容性常规三项检测是指细胞毒性试验、致敏试验、刺激试验生物相容性。常规五项检测是指细胞毒性试验、致敏试验、刺激试验、全身毒性试验、热原试验。 1.细胞毒性试验是评估生物材料对细胞生…

Camstar Grid中B列的值來自A列選擇后觸發查詢得到 (代碼)

1.先給VP中的Grid綁定行選擇事件 2.拿到A列選擇的數據,在將數據進行SQL執行,將查詢得到的結果賦值給B列

『模拟赛』暑假集训CSP提高模拟12

『模拟赛记录』暑假集训CSP提高模拟12Rank 正常偏下发挥吧。A. 黑客 签到题。 题目中的关键点是只有 \(x\) 和 \(y\) 的和在区间 \(\left[0,999\right]\) 内才合法,因此我们只枚举和在这个范围内的两个值,寻找约分前的值即可,复杂度为 \(\mathcal{O(999^2)}\)。点击查看代码…