在某些游戏研发or测试的需求中,需要在Unreal增加一个插件或者模块,里面启动一个服务器作为SDK,然后外部通过直连或者adb forward可以连接到客户端中,获取客户端实时的场景、actor信息等等。UE4本身除了socket server支持之外,也支持简单的HTTP Web Server。由于网上没有比较好的范例,因此这里给出一个例子。
本文以Unreal 4.24为例。搭建HTTP Server,需要在.Build.cs
中引入如下模块:
1 | PrivateDependencyModuleNames.AddRange( |
通过FHttpServerModule::Get()
方法,可以获得内置的HTTP Server模块的一个单例,该instance负责管理内置private的socket listeners。我们可以通过该单例获取HTTPRouter
,然后绑定路由跟handler,然后调用StartAllListeners
,就能够启动Web服务器。具体代码如下:
1 |
|
其中,HEALTH_CHECK_HANDLER需要传进来一个TFunction,可以通过相关代码查阅到。
1 | // Runtime\Online\HTTPServer\Private\HttpRouter.cpp |
在FHttpRequestHandler函数内部中,如果调用了OnComplete(Response)
但return false
的话,会CHECK
不过造成程序crash。因此,可以封装一个生成FHttpRequestHandler
的函数,使得实际只需要根据Request返回一个Response就可以。我们把这种函数自定义为FHttpResponser
:
1 | typedef TFunction<TUniquePtr<FHttpServerResponse>(const FHttpServerRequest& Request)> FHttpResponser; |
然后我们实际只需要编写FHttpResponser
就可以了。比如上面的HEALTH_CHECK_HANDLER例子如下:
1 | TUniquePtr<FHttpServerResponse> HealthCheck(const FHttpServerRequest& Request) |
由于一般HTTP返回的body是json,因此可以像上述一样另外封装作为模板response body的函数。对于request body,要转换为json,可以另外加函数去获取TSharedPtr<FJsonObject>
的request json body实例。首先检查header是否为json格式,然后转化为json。采用UTF8_TO_TCHAR
方法可以支持转换中文。
1 | TSharedPtr<FJsonObject> GetRequestJsonBody(const FHttpServerRequest& Request) |
这样,UE4的一个基本的C++ HTTP Web Server就成型了。笔者因之做了一个简单的模板,传送门在UnrealHttpAutomator~