当前位置:首页 > CN2资讯 > 正文内容

Unreal 服务器

4天前CN2资讯


UE4基本的设置服务器相关API

AActor的网络设置

Replicates是代表了Actor是否具备网络连接的功能(是否与服务器连接在一起,有网络连接才能进行“同步”和“广播")

C++代码就是

bReplicates = true;

UActorComponent的网络设置

Component Replicates代表了一个ActorComponent是否与网络连接一起,不过得注意的一点是:拥有该组件的Actor在连接网络的情况下,该组件的网络设置才有效。

C++代码就是

bReplicates = true;

UE4编辑器模拟联网(RunDedicatedServer)

RunDedicatedServer:勾选RunDedicatedServer直接在编辑器运行来模拟联网模式

NumberOfPllayers: 同时开启客户端的数量

如图3个客户端(包括编辑器):

AActor的网络判断API(C++)

在这里我先说明一点,UE4的客户端代码和服务器代码是同一套代码(有点牛),服务器可能缺少了渲染等少数功能。

(1)HasAuthority :判断此时运行的是在客户端还是服务器上

看看源码:

FORCEINLINE_DEBUGGABLE bool AActor::HasAuthority() const { return (Role == ROLE_Authority); }

其中Role是Actor上一个宏变量,可以用来判断当前角色处于服务器或者客户端的哪种情况

/** Describes how much control the local machine has over the actor. */ UPROPERTY(Replicated) TEnumAsByte<enum ENetRole> Role;

ENetRole宏:

UENUM() enum ENetRole { /** No role at all. */ ROLE_None, /** Locally simulated proxy of this actor. */ ROLE_SimulatedProxy, /** Locally autonomous proxy of this actor. */ ROLE_AutonomousProxy, /** Authoritative control over the actor. */ ROLE_Authority, ROLE_MAX, };

当role为

[1]ROLE_None时,根本不存在任意角色

[2]ROLE_SimulatedProxy 网络游戏中别的玩家在本地客户端的一个角色代理

[3]ROLE_AutonomousProxy 网络游戏中自己的玩家在本地客户端的一个角色代理

[4]ROLE_Authority: 网络游戏在服务器上的角色

测试下:

void AMyProjectCharacter::BeginPlay() { Super::BeginPlay(); UWidgetComponent* nameWidgetComponent = this->FindComponentByClass<UWidgetComponent>(); if (nullptr == nameWidgetComponent) return; UUserWidget* nameUserWidget = nameWidgetComponent->GetUserWidgetObject(); if (nullptr == nameUserWidget) return; UTextBlock* textBlock = Cast<UTextBlock>(nameUserWidget->GetWidgetFromName(FName("TextBlock_46"))); if (nullptr == textBlock) return; FString name = "name_none"; if (GetLocalRole() == ENetRole::ROLE_AutonomousProxy) { name = "ROLE_AutonomousProxy"; } else if (GetLocalRole() == ENetRole::ROLE_SimulatedProxy) { name = "ROLE_SimulatedProxy"; } else { } textBlock->SetText(FText::FromString(name)); }

 

[1]这里对于每个客户端而言,自己的角色就是“ROLE_AutonomousProxy”,其他角色就是“ROLE_SimulatedProxy”

[2]如果你亲自运行上面的代码,你会发现AMyProjectCharacter的BeginPlay总共执行了12次,为什么呢?

原因是:我们有在服务器三个AMyProjectCharacter,而存在三个客户端,每个客户端有三个AMyProjectCharacter,总共就是

3 + 3*3 = 12

如下面图所示:

这幅图很好诠释了上面的关系吧。

 

UE4的广播和同步

ue4 的Actor和ActorCompoennt和的同步与广播都建立在上面勾选 bRelicated的前提下

函数广播

这里有三种类型,看蓝图自定义事件的Replicates:

【1】NotReplicated: 函数没有网络通知功能

【2】Multicast: 从Server执行,并广播到各个和服务器连接的客户端(在广播范围内)

其中的WithValidation 代表需要验证才能广播,也就是在 “MulticastRPCFunction_Validate”返回 true 的条件下才能广播下发

UFUNCTION(NetMulticast, unreliable, WithValidation) void MulticastRPCFunction(int a);void MulticastRPCFunction_Implementation(int a) { } bool MulticastRPCFunction_Validate(int a) { return true; }

【3】Run on owning client :从服务器执行,只在自己的客户端调用运行。

 

【4】Run on server: 函数在服务器上执行,经常用于客户端向服务器发送数据,在客户端调用服务器函数执行。

(例如,本地客户端按E键拾取一个物品,按E键触发的回调中在调用Server函数)

(又例如,按W键移动,英雄是在本地客户端计算移动相关属性,然后通过Server函数把位移属性从当前的客户端发送到服务器,进行了同步)

UFUNCTION(Server, unreliable, WithValidation) void ServerPickItem(int itemId); void ServerPickItem_Implementation(int itemId) { } bool ServerPickItem_Validate(int itemId) { return true; }

 

变量同步

变量同步会自动从服务器同步到各个客户端

蓝图实现:

如上面图的变量:NewVar_0

Relication:

【1】None:表示变量不具备同步功能

【2】Replicated: 表示当进入网络裁剪范围内的时候服务器会同步变量到客户端(如果之前就在网络裁剪范围内,则会与连接的客户端相应变量值比较,如果值不一样,同步下去)。

【3】RepNotify: 表示当进入客户端网络裁剪范围内的时候,服务器会同步变量到客户端,并且触发相应的“Notify”函数(如果之前就在网络裁剪范围内, 会与该客户端相应变量值比较,如果值不一样,则触发“Notify”函数), 如下面所示:

 

“Replicated”可以说是 “RepNotify”的子集功能,当然同步变量可细分为几种情况,如下所示;

C++实现变量同步

不带通知事件的变量同步

UPROPERTY(Replicated) float a; virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;void AMyProject2Character::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const { Super::GetLifetimeReplicatedProps(OutLifetimeProps); DOREPLIFETIME(AMyProject2Character, a); }

带通知事件的变量同步

UPROPERTY(ReplicatedUsing = OnRep_NotifyXXX) float a; UFUNCTION() void OnRep_NotifyXXX(); virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;void AMyProject2Character::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const { Super::GetLifetimeReplicatedProps(OutLifetimeProps); DOREPLIFETIME(AMyProject2Character, a); }

上面一切的大前提是: bReplicates = true,也就是已经开启网络复制


    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/21230.html

    标签: Unreal服务器
    分享给朋友:

    “Unreal 服务器” 的相关文章

    ADSL技术详解:了解ADSL有多少波特与速率

    ADSL,即非对称数字用户线,是一种通过现有电话线提供互联网接入的技术。简单来说,ADSL允许我们在不干扰电话通话的情况下,访问互联网并提供比传统拨号更快的速度。对于那些希望在家中使用互联网的人来说,这无疑是一个巨大的进步。 从历史的角度来看,ADSL在90年代末期逐渐进入大众视野,到了2000年代...

    狗云实名认证的重要性与服务体验

    狗云简介 提起狗云(Dogyun),首先让我想起的是它在国内主机服务商中崭露头角的那段经历。成立于2019年,这家由国人创办的云服务平台,积极响应了市场对高质量、低价格VPS服务的需求。服务范围覆盖美国、日本和中国香港等地,让不少技术爱好者和企业客户看到了更多选择的可能。由于其价格相对亲民,狗云逐渐...

    Zgo VPS:高性能虚拟专用服务器的最佳选择

    在2021年,ZgoCloud(最初名为Zgovps)如雨后春笋般成立于美国特拉华州。作为一家新兴的技术公司,我们专注于提供高性能的虚拟专用服务器(VPS),这让我对公司的前景充满了期待。我们最初的使命是为各种用户提供可靠的网络解决方案,而现在我们已经成长为行业内的一股重要力量。 我们的全球数据中心...

    如何查看域名是否被墙:检测工具与方法指南

    域名被墙是一个对很多网站管理员和用户来说都比较陌生的概念。简单来说,当一个网站的内容被认为敏感或者违反某些规定时,防火墙就会把这个域名屏蔽。即使用户通过输入域名试图访问,DNS 解析也许正常,但实际上网站却无法顺利加载。在国内用户访问国外网站或者国外用户尝试访问国内网站时,情况尤为明显,就好像在国际...

    Ubuntu 多人远程办公的安装与配置指南

    安装和配置远程桌面软件 在远程办公和团队协作日益成为常态的今天,合理配置远程桌面软件显得尤为重要。在Ubuntu的环境下,安装和配置xrdp和vncviewer等工具,可以让多个用户方便地进行远程访问,提高工作效率。下面,我将一步步带你进行相关的软件安装和配置。 1. 安装xrdp 首先,我们要安装...

    域名注册商选择指南:如何找出最佳域名注册商

    域名注册商是帮助个人和企业在互联网中获取唯一标识的机构或公司。简而言之,域名注册商提供域名注册、管理和保护的服务。通过这些服务,我们可以确保域名的合法性和有效性,维护我们的在线身份。在现代网络环境中,拥有一个合适的域名是构建品牌形象和促进业务发展的重要一步。 在选择域名注册商时,首先要考虑它们在市场...