在线信标(2/7)

实现在线信标

本节包含一个在线信标的示例实现,用于计算服务器-客户端ping的往返时间(RTT)。往返时间是指数据包从客户端发送到服务器,再返回客户端所需的时间。本示例只是一个小型实现,仅仅简单介绍了在线信标的功能,但其目的是提供一个可用的示例,帮助你上手测试信标以外功能的实现,并解释如何在Gameplay代码中设置在线信标。

本在线信标示例由C++和蓝图共同实现,利用UE的反射系统函数元数据说明符和类元数据说明符进行远程程序调用,并将特定函数公开给蓝图可视化脚本。

要使用虚幻引擎的在线信标执行ping程序,请执行以下步骤:

  1. 创建或打开虚幻引擎C++项目。
  2. 使用C++类向导创建三个新的C++ 类: - 从 OnlineBeaconClient 派生的名为 PingClient 的类。 - 从 OnlineBeaconHost 派生的名为 PingHost 的类。 - 从 OnlineBeaconHostObject 派生的名为 PingHostObject 的类。
  3. 将Ping信标代码小节的代码添加到相应的头文件和源文件中: - Ping客户端代码 - Ping主机代码 - Ping主机对象代码
  4. 将以下函数添加到你项目的游戏模式文件:

Header

    public:
        bool InitPingBeacon();
Copy full snippet

public: bool InitPingBeacon();

Source

    bool ABeaconsGameMode::InitPingBeacon()
    {
        ENetMode Mode = GetNetMode();
        if (Mode == NM_DedicatedServer || Mode == NM_ListenServer)
        {
            APingHost* Host = GetWorld()->SpawnActor(APingHost::StaticClass());
            if (Host && Host->InitializeHost())
            {
                APingHostObject* HostObject = GetWorld()->SpawnActor(APingHostObject::StaticClass());
                if (HostObject)
                {
                    Host->RegisterHostObject(HostObject);
                    return true;
                }
            }
        }
        return false;
    }
Copy full snippet

bool ABeaconsGameMode::InitPingBeacon() { ENetMode Mode = GetNetMode(); if (Mode == NM_DedicatedServer || Mode == NM_ListenServer) { APingHost Host = GetWorld()->SpawnActor<APingHost>(APingHost::StaticClass()); if (Host && Host->InitializeHost()) { APingHostObject HostObject = GetWorld()->SpawnActor<APingHostObject>(APingHostObject::StaticClass()); if (HostObject) { Host->RegisterHostObject(HostObject); return true; } } } return false; }

  1. 在你游戏模式的 BeginPlay 函数中调用 InitPingBeacon 。
  2. 在你项目的 DefaultEngine.ini 文件中添加引擎配置小节中的配置,由此确保已将项目配置为使用在线信标。