自定义事件实现rpc的调用C++和蓝图实现举例

news2024/11/17 21:33:28

参考视频:https://www.youtube.com/watch?v=GcZQ2o6LpDI

1.自定义事件的方式实现rpc
run on server

在这里插入图片描述
修改角色的最大速度,方框1,让客户端先行,速度直接改变;然后方框2,告知服务器,自己的速度已经改变了。
这里的startxxxx和stopxxxx的replicates为run on server。
这样可以防止客户端行走抖动的问题。

这里的是使用事件的方式,rpc是不能有返回值的,正好自定义事件也没有返回值,利用了这一点。

下面我们自己模拟一个例子:
玩家点击p键,在自己所在的位置位置初生成一个Cube,这个Cube的蓝图如下,这里的Replicates是没有勾选的。
在这里插入图片描述

1、Not Replicated的事件
在这里插入图片描述

在这里插入图片描述
当我们在client1上按p键之后,只有client1上有cube,其他client2和server0上是看不到cube的。

2、Run on Server类型的事件:

我们将事件的类型改为:Run on Server后
在这里插入图片描述
在这里插入图片描述
我们还是在Client1上点击p键,结果此时cube只在服务器server0上生成了。
这是为啥呢?
虽然我们Client1是调用了服务器上的方法,但是此时Cube的蓝图并未标记为可复制,我们改下试试:
在这里插入图片描述
在这里插入图片描述
此时可以看到Client1、Client2以及Server0上都生成了Cube了。这是我们想要的结果。

3、Multicast类型的事件
在这里插入图片描述
如果将MyCreateCube事件改为Multicast类型之后,在Client1上点击p键,依然在Client2和Server0是看不到Cube的。
而此时我们应该怎么做呢?
创建一个事件CallServerCreateCube,它的类型为Run on Server,然后由它调用MyCreateCube,而MyCreateCube是Multicast类型的,他会在Server,以及所有相关的Client上执行。此时就可以在Client1上按p键,Client2和Server0上看到此Cube了。
在这里插入图片描述

在这里插入图片描述

4、Run on owing Client这个目前不知道啥意思
是不是选择一组Client进行进行执行,我觉得是这个意思。

一般情况下,由客户端发起调用的rpc,其类型为Run on Server;而Multicast是由服务器发起调用。

下面来看下如何使用C++代码实现:
首先是绑定键盘p事件的响应:
在这里插入图片描述
为了简单起见,我们的Cube就不用代码实现,就直接用蓝图序列化的方式:
在这里插入图片描述

	void CreateCube();
	UPROPERTY(EditAnywhere, Category = "Class Types")
	TSubclassOf<AActor> CubeClass;

在这里插入图片描述
直接序列化我们制作好的Cube蓝图Actor即可。

然后具体实现:
在这里插入图片描述

void ADedicatedServerDemoCharacter::CreateCube()
{
	UE_LOG(LogTemp, Error, TEXT("CreateCube"));
	FVector location = this->GetActorLocation();
	FRotator rotator = this->GetActorRotation();
	GetWorld()->SpawnActor<AActor>(CubeClass, location, rotator);
}

在这里插入图片描述

我们在Client1上,按键盘p,此时其他端是看不到Cube的。

此时咋做呢?
在这里插入图片描述

	UFUNCTION(Server, Reliable)
	void CreateCube();
	void CreateCube_Implementation();

具体实现:

void ADedicatedServerDemoCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent)
{
	// Set up action bindings
	if (UEnhancedInputComponent* EnhancedInputComponent = CastChecked<UEnhancedInputComponent>(PlayerInputComponent)) 
	{	
		PlayerInputComponent->BindAction("Create", IE_Pressed, this, &ADedicatedServerDemoCharacter::CreateCube);
	}
}

void ADedicatedServerDemoCharacter::CreateCube_Implementation()
{
	UE_LOG(LogTemp, Error, TEXT("CreateCube_Implementation"));
	FVector location = this->GetActorLocation();
	FRotator rotator = this->GetActorRotation();
	GetWorld()->SpawnActor<AActor>(CubeClass, location, rotator);
}

注意这里键盘绑定的还是CreateCube,而CreateCube_Implementation是其具体的实现。
其中CreateCube被标记为:UFUNCTION(Server, Reliable)
效果如下:
在这里插入图片描述
同样的如果是multicast的函数,只能是由server调用。
参考:https://www.youtube.com/watch?v=yuBcDji2b3Q

比说这样:

