ルーム情報を表示して参加する方法¶
マッチング用のルームの情報を一覧表示し、一つを選択して参加するという処理が必要になることがあります。似た例として、マッチング用ルームの情報を確認した上でそこに参加するかどうかを判断するということもあります。例えば次のような場合が考えられます。
募集中のインスタンスダンジョンの一覧(ルームはダンジョンを表します)
ランダムに編成され参加したスクワッドの情報(ルームはスクワッドを表します)
フレンドから届いたパーティーへの勧誘(ルームはパーティーを表します)
求める情報がルームプロパティから取得できると仮定すれば、ルーム情報を表示するためには、そのルームのStrix Room
構造体かStrix Node Room
構造体が必要になります。また、プレイヤーとの対話の後でそのルーム (あるいは、一覧の中の一つのルーム) に参加することになるでしょう。その場合はStrix Node Room Info
構造体が便利です。なぜなら、Strix Node Room Info
構造体があればルームに直接参加できる上、その内部にはStrix Node Room
構造体が含まれているからです。
注釈
Strix Node構造体やStrix Node Room構造体で利用できるルームプロパティについてよく分からない場合は、ルームプロパティをご覧ください。
ルームの一覧を表示する¶
募集中のダンジョンの一覧を表示する際には、通常、適切な条件を指定した上でSearch Node Room
関数を用いることになります。Search Node Room
関数の成功コールバックからはStrix Node Room Info
構造体の配列が(Node Rooms
という名前のイベントパラメーターを通じて)得られますが、そこからStrix Node Room
構造体を取得できます。
今いるルームを取得する¶
すでにルームに参加しているが特定のルームを参照したわけではない (例えば、Join Random Node Room
関数を使用した) 場合には、Get Current Room
関数が現在のルームに対応するStrix Room
構造体を返します。これを用いてルーム情報を表示することができます。
識別情報を用いてNodeRoomを取得する¶
他のプレイヤーに特定のルームに参加するように誘う(または指示する)通常の方法は、ルームの一意識別情報を渡すことです。識別情報としてはNodeRoomの主キー (primaryKey
プロパティ、つまり、Strix Node Room
構造体のId
メンバー変数) を使用できます。その代わりに、ルームの主キー (primaryKeyプロパティ、つまり、Strix Room
構造体のId
メンバー変数) をルームサーバーの識別情報と組み合わせて使用することもできます。ルームの主キーは、NodeRoomのルームID (roomId
プロパティ、つまり、Strix Node Room
構造体のRoomId
メンバー変数と同じです。
注釈
ルームのprimaryKeyプロパティは単一のルームサーバー内では一意的ですが、他のルームサーバーには同一のprimaryKeyを持つ別のルームが存在する可能性があります。複数のルームサーバーを使用する(または、将来使用する可能性がある)のであれば、ルームを一意的に識別するためには、ルームの主キーとルームサーバーの識別情報を組み合わせる必要があります。
識別情報を受け取ったクライアントがルーム情報を表示し、その後そのルームに参加するためには、その識別情報に対応するStrix Node Room Info
構造体を見つける必要があります。これを行うにはC++コードの使用が必要です。
具体的には3通りの手法があります。
NodeRoomの主キーを受け取り、NodeRoomを見つけて参加する。
サーバーのアドレスとルームの主キーを受け取り、NodeRoomを見つけて参加する。
サーバーのアドレスとルームの主キーを受け取り、ルームを見つけて参加する。
主キーからNodeRoomを得る¶
NodeRoomの主キーを一意識別情報として受け取る場合、指定された主キーと一致する主キーを持つNodeRoomを検索することができますが、そのためにはC++で書いたヘルパー関数が必要になります。
このヘルパー関数は、C++ではCreateStrixPrimaryKeyEqualsCondition
、BlueprintではprimaryKey Field Equals
という名前になりますが、これは次の通りです。
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "StrixBlueprintFunctionLibrary.h"
#include "MyBlueprintFunctionLibrary.generated.h"
UCLASS()
class MYPROJECT_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
UFUNCTION(BlueprintPure, Category = "MyBPLibrary|Adapter", meta = (DisplayName = "primaryKey Field Equals"))
static FStrixCondition CreateStrixPrimaryKeyEqualsCondition(int32 primaryKeyValue);
};
#include "MyBlueprintFunctionLibrary.h"
#include <strix/net/object/ObjectAdapter.h>
#include <strix/client/core/model/manager/filter/builder/ConditionBuilder.h>
using namespace strix::net::object;
using namespace strix::client::core::model::manager::filter::builder;
FStrixCondition UMyBlueprintFunctionLibrary::CreateStrixPrimaryKeyEqualsCondition(int32 primaryKeyValue)
{
FStrixCondition condition(ConditionBuilder::Builder()
->Field("primaryKey")->EqualTo(ObjectAdapter((int64)primaryKeyValue))
->Build());
return condition;
}
これを用いると、以下のBlueprintスクリプトによって目的のNodeRoomを取得できます。
上記のBlueprintスクリプトは、Invited Node Room Id
を入力として用い、成功するとルームのStrix Node Room Info構造体をInvited Node Room Infoに格納します。
ルームIDからNodeRoomを得る¶
ルームID (ルームの主キー) とルームサーバーのアドレス (ホスト名、ポート番号、プロトコル) の組み合わせを受け取る場合、roomIdを使ってNodeRoomを検索し一覧を入手した後で、その中から目的のルームサーバー上にあるものを探すことができます。(異なるルームサーバー上に、同じroomIdを持つNodeRoomがあるかもしれないということを思い出してください。)これを行うにはC++で書いた別のヘルパー関数が必要になります。
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "StrixBlueprintFunctionLibrary.h"
#include "MyBlueprintFunctionLibrary.generated.h"
UCLASS()
class MYPROJECT_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
UFUNCTION(BlueprintPure, Category = "MyBPLibrary|Adapter", meta = (DisplayName = "roomId Field Equals"))
static FStrixCondition CreateStrixRoomIdEqualsCondition(int32 roomId);
};
#include "MyBlueprintFunctionLibrary.h"
#include <strix/net/object/ObjectAdapter.h>
#include <strix/client/core/model/manager/filter/builder/ConditionBuilder.h>
using namespace strix::net::object;
using namespace strix::client::core::model::manager::filter::builder;
FStrixCondition UMyBlueprintFunctionLibrary::CreateStrixRoomIdEqualsCondition(int32 roomId)
{
FStrixCondition condition(ConditionBuilder::Builder()
->Field("roomId")->EqualTo(ObjectAdapter((int64)roomId))
->Build());
return condition;
}
上記のBlueprintスクリプトは、Invited Room Id
、Invited Host
、Invited Port
、Invited Protocol
を入力として用い、成功するとルームのStrix Node Room Info
構造体をInvited Node Room Info
に格納します。
ルームIDからルームを得る¶
上で見たように、ルームIDとルームサーバーのアドレスからStrix Node Room Info
構造体を見つけるには少々手間がかかります。それよりもStrix Room
構造体を見つける方が簡単です。
まず、受け取ったアドレスを用いてルームサーバーに接続してから、Search Room
を呼び出してStrix Room
構造体を取得します。その後、同じルームサーバー接続上でルームIDを使用すれば目的のルームに参加できます。上で説明したC++関数CreateStrixPrimaryKeyEqualsCondition
(primaryKey Field Equals
) が必要になります。
上記のBlueprintスクリプトは、Invited Room Id
と、Invited Host
、Invited Port
、Invited Protocol
を入力として用い、成功するとルームのStrix Room
構造体をInvited Room
に格納します。
今いるルームサーバーを得る¶
ところで、複数のルームサーバーのあるクラスターで、例えばCreate Node Room
でルームを作成した場合、どうすれば今いるルームサーバーが分かるのでしょうか?
Blueprintスクリプトでこの情報を得るのは容易ではありませんが、次のC++の関数を使えば取得できます。
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "StrixBlueprintFunctionLibrary.h"
#include "MyBlueprintFunctionLibrary.generated.h"
UCLASS()
class MYPROJECT_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
UFUNCTION(BlueprintCallable, Category = "MyBPLibrary", meta = (WorldContext = "WorldContextObject"))
static void GetCurrentNodeInfo(const UObject* WorldContextObject, int channelId,
FString& host, int32& port, FString& protocol);
};
#include "MyBlueprintFunctionLibrary.h"
#include <strix/net/channel/Protocol.h>
#include <strix/client/ingame/network/RoomServerConnection.h>
void UMyBlueprintFunctionLibrary::GetCurrentNodeInfo(const UObject* WorldContextObject,
int channelId,
FString& host, int32& port, FString& protocol)
{
UStrixNetworkFacade* strixNetworkFacade = UStrixNetworkFacade::GetInstance(WorldContextObject);
if (!strixNetworkFacade) return;
auto roomContext = strixNetworkFacade->GetRoomContextByChannelId(channelId);
if (!roomContext) return;
auto roomConnection = roomContext->GetConnection().lock();
if (!roomConnection) return;
host = FString(UTF8_TO_TCHAR(roomConnection->GetHost().c_str()));
port = roomConnection->GetPortNumber();
protocol = FString(strix::net::channel::ProtocolStringConverter::ToString(roomConnection->GetProtocol()).c_str());
}
このGet Current Node Info
関数は、指定したチャネルIDで現在参加しているルームのあるルームサーバーの、ホスト名、ポート番号、プロトコルを返します。この関数とGet Current Room
関数を一緒に使うと、そのルームを一意に識別し、パーティーの勧誘に使える4つ組を得ることができます。
別のやり方として、その4つ組を使って上記のスクリプトを実行し、現在のルームのNodeRoomを取得して、その主キーをフレンドに渡してもいいでしょう。