NT-2.0|Actor复制
大约 8 分钟
问题
Replication|复制
复制是服务器将信息/数据传递给客户端的行为。
对应的CPP
AMyCharacter::ATestCharacter(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
bReplicates = true;
}
网络权威
Authority|Remote
注
罗马音读音为 /əˈθɔːrəti/(英式发音)或 /əˈθɒrəti/(美式发音)。
if (HasAuthority())
{
// 在具有Authority的实体上执行的代码
}
ENetRole|Remote
GetLocalRole() == ROLE_Authority
原文
/** The network role of an actor on a local/remote network context */
UENUM()
enum ENetRole : int
{
/** 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,
};
翻译
/** 在本地/远程网络环境中,演员的网络角色 */
UENUM()
enum ENetRole : int
{
/** 没有角色。 */
ROLE_None,
/** 该演员的本地模拟代理。 */
ROLE_SimulatedProxy,
/** 该演员的本地自治代理。 */
ROLE_AutonomousProxy,
/** 对该演员的权威控制。 */
ROLE_Authority,
ROLE_MAX,
};
Character继承Pawn,Pawn继承Actor,本质还是Actor所以可以调到。
网络模型
基本网络模式
网络模式 | 说明 |
---|---|
独立 (Standalone) | 游戏作为服务器运行,不接受远程客户端连接。参与游戏的玩家必须为本地玩家。此模式用于单人游戏和本地多人游戏。其将运行本地玩家适用的服务器逻辑和客户端逻辑。 |
客户端 (Client) | 游戏作为网络多人游戏会话中与服务器连接的客户端运行。其不会运行服务器逻辑。 |
聆听服务器 (Listen Server) | 游戏作为主持网络多人游戏会话的服务器运行。其接受远程客户端中的连接,且直接在服务器上拥有本地玩家。此模式通常用于临时合作和竞技多人游戏。 |
专属服务器 (Dedicated Server) | 游戏作为主持网络多人游戏会话的服务器运行。其接受远程客户端中的连接,但无本地玩家,因此为了高效运行,其将废弃图形、音效、输入和其他面向玩家的功能。此模式常用于需要更固定、安全和大型多人功能的游戏。 |
DS和LS区别
(Dedicated Server)和监听服务器(Listen Server)
方面 | 独立服务器(Dedicated Server) | 监听服务器(Listen Server) |
---|---|---|
主机 | 独立服务器,不需要玩家主机 | 服务器和客户端合并在一起 |
与玩家的依赖 | 独立于玩家;不受玩家加入或退出的影响 | 需要托管玩家在线 |
操作系统 | 可编译为Windows和Linux | 客户端的操作系统 |
可视化表示 | 没有可视部分,没有UI,PlayerController或Character | 需要UI,PlayerController和Character |
连接性 | 可在具有固定IP地址的云服务器上运行 | 玩家连接到客户端的IP地址 |
IP地址问题 | 玩家连接到固定IP,没有动态IP问题 | 由于客户端的IP更改,玩家可能面临动态IP问题 |
OnlineSubsystem的使用 | 可以使用OnlineSubsystem解决IP问题 | 也可以使用OnlineSubsystem解决动态IP问题 |
GamePlay网络职责
DS(Dedicated Server)服务器网络模型
RPC|Remote Procedure Calls
"RPC" 是 "Remote Procedure Call"(远程过程调用)的缩写。它是一种通信协议和编程模型, 用于在不同的计算机或进程之间调用远程服务或函数,就像调用本地函数一样。
注意这里的服务器描述可能不准确,LS确实是生成球体,而DS模式可能只是生成球体的代理。
解决|RPC调用
BP
C++
// .h
UFUNCTION(Server, Reliable)
void ServerSetHealth();
// .cpp
void AMyActor::ServerSetHealth_Implementation()
{
//spawn的代码
}