【UE网络】虚幻网络系统

一. 单机游戏与网络游戏

1.1 单机游戏

 

1.2 网络游戏

  • 构成的必要条件:终端用户、联网硬件环境、服务器、数据传输通信协议
  • 借助服务器和通信协议,进行玩家交互

 

1.3 网络交互流程

 

二. 服务器与客户端

  • 服务器端(Service)是响应请求(response),返回相应的资源数据
    • 服务器最主要的是CPU(开发游戏引擎 - 游戏开发 - 引擎应用开发)
  • 客户端(Client)是发送请求(request)与验证
    • 提供本地服务,并收集玩家操作反馈给服务器

 

三. 虚幻网络构架

3.1 Listen - Server 体系结构

  • UE4 使用标准的 Listen - Server 体系结构(L - S能够很好的规避游戏中作弊)

eg:客户端的操作,需要服务器进行检测,服务器允许后,客户端才可以操作(而不是客户端直接操作)

3.2 UE网络架构

  • UE中主机(服务器)与客户端重合
  • UE认定,创建房间的客户端同时具备服务器特性
  • UE中支持单独进行服务器封包操作(这需要更新源码操作)

 

四. 角色身份

  • 在UE网络框架中,Actor是促成网络同步的重要助推

 

4.1 网络信息传递的主要方式

  • 复制Replication
    • 信息从服务端同步到客户端(单向)
    • Actor 及其派生类才有 Replication 的能力
    • Replication 的三大类型:
      • ① Actor Replication对象复制
        • 服务端生成,客户端也跟着生成(在服务端生成一个 replicate 对象
        • 当前 Actor 的所有属性复制、组件复制、RPC的总开关

                                         

C++中开启:

bReplicates = true;

 

      • ② Property Replication属性复制

                              

C++中开启:

复制代码
//属性前加 UPROPERTY(Replicated),VisibleAnywhere在蓝图中可视
UPROPERTY(Replicated,VisibleAnywhere)
string Name = "张三";

//在.cpp文件 GetLifetimeReplicatedProps 函数中添加:DOREPLIFETIME(类名称,变量名),不需要声明该函数
//加头文件
#include "Net/UnrealNetwork.h"
void ATestCPPActor::GetLifetimeReplicatedProps(TArray< FLifetimeProperty > & OutLifetimeProps) const
{
    Super::GetLifetimeReplicatedProps(OutLifetimeProps);
        DOREPLIFETIME (ATestCPPActor, Name);
}
复制代码
      • ③ Component Replication组件复制
  • 复制通知 Rep_Notify
    • 如果一个变量设置为Rep_Notify,当该变量发生复制时,服务端和收到该值的客户端都可以调用一个自定义的函数(C++版本仅在客户端调用函数)

                     

C++中开启:

复制代码
// 在AMyActor.cpp 文件的构造函数中,复制设置为true
AMyActor::AMyActor()
{
    SetRootComponent(CreateDefaultSubobject<USceneComponent>(TEXT("Root")));  //绑定一个空的根组件
    bReplicates = true;
}

void AMyActor::Func()
{
    //server
    if (HasAuthority()) { UE_LOG(LogTemp,Warning,TEXT("Server Name%s"),Name);}
    //client
    else{ UE_LOG(LogTemp,Warning,TEXT("Client Name%s"),Name);}
}

//在.cpp文件 GetLifetimeReplicatedProps 函数中添加:DOREPLIFETIME(类名称,变量名),不需要声明该函数
//加头文件
#include "Net/UnrealNetwork.h"
void AMyActor::GetLifetimeReplicatedProps(TArray< FLifetimeProperty > & OutLifetimeProps) const
{
    Super::GetLifetimeReplicatedProps(OutLifetimeProps);
        DOREPLIFETIME (AMyActor, Name);
}

// 在AMyActor.h 文件中定义变量 
UPROPERTY(ReplicatedUsing = Func) string Name = "张三"; UFUNCTION() void Func();
复制代码
  • 远端调用RPC(灵活)

 

4.2 复制Replication 和 权威Authority

  • 主机(服务器)通知客户端进行 Actor 创建,称之为 复制Replication
  • 只有主机有权限对 Actor 进行修改或发布指令,称之为 权威Authority

 

远端调用 Remote Procedure Call

eg:假如客户端 A 想对客户端 B 发起攻击操作,但 A 对 B 无操作权限。A 应向主机发起攻击操作请求,由主机进行伤害传播。

 

4.3 Actor 的更新方式

  • 属性更新
    • 针对成员变量,由引擎推动
    • 不消耗带宽,但会消耗CPU进行监视
  • RPC(远端调用)
    • 针对函数,由用户调用

 

4.4 UE中网络角色类型

 

 

 

 

五. 属性同步

5.1 Actor Replication 同步验证

  • 场景中的 BP_Actor 同步到所有终端
    • 客户端不能修改/生成 Actor(服务端勾选网络同步后,可以同步到所有终端)

  •  同步 BP_Actor 的位置信息并移动

 

5.2 网络角色类型

  • UE 网络框架将操控的 Pawn 划分为:Authority、Autonomous、Simulated
    • Authority 权威
      • 服务器端,所有角色均被标记为 Authority(服务器的绝对权威性)
      • Actor 存在于服务器
    • Autonomous 自主
      • 操控来源于真人,在客户端操纵的角色为 Autonomous
    • Simulated 模拟
      • 其他角色则为Simulated,(远端)操控来源于服务器

 

 

 

5.3 角色类型标记属性

  • 每个 Actor 中都存在2个属性(Role、RemoteRole),用来裁定当前 Actor 在服务器/客户端上的身份类型
    • Role
    • Get Local Role 节点:当前角色在本地端的身份类型
    • Role 可以用来裁定当前角色是否在服务器,判断本地端是否为权威:
      • Has Authority 节点(函数)
      • Switch Has Authority 节点(宏)

 

    • RemoteRole
    • Get Remote Role 节点:当前角色在远端的身份类型

 

  •  Role 、RemoteRole 两个属性存在于 Actor 上,用于标记 Actor 在网络上的复制关系:
    • Actor 的主控权在哪(拥有主控权方可进行复制)
    • 当前 Actor 是否被复制
    • 复制的模式(模拟 / 自主)

 

六. RPC远端调用

6.1 RPC概述

1. RPC:在本机上调用函数,但在其他机器上远程执行的函数

2. RPC 执行分3种形式:

  • 服务端执行(Server)
    • 在客户端调用,这个 Actor 必须拥有所有权
  • 客户端执行(Client)
    • 在服务端调用,Actor 所有权在该客户端上
  • 所有终端执行(Multicast)
    • 服务端调用,拥有 Actor 的服务端

 

6.2 RPC调用注意事项

  •  必须从 Actor 上调用,Actor 必须被(面板勾选)复制
  • 从服务器调用,客户端执行,则拥有该 Actor 的客户端才会执行 RPC
  • 从客户端调用,服务器执行,客户端必须拥有调用 RPC 的 Actor
  • 多播 RPC 
    • 从服务器调用,就在本地(服务器)和所有连上该服务器的客户端上执行
    • 从客户端调用,就只在本地(客户端)上执行

 

  • 客户端调用时,必须保证 Actor 具有操控权,(在服务器端可直接调用)
  • 客户端广播时,必须经服务器再广播
  • RPC 在蓝图中需借助自定义事件使用
  • RPC 默认是不可靠的(为防止网络饱和,在频繁通讯时会出现丢失),需要根据情况开启Reliable,变为“可靠函数”
  • RPC 调用时需注意调用 Actor 的从属关系和调用位置

 

6.3 RPC 调用情况

 

 

 

-END-

posted @   哟吼--小文文公主  阅读(1010)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示