[转载] UE4网络基础 - Client和Server的区分

区分当前运行的是客户端还是服务器

  • 蓝图中,有个 SwitchHasAuthority 宏:
    这里写图片描述

    FORCEINLINE_DEBUGGABLE bool AActor::HasAuthority() const
    {
        return (Role == ROLE_Authority);
    }
       
       
    • 1
    • 2
    • 3
    • 4
    • 只有 Role == ROLE_Authority 情况才是表示是 这个actor是在服务器上,其他两种情况都表示在客户端上
      • Authority:如果是服务器,会走这个支线
      • Remote:如果是客户端,会走这个支线
  • c++中:

    • AActor 中都有个 ENetRole Role 变量是用来识别角色的 Actor 的身份的。ENetRole 的几个值:

      • ROLE_None
      • ROLE_SimulatedProxy:这个actor是其他客户端在本机客户端的一个模拟代理
      • ROLE_AutonomousProxy:这个actor是本机客户端的自己控制的角色
      • ROLE_Authority:这个actor是服务器上的actor
    • 示例代码

      void AMyNetCharacter::BeginPlay()
      {
          Super::BeginPlay();
          switch (Role)
          {
          case ROLE_Authority: Flag = "ROLE_Authority"; break;
          case ROLE_SimulatedProxy: Flag = "ROLE_SimulatedProxy"; break;
          case ROLE_AutonomousProxy: Flag = "ROLE_AutonomousProxy"; break;
          default: Flag = "ROLE_None";
          }
      }
           
           
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

      从左至右的三个角色分别是 Server、Client1、Client2 对应控制的角色

      • Server 显示
        这里写图片描述
      • Client1 显示
        这里写图片描述
      • Client2 显示
        这里写图片描述

Actor 的 生成销毁

  1. 如果想 生成销毁 一个 Actor,这个 Actor 必须为 Replicates
    这里写图片描述
  2. 而且必须在服务器上调用,而不是客户端调用,否则只会在该客户端生产,其他客户端不会生成
    这里写图片描述
    这里写图片描述
    • 销毁 的类似。

区分自己控制的和别人的

  • 方式一:经过服务,先rpc服务器方法,再调用拥有该actor控制权的客户端的方法
    这里写图片描述

    • CallServerChangeSkin 事件是 Run On Server 类型
    • ChangeOwnSkin 事件是 Run On Owning Client 类型
  • 方式二:直接成 Actor 中 的 Role 中判断,但不知为啥引擎不提供接口, Role 变量也没有暴露给蓝图,那么就自己提供个接口

    UFUNCTION(BlueprintCallable, Category = AMyNetCharacter)
        virtual ENetRole GetRole() { return Role; }
       
       
    • 1
    • 2

    这里写图片描述

  • 结果:只有自己控制的 Actor 变色
    这里写图片描述


服务端计算、客户端展示

一般来说,对于敏感数值的计算及校验都是在服务端上做,客户端则用来做展示效果,示例如下:

  1. 空格键 触发一个 Skill1 事件, Skill1 是个 Run On Server,只在服务器上调用的事件
    这里写图片描述
    这里写图片描述

    • 该事件是选取范围内的 Pawn 赋予伤害触发 Apply Damage 事件
  2. Apply Damage 是个只会在服务器上跑的事件 修改 Health 变量,该变量是个 RepNotify 类型,会对应生产一个 值改变时触发的函数 OnRep_Health(客户端服务器都会调用),
    这里写图片描述
    这里写图片描述
    这里写图片描述

    • OnRep_Health 判断只有在客户端中才调 ChangeHealthText(TextRender的展示内容)
    • 这里如果 Health 减到小于0时则 DestroyActor 销毁,否则触发 ShowEffect 事件
  3. ShowEffect 事件是个 Multicast 类型,客户端服务器都会调用
    这里写图片描述
    这里写图片描述

    • 这里只需要客户端展示,所以进一步 SwitchHasAuthority 判断,只在客户端(Remote)Spawn粒子特效
  4. 所以结果是:Health 的 TextRender展示 和 粒子特效 都只会在客户端展示,服务端只负责存储及计算值。
    这里写图片描述

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值