夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

BlenderのPythonでサーバーを立てMessagePackでメッシュを送信する MixedRealityModelingToolsその③Unity側のTCPクライアントの処理

本日は昨日に引きつづき自身が開発中のパッケージMixedRealityModelingTools(仮)の機能紹介を行います。

昨日はBlender側でMessagePackを使用したメッシュデータの送信までを見ていきました。

本日はUnity側でデータの受信について紹介します。

〇MixedRealityModelingTools(仮)とは?

MixedRealityModelingTools(仮)は筆者が開発しているBlenderとUnityの相互通信を想定したパッケージです。

Blender側ではアドオンとして提供、Unity側ではプラットフォーム依存がないような形でUPM形式での配布を行っています。

github.com

現在はメッシュデータの送信ができるといったツールとしてはごくごく初期のプロトタイプの段階となっています。

〇Unityがわでメッシュデータを受け取る

開発環境は以下になります。

・Unity 2021.3.5f1

・MessagePack for C# v2.5124

github.com

また今回はプラットフォーム依存をできるだけなくすために開発及び配布パッケージ自体はURPではなくクラシックなビルドインパイプラインを使用しています。

〇Unity側でのTCPクライアント

UnityでTCPクライアントを作成するコードは以下になります。

using System;
using System.Net.Sockets;
using System.Threading;
using MessagePack;

・・・
    public void StartConnection()
        {
            _client = new TcpClient(_ipAddress, _port);
            _stream = _client.GetStream();

            // Start a new thread to listen for incoming messages
            new Thread(() =>
            {
                var responseBytes = new byte[33554432]; // サイズを大きくしてデータを適切に受け取る
                while (true)
                {
                    var bytesRead = _stream.Read(responseBytes, 0, responseBytes.Length);
                    // Get Blender rawData
                    Debug.Log(
                        $"Received {bytesRead} bytes: {BitConverter.ToString(responseBytes, 0, bytesRead).Replace("-", " ")}");

                    if (bytesRead == 0) break;
                  
                }
            }).Start();
            UpdateConnectionStatus();
        }

・・・

_ipAddressは接続するBlender側のデバイスiPアドレス、ポートは任意のものを使用しています。

ここでは次のようにメインスレッドを避けて処理をしています。これによってフリーズを避けています。

            new Thread(() =>
            {
                var responseBytes = new byte[33554432]; // サイズを大きくしてデータを適切に受け取る
                while (true)
                {
                    var bytesRead = _stream.Read(responseBytes, 0, responseBytes.Length);
                    // Get Blender rawData
                    Debug.Log(
                        $"Received {bytesRead} bytes: {BitConverter.ToString(responseBytes, 0, bytesRead).Replace("-", " ")}");

                    if (bytesRead == 0) break;
                  
                }
            }).Start();

初めに responseBytes でデータを受け取るための枠であるバイト数を定義しています。ここはリソースを確保するためにできるだけ大きいほうが一度に大量のメッシュデータなどを受け取ることができます。

while文の中でループ処理を行いここでもしデータを受け取った場合にログで出力しています。

 var bytesRead = _stream.Read(responseBytes, 0, responseBytes.Length);
                    // Get Blender rawData
                    Debug.Log(
                        $"Received {bytesRead} bytes: {BitConverter.ToString(responseBytes, 0, bytesRead).Replace("-", " ")}");

                    if (bytesRead == 0) break;

以上がUnity側のクライアントの処理になります。

次回は実際の受け取ったデータの表示法を見ていきます。