的笔记

随时随地编辑

UE4 Net role, Replicated and RPC

Net Role

AActor.Role描述了角色的网络属性,从而决定了rpc和replicated时的行为表现。这3个网络Role属性分别是:ROLE_Authority,ROLE_AutonomousProxy,ROLE_SimulatedProxy

  • ROLE_Authority,在服务器上的所有角色都是Authority属性
  • ROLE_AutonomousProxy,客户端上的本地角色
  • ROLE_SimulatedProxy,客户端上的网络角色
  • so

  • 服务器上的所有角色都是Authority属性,当前控制的角色可以用IsLocalControlled区分
  • 客户上当前控制的角色具有Autonomous属性
  • 客户端上的远程角色具有SimulatedProxy属性
    Actor 的 Role 和 RemoteRole 属性

    Net Mode

    ENetMode AActor.GetNetMode()

  • NM_Standalone,
    /** Standalone: a game without networking, with one or more local players. Still considered a server because it has all server functionality. */
  • NM_DedicatedServer,
    /** Dedicated server: server with no local players. */
  • NM_ListenServer,
    /** Listen server: a server that also has a local player who is hosting the game, available to other players on the network. */
  • NM_Client,
    /** * Network client: client connected to a remote server. * Note that every mode less than this value is a kind of server, so checking NetMode < NM_Client is always some variety of server. */

  • Replicated Data

    Actor中的Replicated数据自动复制到所有客户端上

    客户端数据不能复制到服务器,只会在客户端本地生效

    so

  • 如果数据定义为replicated,最好仅在server上进心更新,在client上只读,避免引起不必要的混淆。

  • 这样判断端的属性:
  •     在C++中判断是否为服务器:Role == ROLE_Authority
  •     在BP中判断是否为服务器:HasAuthority
  • Replicated的数据在bp中set/get的时候会头顶多顶2个小球


    Replicated Data in C++

    #include "Net/UnrealNetwork.h"
    UPROPERTY(BlueprintReadOnly,Replicated)
    float Health;
    ------
    voidATestNetworkCharacter::GetLifetimeReplicatedProps(TArray< FLifetimeProperty> & OutLifetimeProps) const
    {
    Super::GetLifetimeReplicatedProps(OutLifetimeProps);
    DOREPLIFETIME(ATestNetworkCharacter, Health);
    }
    

    如果不包含头文件UnrealNetwork.h会报错:

    error C3861: 'DOREPLIFETIME': identifier not found


    RPC

    函数有3种replication方式

  • Multicast---在服务器调用,然后自动转到客户端
  • Server---被客户端调用,仅在服务器执行;必须在有Net Owner的Actor上使用
  • Client---被服务器调用,仅在其所有者客户端执行;必须在有Net Owner的Actor上使用

  • Net Owner
  • Actor如果是Player controller或被Player Controller所拥有,则此actor有Net Onwer

  • 也就是说除了多播,rpc函数如果想调用成功必须有以下限制条件
  • Actor是一个Player Controller类型;
  • Actor被一个Player Controller所拥有;

  • 您必须满足一些要求才能充分发挥 RPC 的作用:
  • https://docs.unrealengine.com/latest/CHN/Gameplay/Networking/Actors/RPCs/index.html
  • 它们必须从 Actor 上调用。
  • Actor 必须被复制。
  • 如果 RPC 是从服务器调用并在客户端上执行,则只有实际拥有这个 Actor 的客户端才会执行函数。
  • 如果 RPC 是从客户端调用并在服务器上执行,客户端就必须拥有调用 RPC 的 Actor。

  • xxx

    xxx

  • xxx
  • xxx

    xxx

  • xxx
  • xxx

    xxx

  • xxx
  • posted on 2017-01-14 16:51 的笔记 阅读(2806) 评论(0)  编辑 收藏 引用


    只有注册用户登录后才能发表评论。
    网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理