[英]How to add a UFunction to an interface's delegate with parameters in UE4 C++?
我正在寻找在虚幻中使用 web sockets 。 我正在关注这里的教程: Web Socket Tutorial
最值得注意的是,我试图在连接之前绑定到事件。 在示例中,他们使用.AddLambda
但是,我想尝试使用.AddUFunction
。 似乎 function 采用了 Object、 function 名称和VarTypes...types
。 我似乎无法弄清楚使用参数的代表的最后一个参数是什么。 (至少我相信这是问题所在)函数本身具有正确的签名并匹配我想要绑定的委托。
这是我到目前为止所拥有的:
void AWebSocketController::CreateWebSocket(FString ServerUrl, FString ServerProtocol)
{
Socket = FWebSocketsModule::Get().CreateWebSocket(ServerUrl, ServerProtocol);
// We bind to the events
Socket->OnConnected().AddUFunction(this, FName("OnSocketConnection"));
Socket->OnConnectionError().AddUFunction(this, FName("OnSocketConnectionError"));
Socket->OnClosed().AddUFunction(this, FName("OnSocketClosed"));
Socket->OnMessage().AddUFunction(this, FName("OnSocketReceiveMessage"));
Socket->OnMessageSent().AddUFunction(this, FName("OnSocketSentMessage"));
// And we finally connect to the server.
Socket->Connect();
}
它给了我以下错误消息:
error LNK2005: "public: void __cdecl AWebSocketController::OnSocketClosed(int,class FString const &,bool)" (?OnSocketClosed@AWebSocketController@@QEAAXHAEBVFString@@_N@Z) already defined in WebSocketController.cpp.obj
error LNK2005: "public: void __cdecl AWebSocketController::OnSocketConnection(void)" (?OnSocketConnection@AWebSocketController@@QEAAXXZ) already defined in WebSocketController.cpp.obj
error LNK2005: "public: void __cdecl AWebSocketController::OnSocketConnectionError(class FString const &)" (?OnSocketConnectionError@AWebSocketController@@QEAAXAEBVFString@@@Z) already defined in WebSocketController.cpp.obj
error LNK2005: "public: void __cdecl AWebSocketController::OnSocketReceiveMessage(class FString const &)" (?OnSocketReceiveMessage@AWebSocketController@@QEAAXAEBVFString@@@Z) already defined in WebSocketController.cpp.obj
error LNK2005: "public: void __cdecl AWebSocketController::OnSocketSentMessage(class FString const &)" (?OnSocketSentMessage@AWebSocketController@@QEAAXAEBVFString@@@Z) already defined in WebSocketController.cpp.obj
function 定义:
void AWebSocketController::OnSocketConnection()
{
}
void AWebSocketController::OnSocketConnectionError(const FString& ErrorMessage)
{
}
void AWebSocketController::OnSocketClosed(int32 StatusCode, const FString& Reason, bool WasClean)
{
}
void AWebSocketController::OnSocketReceiveMessage(const FString& Message)
{
}
void AWebSocketController::OnSocketSentMessage(const FString& Message)
{
}
我以前从未遇到过这个.AddUFunction
,我似乎找不到任何如何使用它的例子。 如果有人可以帮助我或指出我正确的方向,将不胜感激。
为我工作!
沙盒游戏实例.cpp
#include "SandboxGameInstance.h"
#include "WebSocketsModule.h"
#include "IWebSocket.h" // Socket definition
void USandboxGameInstance::Init()
{
Super::Init();
FWebSocketsModule& Module = FModuleManager::LoadModuleChecked<FWebSocketsModule>(TEXT("WebSockets"));
const FString ServerURL = TEXT("ws://127.0.0.1:3000/"); // Your server URL. You can use ws, wss or wss+insecure.
const FString ServerProtocol = TEXT("ws"); // The WebServer protocol you want to use.
TSharedPtr<IWebSocket> Socket = FWebSocketsModule::Get().CreateWebSocket(ServerURL, ServerProtocol);
// We bind to the events
Socket->OnConnected().AddUFunction(this, FName("OnSocketConnection"));
Socket->OnConnectionError().AddUFunction(this, FName("OnSocketConnectionError"));
Socket->OnClosed().AddUFunction(this, FName("OnSocketClosed"));
Socket->OnMessage().AddUFunction(this, FName("OnSocketReceiveMessage"));
Socket->OnMessageSent().AddUFunction(this, FName("OnSocketSentMessage"));
// And we finally connect to the server.
Socket->Connect();
}
void USandboxGameInstance::OnSocketConnection()
{
UE_LOG(LogTemp, Warning, TEXT("CONNECTED"));
}
void USandboxGameInstance::OnSocketConnectionError(const FString& ErrorMessage)
{
UE_LOG(LogTemp, Warning, TEXT("ERROR"));
}
void USandboxGameInstance::OnSocketClosed(int32 StatusCode, const FString& Reason, bool WasClean)
{
UE_LOG(LogTemp, Warning, TEXT("CLOSED"));
}
void USandboxGameInstance::OnSocketReceiveMessage(const FString& Message)
{
UE_LOG(LogTemp, Warning, TEXT("RECEIVED"));
}
void USandboxGameInstance::OnSocketSentMessage(const FString& Message)
{
UE_LOG(LogTemp, Warning, TEXT("SENT"));
}
沙盒游戏实例.h
#pragma once
#include "CoreMinimal.h"
#include "Engine/GameInstance.h"
#include "SandboxGameInstance.generated.h"
UCLASS()
class SANDBOX_API USandboxGameInstance : public UGameInstance
{
GENERATED_BODY()
public:
virtual void Init() override;
UFUNCTION()
void OnSocketConnection();
UFUNCTION()
void OnSocketConnectionError(const FString& ErrorMessage);
UFUNCTION()
void OnSocketClosed(int32 StatusCode, const FString& Reason, bool WasClean);
UFUNCTION()
void OnSocketReceiveMessage(const FString& Message);
UFUNCTION()
void OnSocketSentMessage(const FString& Message);
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.