夜風のMixedReality

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

Blenderでサーバーを立ててUnityと通信を行う

本日はBlenderとUnityで通信を行います。

Blenderはモデリングや動画編集だけでなくPythonを使用してスクリプトを実行することができます。

今回はBlenderでサーバーを立てUntiy側で通信を行っていきます。

〇環境

・Windows 11PC ×2

・Blender3.4

・Unity 2021.3.5f1

〇PythonでのUDP通信

今回は私の師であるがちもとさん(@sotonggach)にアドバイスをいただきながら進めました。

以下はがちもとさんの記事になります。

qiita.com

今回はこの記事を応用してBlenderでサーバーを立ててUnityと通信を行っていきます。

〇Blenderでサーバーを立てる

①Blenderを開きスクリプトウィンドウを起動します。

また[新規]からスクリプトを作成します。

②次のスクリプトをペーストします。

import bpy
import socket
import threading

def server_thread(sock):
    # データを受信する
    while True:
        data, address = sock.recvfrom(4096)
        if not data:
            break

        # 受信したデータを表示する
        print(f'Received data from {address}: {data.decode()}')

# ソケットを作成する
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# サーバーアドレスを設定する
server_address = ('Blenderを起動しているPCのIPアドレス', 5005)
sock.bind(server_address)

# サーバースレッドを作成して開始する
t = threading.Thread(target=server_thread, args=(sock,))
t.daemon = True
t.start()

基本的な仕組みはがちもとさんの記事と同じですが、Blenderで実行できるようにbpyを使用し、かつthreading を使用して非同期処理にすることで実行時にBlenderの画面が止まってしまわないようにしています。

③Blender側で実行します。

エラー等がなければ正常に実行されています。

〇Unity側のコード

Unity側では以下のコードを書きゲームオブジェクトにアタッチします。

なおコード内にBlender側のPCのアドレスを入力する必要があります。

using System.Net.Sockets;
using System.Net;
using System.Text;
using UnityEngine;


public class ConnectBlender: MonoBehaviour
{
    private UdpClient udpClient;
    private IPEndPoint endPoint;

    private void Start()
    {
        udpClient = new UdpClient();
        endPoint = new IPEndPoint(IPAddress.Parse("Blender側PCのIPアドレス"), 5005);
    }

    private void Update()
    {
        // キーを押すたびにデータを送信する(デモ用)
        if (Input.GetKeyDown(KeyCode.Space))
        {
            SendColorData(new Color(Random.value, Random.value, Random.value)); 
        }
    }

    private void SendColorData(Color color)
    {
        string data = $"{color.r},{color.g},{color.b}";
        byte[] dataBytes = Encoding.UTF8.GetBytes(data);
        udpClient.Send(dataBytes, dataBytes.Length, endPoint);
    }

    private void OnDestroy()
    {
        udpClient.Close();
    }
}

〇Blenderで建てたサーバーにUnity側からアクセスする

Unity側を実行し、スペースキーを押すことでBlenderのコンソール画面にランダムな値が表示されるようになります。

スペースキーを押した際に上画像のようなログが出れば通信が正常に行えています。

ファイアウォールなどでうまく接続ができない場合はBlenderを実行するPCでモバイルホットスポット機能を利用しサーバーを立てたPCをルーターとしてUnityを実行するPCのネットワークを構築することで正常に動くようになります。 

本日は以上になります。