커스텀 클래스

참고

다음은 고급 기능으로, C++ 코드 편집이 필요합니다.

릴레이 메시지는 Strix Relay Args를 그대로 취하지만, 개발자가 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 매크로는 클래스 정의 안에서 추가해야 합니다.

  3. STRIX_CLASS_ID는 이 클래스에서 고유한 ID로 정의해야 합니다.

  4. STRIX_PROPERTY 매크로는 클래스의 변수를 인수로 취하여 이 클래스의 속성으로 등록합니다.

단, 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 매크로는 직렬화가 가능한 속성에만 이용할 수 있습니다. 직렬화와 커스텀 타입 직렬화에 관한 설명은 커스텀 클래스 직렬화 방법을 참조해 주십시오.