カスタムクラス¶
注釈
以下に説明することは高度な機能です。プラグインのC++ソースコードを編集する必要があります。
リレーメッセージはStrix Relay Argを受け取りますが、開発者はStrixを介して送信するための独自クラスを定義したいかもしれません。
Strixの関数を介してカスタムクラスを送信することは可能ですが、適切なクラスとマクロを使用する必要があります。少しの作業で、既存のクラスをリレー関数で使用するためのStrix互換クラスに書き換えることができます。
Strix互換クラス¶
// Class must extend strix::net::object::Object.
class ChatMessage : public strix::net::object::Object
{
public:
// The STRIX_CLASS macro takes the class and its superclass,
// and additional macros.
// STRIX_CLASS(ClassType, SuperClass)
STRIX_CLASS(ChatMessage, Object)
(
// Defines the ID of this class. Should be unique. The Java style import path is used here.
// STRIX_CLASS_ID(id)
STRIX_CLASS_ID("jp.co.soft_gear.strix.server.core.message.ChatMessage")
// STRIX_PROPERTY macros take the name of a member of the class.
// These define these variables as class properties, which is important
// for serialization in the network.
// STRIX_PROPERTY(MemberName)
STRIX_PROPERTY(sender)
STRIX_PROPERTY(message)
)
// Getter and setter methods for the message information.
void SetMessage(std::string msg)
{
message = msg;
}
std::string GetMessage()
{
return message;
}
void SetSender(std::string snd)
{
sender = snd;
}
std::string GetSender()
{
return sender;
}
private:
// Member variables, as used in the STRIX_PROPERTY macros above.
std::string sender;
std::string message;
};
以下の変更が必要です。
Strixと互換性のある全てのクラスは、strix::net::object::Objectを拡張する必要があります。これは、Strixのオブジェクトを表す基本クラスです。
STRIX_CLASSマクロをクラス定義内に追加する必要があります。その中で次の2つのことを行います。
STRIX_CLASS_IDに、このクラスの一意のIDを定義します。
STRIX_PROPERTYマクロに、クラスのメンバー変数を引数として指定し、それをこのクラスのプロパティとして登録します。
制限が1つあります。Strixがシリアル化/逆シリアル化を行えるのは単純型のみだという点です。このカスタムクラスでは、メンバー変数はstd::stringであり、これはStrixで扱えます。他のカスタムタイプをそれ以上分解せずに扱う方法は、カスタムクラスをシリアル化する方法を参照してください。
カスタムクラスメッセージの送信¶
Strix互換クラスは、通常どおりStrixの関数を介して送信できます。
RelayChatMessage(const UObject* WorldContextObject, int32 channelId, const FStrixRoomRelayDelegate& successCallback, const FStrixErrorCodeFailureDelegate& failureCallback)
{
// Get the network facade.
UStrixNetworkFacade* strixNetwork = UStrixNetworkFacade::GetInstance(WorldContextObject);
// Get the room context.
auto context = strixNetwork->GetRoomContextByChannelId(channelId);
if (context)
{
// Make a custom message and set its values.
auto chatMessage = std::make_shared<ChatMessage>();
chatMessage->SetMessage("Hello World");
chatMessage->SetSender("Me");
// Send the room Relay message.
context->SendRoomRelay(chatMessage,
[=](strix::client::ingame::network::RoomRelayEventArgs args)
{
successCallback.ExecuteIfBound(channelId);
},
[failureCallback](strix::client::ingame::network::RoomContextFailureEventArgs args)
{
failureCallback.ExecuteIfBound(args.GetErrorCode(), StrixErrorCodeConverter::ConvertStrixErrorCategoryToUEEnum(args.GetErrorCategory()));
}
);
}
else
{
failureCallback.ExecuteIfBound(StrixUESDKErrorCode::RoomContextDoesNotExist, EStrixErrorCategory::StrixUESDK);
}
}
カスタムクラスメッセージの受信¶
同様に、カスタムクラスは、クライアントによってハンドラー関数内で逆シリアル化できます。
// Room Relay delegate. This is to delegate the handling of the message to a Blueprint.
DECLARE_DYNAMIC_DELEGATE_OneParam(FStrixRoomRelayNotificationDelegate, FString, Message);
void RegisterStrixChatNotificationHandler(const UObject * WorldContextObject, const FStrixRoomRelayNotificationDelegate& handler, int32 channelId)
{
// Get the network facade.
UStrixNetworkFacade* strixNetwork = UStrixNetworkFacade::GetInstance(WorldContextObject);
// Get room context.
auto context = strixNetwork->GetRoomContextByChannelId(channelId);
if (context != nullptr)
{
// Get the match room client.
auto matchRoomClient = context->GetMatchRoomClient();
if (matchRoomClient)
{
// Add a handler function for when a Relay message is received.
matchRoomClient->AddRoomRelayNotifiedHandler([=](strix::client::core::NotificationEventArgs<strix::client::room::message::RoomRelayNotificationPtr> args)
{
// Get the chat message from the notification data.
auto message = std::static_pointer_cast<ChatMessage>(args.m_data->GetMessageToRelay());
if (!message)
{
return;
}
// Get its information, converting to FStrings.
FString messageText = UTF8_TO_TCHAR(message->GetMessage().c_str());
FString sender = UTF8_TO_TCHAR(message->GetSender().c_str());
// Call handler with the message as the argument.
if (args.m_data->GetRoomId() == matchRoomClient->GetRoomData()->GetRoom()->GetPrimaryKey())
{
handler.ExecuteIfBound(sender + ": " + messageText);
}
});
}
}
}
注釈
STRIX_PROPERTYマクロは、シリアル化可能なプロパティにのみ使用できます。シリアル化とカスタムタイプのシリアル化の詳細については、カスタムクラスをシリアル化する方法を参照してください。