M2MqttUnityライブラリを使用したUnityでのMQTT
Unityは、幅広いゲームやシミュレーションを作成するために使用されている人気のゲームエンジンです。MQTTは、パブリッシュ/サブスクライブモデルに基づく軽量なメッセージングプロトコルであり、低帯域幅や不安定なネットワーク環境でのIoTアプリケーション向けに特別に設計されています。
MQTTは、AR(拡張現実)ゲーム、センサーやその他のデバイスを利用したIoT対応ゲーム、ゲームやシミュレーションのリモートコントロールなど、さまざまな目的でUnityで使用できます。例えば、ARゲームでは、ユーザーのデバイスから平面表面の位置、オブジェクト、人、顔の検出など、世界に関する情報を受信するためにMQTTが使用されます。
このブログでは、M2MQTTをUnityで使用するためのシンプルなUnity3dプロジェクトを提供します。プロジェクトには、ブローカーへの接続管理やメッセージングのテスト用のユーザーインターフェースを備えた例のシーンが含まれています。
前提条件
Unityのインストール
Unityのインストーラーは、Unityのウェブサイトから主要なプラットフォーム向けにダウンロードできます。
MQTTブローカーの準備
先に進む前に、通信およびテスト用のMQTTブローカーを用意してください。
このブログ記事では、broker.emqx.io
にある無料のパブリックMQTTブローカーを使用します。
サーバー: broker.emqx.io
TCPポート: 1883
WebSocketポート: 8083
SSL/TLSポート: 8883
セキュアWebSocketポート: 8084
無料のパブリックMQTTブローカーは、MQTTプロトコルを学習およびテストしたい方専用に提供されています。セキュリティリスクやダウンタイムの懸念があるため、本番環境での使用は避けることが重要です。
Unity用のM2MQTT
M2MQTTライブラリは、UnityでM2MQTTを使用するためのシンプルなUnity3dプロジェクトです。ブローカーへの接続管理やメッセージングのテスト用のUIを備えた例のシーンが含まれています。このブログ記事では、例のシーンを使用して、MQTTを利用してMQTTブローカーと通信するアプリケーションを作成する方法を説明します。
まず、GitHubからリポジトリをダウンロードします。
git clone https://github.com/CE-SDV-Unity/M2MqttUnity.git
例のシーンをインポートする
次に、UnityHubで新しいUnityプロジェクトを作成します。
その後、ダウンロードしたM2MQTTリポジトリからM2Mqtt
およびM2MqttUnity
フォルダを新しいUnityプロジェクトのAssets
フォルダにコピーします。
ライブラリには、M2MqttUnity_Test
というテストシーンが含まれており、M2MqttUnity/Examples/Scenes
フォルダにあります。このシーンを確認すると、MQTTクライアントのセットアップに使用されている唯一のスクリプトはM2MqttUnityTest.cs
であり、このスクリプトはシーン内のM2MQTT GameObjectにアタッチされています。ただし、このスクリプトはメインフォルダM2Mqtt
の他のクラスとリンクされています。
接続と購読
Play
ボタンを押してアプリケーションを実行します。Game
タブには、ブローカーアドレス入力ボックスにデフォルトでオフラインのブローカーが表示されます。事前に準備したパブリックMQTTブローカー(broker.emqx.io
)に置き換える必要があります。
アドレスを置き換えたら、「Connect」をクリックしてパブリックMQTTブローカーへの接続を確立します。
対応するコードは非常にシンプルです。broker.emqx.io
への接続を作成し、トピック「M2MQTT_Unity/test」を購読します。
public void SetBrokerAddress(string brokerAddress)
{
if (addressInputField && !updateUI)
{
this.brokerAddress = brokerAddress;
}
}
public void SetBrokerPort(string brokerPort)
{
if (portInputField && !updateUI)
{
int.TryParse(brokerPort, out this.brokerPort);
}
}
public void SetEncrypted(bool isEncrypted)
{
this.isEncrypted = isEncrypted;
}
public void SetUiMessage(string msg)
{
if (consoleInputField != null)
{
consoleInputField.text = msg;
updateUI = true;
}
}
public void AddUiMessage(string msg)
{
if (consoleInputField != null)
{
consoleInputField.text += msg + "\\n";
updateUI = true;
}
}
protected override void OnConnecting()
{
base.OnConnecting();
SetUiMessage("Connecting to broker on " + brokerAddress + ":" + brokerPort.ToString() + "...\\n");
}
protected override void OnConnected()
{
base.OnConnected();
SetUiMessage("Connected to broker on " + brokerAddress + "\\n");
if (autoTest)
{
TestPublish();
}
}
protected override void SubscribeTopics()
{
client.Subscribe(new string[] { "M2MQTT_Unity/test" }, new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE });
}
MQTTメッセージのパブリッシュ
別のクライアントとしてMQTTクライアントツール - MQTTXを使用して、メッセージのパブリッシュと受信をテストします。
接続後、「Test Publish」をクリックします。「Test message」がゲームクライアントとMQTTXの両方で受信されたことが確認できます。
対応するコードは、publish()
関数を使用してトピック「M2MQTT_Unity/test」にメッセージ「Test message」をパブリッシュします。
public void TestPublish()
{
client.Publish("M2MQTT_Unity/test", System.Text.Encoding.UTF8.GetBytes("Test message"), MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, false);
Debug.Log("Test message published");
AddUiMessage("Test message published.");
}
メッセージの受信
MQTTXを使用して別のテストメッセージを送信すると、クライアントがそれを受信し、Game
タブに表示されます。
対応するコードは、メッセージをデコード、処理し、Game
タブに表示します。
protected override void DecodeMessage(string topic, byte[] message)
{
string msg = System.Text.Encoding.UTF8.GetString(message);
Debug.Log("Received: " + msg);
StoreMessage(msg);
if (topic == "M2MQTT_Unity/test")
{
if (autoTest)
{
autoTest = false;
Disconnect();
}
}
}
private void StoreMessage(string eventMsg)
{
eventMessages.Add(eventMsg);
}
private void ProcessMessage(string msg)
{
AddUiMessage("Received: " + msg);
}
protected override void Update()
{
base.Update(); // call ProcessMqttEvents()
if (eventMessages.Count > 0)
{
foreach (string msg in eventMessages)
{
ProcessMessage(msg);
}
eventMessages.Clear();
}
if (updateUI)
{
UpdateUI();
}
}
まとめ
このブログ記事では、Unityを使用してMQTTブローカーと通信するアプリケーションを作成する方法についてのガイドを提供しました。このガイドに従うことで、接続の確立、トピックの購読、メッセージのパブリッシュ、およびM2MQTTライブラリを使用したリアルタイムメッセージの受信方法を学ぶことができます。