Unreal Engine 5 WebSocket プラグイン統合

BlueprintWebSocket 実装ガイド • ダウンロード元 Fab マーケットプレイス

概要

BlueprintWebSocket は Unreal Engine 向けの高度な非同期ネットワーキングプラグインです。WebSocket ネットワークアーキテクチャを使用して外部サーバーとのリアルタイム双方向データ転送を可能にし、以下に特化して最適化されています: Unreal Engine 5 環境内でのリアルタイムマルチプレイヤーロビー、高頻度チャットシステム、ライブテレメトリループの構築.

プラグインを以下からダウンロードしてください: Fab マーケットプレイス 、現在のワークスペースにリアルタイムネットワーキング要素を初期化します。

ブループリント

WebSocket サーバーへの接続

レイテンシヘルパーノードを使用すると、アクティブなネットワークソケットに接続し、自動実行チェーンをすぐに実行できます:

ヘルパーノードを使用して WebSocket 接続をマッピングするブループリントスクリプトレイアウト

カスタムロジック構造の場合は、明示的なソケットインスタンスを作成して、コールバックイベントをイベントグラフディスパッチャに直接フックします:

手動デリゲート割り当てで接続する高度な Unreal Engine ブループリント

データの送信

構造文字列メッセージを WebSocket バッファにルーティングするブループリントノード構成

エラー時の自動再接続

ベースラインノードシーケンス内で再試行パラメータを定義することで、ドロップアウトを自動的に処理します:

接続状態回復ループを管理するブループリントネットワーキングノードグループ

C++

モジュールの追加

ソースビルド構成ファイル (<ProjectName>.Build.cs) を開き、コンパイル命令リストにモジュール依存関係を追加します:

PublicDependencyModuleNames.Add("BlueprintWebSocket");

インクルード

ラッパーヘッダーをクラスファイルに配置して、インターフェース型を公開します:

#include "BlueprintWebSocketWrapper.h"

新しい WebSocket の作成

プラグインファクトリメソッドを使用してヒープ割り当てをインスタンス化します:

UBlueprintWebSocket* const WebSocket = UBlueprintWebSocket::CreateWebSocket();

WebSocket の構成

接続ハンドシェイクルーチンを呼び出す前に、トランスポートメタデータ構造と認証ヘッダーを変更します:

// 提供されたマップを現在のヘッダーリストとマージします。
WebSocket->SetHeaders(const TMap<FString, FString> & InHeaders);

// ヘッダーリストにキー / 値のペアを追加します。
WebSocket->AddHeader(const FString & Header, const FString & Value);

// ヘッダーリストからヘッダーを削除します
WebSocket->RemoveHeader(const FString & HeaderToRemove);

コールバックでイベントをリッスンする

関数ターゲットを非同期デリゲートにバインドして、ネットワーク応答の状態変更を安全に受信します:

イベント名 シグネチャ 説明
OnConnectedEvent void Func() WebSocket サーバーに正常に接続したときに呼び出されます。
OnConnectionErrorEvent void Func(const FString & Error) WebSocket サーバーへの接続に失敗したときに呼び出されます。
OnCloseEvent void Func(int64 StatusCode, const FString & Reason, bool bWasClean) サーバーとの接続が閉じられたときに呼び出されます。
OnMessageEvent void Func(const FString & Message) 文字列メッセージを受信したときに呼び出されます。
OnRawMessageEvent void Func(const TArray<uint8> & Data, int32 BytesRemaining) バイナリメッセージを受信したときに呼び出されます。
OnMessageSentEvent void Func(const FString & Message) メッセージを送信した直後に呼び出されます。

これらのフックは Dynamic Multicast Delegatesを使用するため、バインドされたリスナー関数は UFUNCTION() 装飾マクロを持ち、エンジン呼び出しスタック内で表示され続ける必要があります:

UCLASS()
class MYGAME_API UMyClass : public UObject
{
    GENERATED_BODY()
public:
    // イベントをバインドするために使用する関数
    void BindEvents();
private:
    // コールバック
    UFUNCTION() void OnConnected();
    UFUNCTION() void OnConnectionError(const FString & Error);
    UFUNCTION() void OnClosed(int64 StatusCode, const FString & Reason, bool bWasClean);
    UFUNCTION() void OnMessage(const FString & Message);
    UFUNCTION() void OnRawMessage(const TArray<uint8> & Data, int32 BytesRemaining);
    UFUNCTION() void OnMessageSent(const FString & Message);
private:
    UPROPERTY()
    UBlueprintWebSocket* WebSocket;
};

void UMyClass::BindEvents()
{
    // イベントをバインドして、イベントがトリガーされたときに関数が呼び出されるようにします。
    WebSocket->OnConnectedEvent      .AddDynamic(this, &UMyClass::OnConnected);
    WebSocket->OnConnectionErrorEvent.AddDynamic(this, &UMyClass::OnConnectionError);
    WebSocket->OnCloseEvent          .AddDynamic(this, &UMyClass::OnClosed);
    WebSocket->OnMessageEvent        .AddDynamic(this, &UMyClass::OnMessage);
    WebSocket->OnRawMessageEvent     .AddDynamic(this, &UMyClass::OnRawMessage);
    WebSocket->OnMessageSentEvent    .AddDynamic(this, &UMyClass::OnMessageSent);
}

