UE4的NetWork简单原理

本文介绍了UE4网络同步的基本原理,包括Replicate的概念、Server与Client的角色、Actor的同步规则。通过实例展示了如何实现简单的网络同步,强调了大部分Replicate是Server到Client,并解释了为何Client不会直接同步到Server。此外,还讨论了模拟复制(simulating copy)的问题,以及如何通过物理引擎或手动通知Server来解决同步问题。最后提到了UE4中的Session在网络游戏开发中的重要性。
摘要由CSDN通过智能技术生成

UE4内部封装实现了大量和网络相关的代码,使得我们不需要再自行编写很多底层的网络同步代码了(连接主机,套接字传输等等)。我们只需要实现相关的函数接口,并进行一定的设置,就可以实现网络游戏的功能了。
下面先讲讲UE4NetWork的几个要点:
*1.UE的网络同步和Replicate密切相关,从字面上理解,就是Server到Client的信息同步。
2.大部分的自动化Replicate都是Server到Client的,Client向Server发信息同步需要额外的设置。
3.GameMode只有一个实例,位于Server上。
4.默认情况下每当一个Client连接到Server,会在Server和Client两边都生成一个相应的Controller和玩家Actor。
5.Server拥有的Actor是源实例,别的Client上看到的是副本,是simulating copy。
6.相应地,如果一个Client连接到Server,会在Server和所有连接的Client上给他生成一个玩家Actor,但是注意了,该Client本地的这个Actor不是simulating copy,而其他Client中生成的这个副本是simulating copy。比如如果有3个玩家,一个Server两个Client,则第二个Client玩家的ActorC2在第一个Client玩家本地生成的ActorC2是simulating copy。但是第二个Client自己的ActorC2不是simulating copy,因为这个是源实例。别人的才是simulating copy。
7.Server在默认情况下(你不修改Actor内部实现)仅仅对远端(Remote)是simulating copy的Actor进行位置同步。比如,Server上连接了两个Client,Client1的玩家实例是ActorC1,Client2的是ActorC2。那么在Server和两个Client上都会同时存在3个Actor:ActorS,ActorC1,ActorC2。同步Replicate发生时,ActorC1不会把自己的位置同步给Client1,因为Server上的ActorC1查看了自己在远端Client1上的副本,发现不是simulating copy,所以不同步位置。而ActorC1在查看自己在远端Client2上的副本时,发现是simulating copy,所以会把自己的位置同步给Client2。*

那么我们现在实现一个最简单的网络同步试试:

1.创建一个项目,创建新的Pawn类。
2.在Pawn类的构造函数里添加一句:

//这个语句就是启动UE4内建的同步功能,同步功能是UE4内建在Actor类内部的,可以同步很多Actor的细节信息
//比如Actor的位置,角度,Attach顺序,是否模拟物理等等,这就是为什么Controller,GameMode等等都继承自Actor且被放进场景的原因,因为这样他们就可以享受Actor内部同步逻辑带来的好处
this->SetReplicates(true);

3.编写其他控制代码,使得Pawn可以相应操作,可以移动。
4.更改Play的Options,把玩家数改为2,窗口模式改为弹出额外窗口。
5.把DefaultPawnClass改为我们编写的可以网络同步的Pawn。(这一步是因为两个玩家都是UE自动Spawn的,他必须知道类型)
6.点击Play,可以看到弹出两个窗口,一个是Client一个是Server。
7.移动Server端游戏里的PawnS,可以发现Client上,那个PawnS也是移动的。
7.但是如果移动的是Client的PawnC,Server上的PawnC是不会动的,这就是我们提到的Replicate方向问题。自动的Replicate都是Server向Client进行同步的,Client不会实时向Server同步数据。
这一点很重要,因为Replicate都是Server向Client进行同步,所以我们大部分的运算和判定都应发生在Server上,然后Server把运算好的游戏世界同步到Client,而Client怎么通知Server输入或者一些重要的事件呢?

我们再编写下一个小程序:
1.直接修改刚才的源代码,对Client的输入监听函数进行一些修改:
原来的代码:

//控制这个Pawn向前移动,幅度为in
void moveforward(float in);
//控制水平移动的函数
void moveleft(float in);

修改为:

//这个依然是监听输入的函数,但是实现有变
    void moveforwa
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值