Groupモジュールを使うことで他のモジュール(Roomなど)とは独立したチャネルを作ることができます。
このエントリではDiarkisのUnreal Engine 4(UE4)用プラグインを使ってGroupを作成し、実際にメッセージを送信してみます。
目次
- サンプルプログラムの実行方法
- Groupモジュールの利用方法
- ランダムにグループに参加する
- グループへの参加を検知する(グループ参加中のみ)
- グループからの退出を検知する(グループ参加中のみ)
- メッセージをブロードキャストする(グループ参加中のみ)
サンプルプログラムの実行方法

こちらよりサンプルプログラムをダウンロードし実行してください。
最初にDiarkis Cloudとの接続画面が表示されるので、必要な情報を入力し接続してください(詳しくはこちらのエントリを参照してください)。
接続が成功するとSelect Featureと書かれた画面が表示されるので、Group Demosを選択してください。
Group Demos(上記画像参考)ではGroupモジュールに関するデモを試すことができます(今回のデモは一つしかありません)。
1. Join Random Group Demoを選択し、次に表示された画面でJoinのボタンを押すとランダムなグループに参加します(グループが存在しなければ新規作成します)。

グループへの参加が成功するとJoining groupと書かれた画面(上記画像参考)が表示されます。
メッセージをセットしてBroadcastボタンを押すことで、同じグループに参加している他のプレイヤーすべてにメッセージが送信されます。
Groupモジュールの利用方法
ここからはプラグインの使い方を実際のソースコードを交えて解説します。
プラグインの機能にアクセスするには、DiarkisGroupBaseのクラスを継承する必要があります(詳しくは前回のエントリを参照してください)。
今回のエントリでは便宜上、以下の名前を派生クラスとして使います。
// 実際は自由なクラス名をつけてください
DiarkisInterfaceBaseを継承したクラス:CustomDiarkisInterface
DiarkisGroupBaseを継承したクラス:CustomDiarkisGroup
CustomDiarkisInterfaceの実装
DiarkisInterfaceBaseを継承してCustomDiarkisInterfaceを作成します。
コンストラクタの中で、CustomDiarkisGroupを持たせるようにします。
#include "DiarkisInterfaceBase.h"
class CustomDiarkisInterface : public DiarkisInterfaceBase
{
public:
CustomDiarkisInterface(std::string host, std::string clientKey, uint64_t uid, LogOutType out);
virtual ~CustomDiarkisInterface() {};
};
#include "CustomDiarkisInterface.h"
#include "CustomDiarkisGroup.h" // CustomDiarkisGroupのインクルード(後に解説)。
CustomDiarkisInterface::CustomDiarkisInterface(std::string host, std::string clientKey, uint64_t uid, LogOutType out)
: DiarkisInterfaceBase(host, clientKey, uid, out)
{
this->groupBase = make_shared<CustomDiarkisGroup>(); // Groupモジュールを上書き
}
最後にDiarkisInterfaceBaseインスタンスの代わりにCustomDiarkisInterfaceインスタンスを作成するようにします(この部分は前回と同様です)。
+ #include "CustomDiarkisInterface.h"
bool AMyClass::Connect(const FString& Host, const FString& ClientKey, int64 UID, bool bUseUdp)
{
...
...
- this->diarkis = MakeShared<DiarkisInterfaceBase>(this, host, clientKey, (uint64_t) UID, LogOutType::FILE_OUT); // 削除
+ this->diarkis = MakeShared<CustomDiarkisInterface>(this, host, clientKey, (uint64_t) UID, LogOutType::FILE_OUT);
this->diarkis->WaitUntilReady();
...
...
}
CustomDiarkisGroupの実装
DiarkisGroupBaseを継承してCustomDiarkisGroupを作成します。この時各種コールバック関数(OnGroupCreation ~ OnGroupMemberBroadcast)をオーバーライドします。
class CustomDiarkisGroup : public DiarkisGroupBase
{
public:
CustomDiarkisGroup() {};
virtual ~CustomDiarkisGroup() {};
protected:
// 各種コールバック関数をオーバーライド
void OnGroupCreation(DiarkisTransportType transportType, const DiarkisGroupEventArgs& e) override;
void OnGroupJoin(DiarkisTransportType transportType, const DiarkisGroupEventArgs& e) override;
...
...
...
void OnGroupMemberBroadcast(DiarkisTransportType transportType, const DiarkisPayloadEventArgs& e) override;
};
ランダムにグループに参加する
ランダムにグループに参加するには、まずDiarkisInterfaceBase::SetupGroupを呼び出してGroupモジュールを初期化します。
次に、DiarkisInterfaceBase::RandamJoinGroupを呼び出します。
void AMyClass::SendJoinRandomGroup()
{
this->diarkis->SetupGroup(false);
this->diarkis->RandamJoinGroup();
}
RandamJoinGroupの実行結果はCustomDiarkisGroupのOnGroupCreationもしくはOnGroupJoin関数が呼ばれることで取得できます。
void CustomDiarkisGroup::OnGroupCreation(DiarkisTransportType transportType, const DiarkisGroupEventArgs& e)
{
DiarkisGroupBase::OnGroupCreation(transportType, e);
bool isSuccess = e.IsSuccess();
}
void CustomDiarkisGroup::OnGroupJoin(DiarkisTransportType transportType, const DiarkisGroupEventArgs& e)
{
DiarkisGroupBase::OnGroupJoin(transportType, e);
bool isSuccess = e.IsSuccess();
}
グループへの参加を検知する(グループ参加中のみ)
現在参加しているグループに新規のユーザーが入ってくるとOnGroupMemberJoin関数が呼ばれます。
void CustomDiarkisGroup::OnGroupMemberJoin(DiarkisTransportType transportType, const DiarkisPayloadEventArgs& e)
{
DiarkisGroupBase::OnGroupMemberJoin(transportType, e);
}
グループからの退出を検知する(グループ参加中のみ)
現在参加しているグループからユーザーが退出するとOnGroupMemberLeave関数が呼ばれます。
void CustomDiarkisGroup::OnGroupMemberLeave(DiarkisTransportType transportType, const DiarkisPayloadEventArgs& e)
{
DiarkisGroupBase::OnGroupMemberLeave(transportType, e);
}
メッセージをブロードキャストする(グループ参加中のみ)
DiarkisInterfaceBase::SendBroadcastToGroupはグループに参加している全ユーザーにメッセージを送信します。
void AMyClass::SendBroadcastMessageToGroup(const FString& Message)
{
std::string msg = std::string(TCHAR_TO_UTF8(*Message));
this->diarkis->SendBroadcastToGroup(msg, true);
}
SendBroadcastToGroupには以下の引数を渡します。
msg:送信するメッセージ。
reliable:RUDPで送るかどうか(トランスポート層にUDP指定時のみ)。
SendBroadcastToGroupの実行結果はOnGroupMemberBroadcast関数が呼ばれることで取得できます。この時、先頭の8バイトはユーザーIDを表します。
void CustomDiarkisGroup::OnGroupMemberBroadcast(DiarkisTransportType transportType, const DiarkisPayloadEventArgs& e)
{
DiarkisGroupBase::OnGroupMemberBroadcast(transportType, e);
std::vector<uint8_t> payload = e.GetPayload();
// the first 8 bytes is uid
const uint8_t* ptr = payload.data();
uint64_t uid = *(uint64_t*) ptr;
// remove uid
payload.erase(payload.begin(), payload.begin() + sizeof(uint64_t));
// convert to string
std::string msg = std::string((char*) payload.data(), payload.size());
}