UE4应用通信
建立WebSocket连接
3DCAT平台已经实现了应用端与网页端的通信流程, 具体通信流程在通信基础小节中进行了详细介绍, 我们需要在UE中建立本地WebSocket连接来最终接受平台转发的网页消息, 以及通过此连接向网页端发送自定义消息.
如果你还没有阅读通信基础小节, 推荐花2分钟阅读一下.
1. 使用RayvisionSocket进行通信
RayvisionSocket会在应用启动后自动连接到3DCAT平台, 无需任何的额外配置, 并提供了RayvisionSocket组件获取WebSocket连接事件.
1.1 插件下载与安装
下载对应引擎版本的RayvisionSocket插件并解压, 随后将解压后的插件复制到引擎安装目录下的Plugins文件夹中(如C:\Epic Games\UE_4.26\Engine\Plugins).
若你使用C++工程, 你可以将此插件移动到的项目根目录下的Plugins文件夹中, 这允许你对此插件进行二次开发. 注意最好不要同时将插件复制到引擎和项目中, 这可能会导致打包时报错.
1.2 插件的使用
打开你的项目, 点击"编辑", 选择"插件"打开插件控制面板, 搜索RayvisionSocket插件并勾选"启用"选项以启用插件. 如果你将插件复制到了项目目录下的Plugins文件夹中, 则插件会默认处于启用状态.
创建一个蓝图Actor, 为其增加一个RayvisionSocket组件. 选中RayvisionSocket组件, 确保勾选bAutoConnect选项. 点击OnMessage事件旁的+号创建消息接收事件. 当收到消息后, 我们将其打印到屏幕中, 并调用RayvisionSocket->SendMessage方法来将消息传输回前端.
1.3 修改TestUrl(可选)
在进行本地开发时, 消息来源可能是开发机的本地端口, 为了方便开发者, 你可以通过修改TestUrl来设定在编辑器环境下的WebSocket连接地址, TestUrl不会在打包后生效, 在打包后, RayvisionSocket会始终尝试连接到3dcat.live.
2. 使用其他方式进行通信
平台会基于WebSocket协议将Web端消息转发至节点机的本地端口, 因此, 只需要建立本地WebSocket连接即可进行与Web端的通信.
2.1 从启动命令行中获取Socket端口
在应用启动前, 3dcat平台会自动为应用分配本机端口并通过启动参数传入UE4中, 端口参数固定为启动参数的最后一位, 在整个应用生存周期内, 这个端口不会发生变化.
const FString CommandLineParam(FCommandLine::Get());
TArray<FString> ParamArray;
CommandLineParam.ParseIntoArray(ParamArray,*FString(" "));
const FString Url = "ws://127.0.0.1:"+ ParamArray.Last() + "/";
上述代码在蓝图中可以是:
2.2 连接本地Socket
2.2.1 使用C++建立连接:
在Build.cs中添加WebSocket模组依赖
PublicDependencyModuleNames.AddRange(new string[]{
"Core",
"WebSockets",
});
头文件中:
#include "WebSockets/Public/WebSocketsModule.h"
#include "WebSockets/Public/IWebSocket.h"
private:
TSharedPtr<IWeb> Socket = nullptr;
Cpp文件中:
FModuleManager::Get().LoadModuleChecked("WebSockets");
const FString ServerProtocol = TEXT("ws");
Socket = FWebsModule::Get().CreateWeb(Url, ServerProtocol);
Socket->OnConnected().AddLambda([&]()->void{
Socket->Send("hello WEB!");
});
Socket->OnMessage().AddLambda([&](const FString & Message){
UE_LOG(LogTemp, Log, TEXT("Message received: %s"), *Message);
});
Socket->Connect();
//关闭连接
//Socket->Close();
2.2.2 使用第三方插件建立连接
你可以使用任何支持WebSocket协议的第三方插件来建立连接, 如BlueprinWebSocket, EasyWebSocket等.