Bootstrap

29.UE5蓝图的网络通讯,多人自定义事件,变量同步

3-9 蓝图的网络通讯、多人自定义事件、变量同步_哔哩哔哩_bilibili

目录

1.网络通讯

1.1玩家Pawn之间的同步

1.2事件同步

 1.3UI同步

1.4组播

1.5变量同步


1.网络通讯

1.1玩家Pawn之间的同步

创建一个第三人称项目

将网络模式更改为监听服务器,即将房主作为服务器使用。并且将玩家数量改为3。

3个玩家可以测试出,客户端和服务端的关系,客户端和客户端的关系所以至少需要一个服务端和两个客户端才能测试出所有情况。

打开第三人称模板自带的Charactor。

将复制运动和复制关掉,发现服务端和两个客户端之间没有任何同步,相当于三个独立的世界。

当把复制运动打开之后,客户端之间可以同步,客户端和服务端不能同步

当把复制和复制运动都打开之后,可以实现客户端之间,客户端与服务端之间的同步

1.2事件同步

在Charactor中添加一个发射火球的方法

 会发现服务端发射火球可以同步到客户端上,但是客户端发射火球无法同步。

这个时候需要让发射火球的事件在服务器上运行。

首先定义一个发射火球的事件,并且将这个事件设置为在服务器上运行。

 1.3UI同步

 在游戏模式中添加UI时,只会将UI添加到主机上、

在控制器中添加UI时,会将UI添加到每一个玩家屏幕上, 但是直接添加UI会报下面的错误。

需要在创建UI时,判断是否是本地玩家。

1.4组播

组播的方式是,当这个方法被服务端调用的时候,所有服务端和客户端都会执行这个方法。

案例:按2,让所有客户端和服务端都创建UI

运行游戏点击进入服务端的游戏窗口,按2可实现在所有主机上创建UI的功能

组播只能由服务端发起,客户端发起则依旧是本地的方法。

1.5变量同步

当一个服务端更改这个变量时,所有的客户端和服务端中的这个变量也会同步更新。相反当客户端更改这个变量的时候,只是在本地修改。

案例:使用这个机制实现一个,共享的,团队剩余生命数。按1,减少团队剩余生命数。(类似于GTA5中的差事中的那个团队剩余生命)

首先,创建剩余生命的UI控件

创建一个Actor蓝图,命名为记录员,只存一个共享变量,命名为当前团队剩余生命,这个记录员只有一个方法,扣除生命(不需要复制,因为变量是同步的,当其中一个客户端更改这个变量后,整个游戏中所有的主机都会同步这个变量)。

同时将记录员的复制和复制运动打开

剩余生命UI中,添加一个公开可编辑的变量,命名为我的记录员,并将记录员的当前团队剩余生命绑定到剩余生命条数。

将我们的记录员拖到场景中,为了方便看到,我给记录员添加了一个静态网格, 实际开发中则并不需要。

打开角色蓝图,定义创建控件的方法,首先根据类获取场景中的记录员,然后将记录员绑定到我们的UI组件中。虽然创建的剩余生命UI控件是每一个主机一个,但是由于记录员只有一个,所以所有的剩余生命UI中的剩余生命数会随着记录员中的剩余生命同步更新

在角色的开始事件后面,调用上面绑定并显示UI的方法

按3的时候,调用角色死亡事件,角色死亡会找当场景中的记录员,并更改记录员记录的剩余生命,还记的变量同步的原理吗,由于变量同步是从服务端同步到客户端,所有只有在服务端更改这个记录员的剩余生命时,所有主机的变量才能同步,所以角色死亡事件需要设置在服务器上运行

至此,三者可实现同步

总结:

        Pawn同步:打开复制和复制运动

        本地UI:在本地的Pawn中调用和实现

        全局UI:在服务器上运行,且通过Pawn的组播方法实现

        全局UI的变量同步:服务器添加全局唯一的记录员,记录员拥有保存所有需要同步的变量,记录员本身要复制且复制运动,改同步变量的方法需要运行在服务器上。

;