注意: 接続する前に、使用するすべてのイベントをバインドすることをお勧めします。

WebSocket サーバーへの接続

明示的なエンドポイント URI と通信プロトコルサブ文字列を接続処理ループに直接渡します:

WebSocket->Connect(TEXT("ws://127.0.0.1:8080/"), TEXT("ws"));

機能ステータスチェッカーを介して状態フレームをインラインでクエリします:

if (WebSocket->IsConnected())
{
    // 接続されています。
}
else
{
    // 接続されていません。
}

注意: 接続の処理には IsConnected() に依存せず、 OnConnectedEvent コールバックに依存する必要があります。

メッセージの送信

構造化文字列または直接メモリバッファを使用して情報をダウンストリームに送信します:

  1. void SendMessage(const FString & Message): テキスト/JSON データ形式を渡すため。
  2. void SendRawMessage(const TArray<uint8> & Message, const bool bIsBinary): 圧縮構造またはアセットファイルをプッシュするため。

実装サンプル:

// 送信したいデータ。プログラムで取得できます。
const FString       StringMessage = TEXT("Hello Server");
const TArray<uint8> BinaryMessage = { 0, 1, 2, 3, 4, 5 };

// WebSocket を介して送信します。
WebSocket->SendMessage   (StringMessage);
WebSocket->SendRawMessage(BinaryMessage);

完全な例

MyClass.h

#pragma once

#include "CoreMinimal.h"
#include "MyClass.generated.h"

class UBlueprintWebSocket;

/**
 * WebSocket を使用するカスタムクラス。
 **/
UCLASS()
class MYGAME_API UMyClass : public UObject
{
    GENERATED_BODY()
public:
    void InitializeAndConnectSocket();
private:
    UFUNCTION() 
    void OnConnected();
    UFUNCTION() 
    void OnConnectionError(const FString & Error);
    UFUNCTION() 
    void OnClosed(int64 StatusCode, const FString & Reason, bool bWasClean);
    UFUNCTION() 
    void OnMessage(const FString & Message);
    UFUNCTION()
    void OnRawMessage(const TArray<uint8> & Data, int32 BytesRemaining);
    UFUNCTION()
    void OnMessageSent(const FString & Message);
private:
    UPROPERTY()
    UBlueprintWebSocket* WebSocket;
};

MyClass.cpp

#include "MyClass.h"
#include "BlueprintWebSocketWrapper.h"

void UMyClass::InitializeAndConnectSocket()
{
    WebSocket = UBlueprintWebSocket::CreateWebSocket();
    
    WebSocket->OnConnectedEvent      .AddDynamic(this, &UMyClass::OnConnected);
    WebSocket->OnConnectionErrorEvent.AddDynamic(this, &UMyClass::OnConnectionError);
    WebSocket->OnCloseEvent          .AddDynamic(this, &UMyClass::OnClosed);
    WebSocket->OnMessageEvent        .AddDynamic(this, &UMyClass::OnMessage);
    WebSocket->OnRawMessageEvent     .AddDynamic(this, &UMyClass::OnRawMessage);
    WebSocket->OnMessageSentEvent    .AddDynamic(this, &UMyClass::OnMessageSent);

    WebSocket->AddHeader(TEXT("SomeHeader"), TEXT("SomeValue"));
    WebSocket->Connect(TEXT("ws://127.0.0.1:8080/"), TEXT("ws"));
}

void UMyClass::OnConnected()
{
    UE_LOG(LogTemp, Log, TEXT("We are connected!"));
    WebSocket->SendMessage(TEXT("Hello Server!"));
}

void UMyClass::OnConnectionError(const FString & Error)
{
    UE_LOG(LogTemp, Error, TEXT("Failed to connect: %s."), *Error);
}

void UMyClass::OnClosed(int64 StatusCode, const FString & Reason, bool bWasClean)
{
    UE_LOG(LogTemp, Warning, TEXT("Connection closed: %d:%s. Clean: %d"), StatusCode, *Reason, bWasClean);
}

void UMyClass::OnMessage(const FString & Message)
{
    UE_LOG(LogTemp, Log, TEXT("New message: %s"), *Message);
}

void UMyClass::OnRawMessage(const TArray<uint8> & Data, int32 BytesRemaining)
{
    UE_LOG(LogTemp, Log, TEXT("New binary message: %d bytes and %d bytes remaining."), Data.Num(), BytesRemaining);
}

void UMyClass::OnMessageSent(const FString & Message)
{
    UE_LOG(LogTemp, Log, TEXT("We just sent %s to the server."), *Message);
}

トラブルシューティング

接続に失敗しました: SSL エラー: ローカル発行者の証明書を取得できません

このネットワークセキュリティ問題は、完全にクックされたゲーム配布内のプラットフォームバンドルから公開検証ルート認証局が省略されているために発生します。以下の手順で配布パッケージの整合性を解決してください:

  1. アクティブな認証局ファイル (.pem 形式) をプロジェクトソースパスに配置します: <Project>/Content/Certificates/cacert.pem.
  2. 以下を介してターゲットサブディレクトリをプラットフォームパッケージャに公開します: プロジェクト設定 >パッケージング >コピーする追加の非アセットディレクトリ リスト配列。

サポート

機能の推奨事項や機能サポートの更新については、以下でコアエンジニアリングデスクに直接開発者リクエストチケットを開いてください: pandores.marketplace@gmail.com.