Try EMQX Platform on Azure, Enjoy AI Integration and Simplified Billing →

M2MqttUnityライブラリを使用したUnityでのMQTT

EMQX Team
Nov 7, 2024
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プロジェクトを作成します。

New Unity project in UnityHub

その後、ダウンロードしたM2MQTTリポジトリからM2MqttおよびM2MqttUnityフォルダを新しいUnityプロジェクトのAssetsフォルダにコピーします。

Copy the `M2Mqtt` and `M2MqttUnity`

ライブラリには、M2MqttUnity_Testというテストシーンが含まれており、M2MqttUnity/Examples/Scenesフォルダにあります。このシーンを確認すると、MQTTクライアントのセットアップに使用されている唯一のスクリプトはM2MqttUnityTest.csであり、このスクリプトはシーン内のM2MQTT GameObjectにアタッチされています。ただし、このスクリプトはメインフォルダM2Mqttの他のクラスとリンクされています。

接続と購読

Playボタンを押してアプリケーションを実行します。Gameタブには、ブローカーアドレス入力ボックスにデフォルトでオフラインのブローカーが表示されます。事前に準備したパブリックMQTTブローカー(broker.emqx.io)に置き換える必要があります。

Press `Play` to run the application

アドレスを置き換えたら、「Connect」をクリックしてパブリックMQTTブローカーへの接続を確立します。

Click on "Connect"

対応するコードは非常にシンプルです。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を使用して、メッセージのパブリッシュと受信をテストします。

MQTTX Client Tool - MQTTX

接続後、「Test Publish」をクリックします。「Test message」がゲームクライアントとMQTTXの両方で受信されたことが確認できます。

Click on `Test Publish`

"Test message" has been received

対応するコードは、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.");
        }

メッセージの受信

Receive Messages

MQTTXを使用して別のテストメッセージを送信すると、クライアントがそれを受信し、Gameタブに表示されます。

Send another test message

対応するコードは、メッセージをデコード、処理し、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ライブラリを使用したリアルタイムメッセージの受信方法を学ぶことができます。

専門家と話します
お問い合わせ →