在这里插入图片描述
这里我们添加了一个键盘回调函数,在其中就是调用:Multicast_CreateCube
在这里插入图片描述
结果在Client1中按p之后,只有Client1能看到这个Cube,其他两个端:Client2和Server0都看不到;而如果我们在Server0中按键p之后,Client1、Client2和Server0自己都是可以看到这个Cube的。
这也就证实了,Multicast函数只能由服务器调用,客户端可以调用,但是只能在本地生效。
那解决方式如下:
在这里插入图片描述
PressKeyP函数中,调用server的rpc,其具体实现中,又调用Multicast_CreateCube,这样就可以了,也就是不论客户端还是服务器,都是统一调用server端的rpc CreateCube_Implementation。
CreateCube_Implementation中又调用Multicast_CreateCube的函数。

还有一种方式:
在这里插入图片描述
这里使用:HasAuthority来判断是客户端执行,还是服务端执行。如果是服务端执行,则直接可以调用Multicast函数;如果是客户端执行,则需要调用服务器的rpc才行。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

双脚在路上,钢笔在手里,想法在脑中,2023年CSDN将在心头

☔️&#xff08;一&#xff09;行走过的道路 一年的时间说长不长&#xff0c;说短不短&#xff0c;所渡过时光的长短在于你是否留意你曾走过的路。 &#x1f434;① 记得2022年初我所许下的flag&#xff0c;是要在CSDN平台上运用今年一年的时间撰写超50篇的技术文章&#xff0…

MySQL-运算符详解

1. 算数运算符 运算符名称作用示例加法计算两个值或表达式的和SELECT A B-减法计算两个值或表达式的差SELECT A - B*乘法计算两个值或表达式的乘积SELECT A * B/或DIV除法计算两个值或表达式的商SELECT A / B%或MOD求模(求余)计算两个值或表达式的余数SELECT A % B 2. 比较运…

vue导入私有组件和注册全局组件和props自定义属性

目录先下载并配置插件导入私有组件注册全局组件props自定义属性使用先下载并配置插件 导入的时候需要路径,有个符号,但不能提示路径,需要手打路径,会发现很麻烦,这时候可以通过vscode插件来解决 vscode搜索Path Autocomplete 配置插件,点击插件设置—扩展设置,点开任意一个set…

CRM客户关系管理:赢得和留住客户的指南

客户管理是一个涉及协调和管理客户与企业之间互动的过程。它对企业的商誉及其保留和获得新客户的能力有重大影响。 一般来说&#xff0c;客户管理可以分解成四个不同的部分&#xff1a; - 了解客户的需求以及他们想从你这里得到什么 - 满足这些要求并对他们的询问提供充分的…

EIZO船舶触摸屏维修T1502-B

EIZO船舶触摸屏使用注意事项&#xff1a; 1 由于显示器电子零件的性能需要约30分钟才能稳定,因此在电源开启之后,应调整显示器30分钟以上。 2为了降低因长期使用而出现的发光度变化以及保持稳定的发光度,建议您以较低亮度使用显示器。 3 当显示器长期显示一个图像的情况下再…

传统卷积与Transformers 优缺点对比

近两年Transformer如日中天&#xff0c;刷爆各大CV榜单&#xff0c;但在计算机视觉中&#xff0c;传统卷积就已经彻底输给Transformer了吗&#xff1f; 回答1 作者&#xff1a;DLing 链接&#xff1a;https://www.zhihu.com/question/531529633/answer/2819350360 看在工业界还…

【云原生进阶之容器】第二章Controller Manager原理--client-go剖析

2 Client-go Kubernetes 官方从 2016 年 8 月份开始,将 Kubernetes 资源操作相关的核心源码抽取出来,独立出来一个项目 client-go,Kubernetes中使用client-go作为Go语言的官方编程式交互客户端库,提供对api server服务的交互访问。对于k8s的二次开发,熟练掌握client-go是十…

大胆预测,2023年Android 行业什么技术最重要~

随着Android 时代的发展&#xff0c;在2022的这一年里&#xff0c;感觉自己经历了许多&#xff0c;从年初到年底&#xff0c;见证了不是互联网公司的裁员、优化、毕业、输送人才……等一些列的操作&#xff0c;估计有些人和我一样对Android未来感到茫然&#xff0c;不少人可能会…

发表计算机SCI论文,是先写中文,还是直接写英文论文? - 易智编译EaseEditing

经过高考、四六级和研究生考试&#xff0c;我们都有一定的英文基础&#xff0c;也都知道英文和中文的差别就是中国人和欧美人的思维差别。在这里对中英文写作的优缺点进行列举和分析&#xff1a; 直接写英文论文&#xff1a; &#xff08;1&#xff09;中英文表述方式差异明显…

