カスタムクラス

注釈

以下に説明することは高度な機能です。プラグインの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;
};

以下の変更が必要です。

  1. Strixと互換性のある全てのクラスは、strix::net::object::Objectを拡張する必要があります。これは、Strixのオブジェクトを表す基本クラスです。

  2. STRIX_CLASSマクロをクラス定義内に追加する必要があります。その中で次の2つのことを行います。

  3. STRIX_CLASS_IDに、このクラスの一意のIDを定義します。

  4. 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マクロは、シリアル化可能なプロパティにのみ使用できます。シリアル化とカスタムタイプのシリアル化の詳細については、カスタムクラスをシリアル化する方法を参照してください。