繁体   English   中英

如何使用 UE4 C++ 中的参数将 UFunction 添加到接口的委托?

[英]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 ,我似乎找不到任何如何使用它的例子。 如果有人可以帮助我或指出我正确的方向,将不胜感激。

请阅读有关事件的文档

您必须声明 function 签名与 class 中的事件委托的签名匹配,function 指针将被绑定。

在此处输入图像描述

上面的示例图像来自引擎源。

为我工作!

沙盒游戏实例.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM