커스텀 클래스¶
참고
다음은 고급 기능으로, 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;
};
다음과 같이 변경해야 합니다.
Strix와 호환되는 클래스는 strix::net::object::Object를 확장해야 합니다. 이것이 Strix에서 개체를 나타내는 기본 클래스가 됩니다.
STRIX_CLASS 매크로는 클래스 정의 안에서 추가해야 합니다.
STRIX_CLASS_ID는 이 클래스에서 고유한 ID로 정의해야 합니다.
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 매크로는 직렬화가 가능한 속성에만 이용할 수 있습니다. 직렬화와 커스텀 타입 직렬화에 관한 설명은 커스텀 클래스 직렬화 방법을 참조해 주십시오.