【图像算法】pytesseract简单实现图片数字识别

【前置目的】 识别视频中是否包含目标元素&#xff1b; 抽象自动化&#xff0c;就是处理一段含有时间戳的视频&#xff1b; 再核心就是对视频进行图片裁减&#xff0c;识别出图片中的数字&#xff0c;做数学计算延时。 【学习地址】 环境&#xff1a;mac、python3、pytesserac…

PCB阻焊桥的工艺设计,华秋一文告诉你

PCB表面的一层漆称为阻焊油墨&#xff0c;也就是PCB线路板防焊油墨。阻焊油墨是PCB线路板中非常常见也是主要使用的油墨。阻焊油墨一般90%都是绿色的&#xff0c;但也有其他颜色&#xff0c;例如&#xff1a;红色、蓝色、黑色、白色、黄色称之为杂色油墨。 阻焊油墨的作用就是…

星尘数据完成5000万元A轮融资,Autolabeling加速自动驾驶量产

近日&#xff0c;国内领先的AI数据服务商星尘数据宣布完成A轮融资5000万元人民币&#xff0c;本轮融资由华映资本领投&#xff0c;小米生态链背景的厚天资本和瑞夏资本跟投。融资将用于端到端的数据闭环系统研发、商务拓展以及供应商合作。星尘数据创始人、CEO章磊表示&#xf…

用Python制作一个文件解压缩工具

经常由于各种压缩格式的不一样用到文件的解压缩时就需要下载不同的解压缩工具去处理不同的文件&#xff0c;以至于桌面上的压缩工具就有三四种&#xff0c;于是使用python做了一个包含各种常见格式的文件解压缩的小工具。 常见的压缩格式主要是下面的四种格式&#xff1a; zip…

New File Format:SpreadJS v16 Crack

New File Format 有你需要的更新内容&#xff0c;请大家及时更新到最新版 SpreadJS V16 has just released, and with it, Ω578867473 some exciting new features, including a new SpreadJS file format and enhancements to the TableSheet, Designer, Calculation, and W…

基于51单片机的数字电压表(TCL549)(Proteus仿真+程序)

编号&#xff1a;31 基于51单片机的数字电压表&#xff08;TCL549&#xff09; 功能描述&#xff1a; 本系统由51单片机最小系统TCL549模块一路模拟量输入模块液晶1602显示模块 1、主控制器是89C52单片机 2、TCL54模数转换器进行A/D转换&#xff0c;读取电压一路数据&#xf…

VSCode(Flutter开发)使用的 4 个 技巧

1.更清晰的文件夹结构 在创建一个新的 flutter 项目后&#xff0c;有太多的文件。但是我们可以在 VSCode 中用非常简单的步骤来构造这些文件: 打开命令面板(Ctrl/Cmd Shift P) 键入“首选项: 打开设置(JSON)” 将以下代码行添加到 setings.json: { "explorer.fileNes…

yapi的安装

Yapi的安装 Yapi是一款不错的接口管理软件&#xff0c;我主要用它来进行接口Mock。 Yapi安装所需环境&#xff1a; Node.js&#xff08;7.6&#xff09;Mongodb&#xff08;2.6&#xff09;git 各环境安装地址&#xff1a; git&#xff1a;https://git-scm.com/downloadsN…

[极客大挑战 2019]Buy Flag1(BUUCTF)

前言: 这篇文章还是是为了帮助一些 像我这样的菜鸟 找到简单的题解 题目描述 解题工具: 我爱用edit this cookie2和hackerbar&#xff0c; 当然也可以burpsuite和fiddler抓包 解题过程: 看到他说flag要100000000 MONEY&#xff0c; 还要是Cuits students&#xff0c; …

windows11 elasticsearch-head 插件安装

1.elasticsearch-head 插件介绍 elasticSearch-head就是一款能连接ElasticSearch搜索引擎&#xff0c;并提供可视化的操作页面对elasticSearch搜索引擎进行各种设置和数据检索功能的管理插件&#xff0c;如在head插件页面编写RESTful接口风格的请求&#xff0c;就可以对Elastic…

DaVinci:限定器之蒙版优化

调色页面&#xff1a;限定器Color&#xff1a;Qualifier使用限定器等工具进行抠像后&#xff0c;所得到的遮罩 Matte&#xff08;又称为“蒙版”&#xff09;可能会存在诸多问题&#xff0c;比如边缘过于锐利或呈锯齿状、遍布杂点&#xff08;噪点&#xff09;或中间有不规则的…