株式会社Diarkis

トップ > 技術ブログ > Unreal Engine 4でのGroupモジュールの利用方法

Unreal Engine 4でのGroupモジュールの利用方法

Groupモジュールを使うことで他のモジュール(Roomなど)とは独立したチャネルを作ることができます。

このエントリではDiarkisのUnreal Engine 4(UE4)用プラグインを使ってGroupを作成し、実際にメッセージを送信してみます。

目次

サンプルプログラムの実行方法

Group Demosの画面

こちらよりサンプルプログラムをダウンロードし実行してください。

最初にDiarkis Cloudとの接続画面が表示されるので、必要な情報を入力し接続してください(詳しくはこちらのエントリを参照してください)。

接続が成功するとSelect Featureと書かれた画面が表示されるので、Group Demosを選択してください。

Group Demos(上記画像参考)ではGroupモジュールに関するデモを試すことができます(今回のデモは一つしかありません)。

1. Join Random Group Demoを選択し、次に表示された画面でJoinのボタンを押すとランダムなグループに参加します(グループが存在しなければ新規作成します)。

Group参加中の画面

グループへの参加が成功すると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());
}

大規模マルチユーザー間通信をDiarkisが実現します

お問い合わせ
このエントリーをはてなブックマークに追加

この記事もおすすめ

Diarkisをもっと知りたい、採用を検討したい場合は以下よりお問い合わせください

お問い合わせ 資料請求
PAGE TOP