夜風のMixedReality

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

UnityでWebsocketを使ってみる

本日はUnity調査枠です。

 個人的な興味でマルチデバイスでの通信を学んでいます。UnityではPhotonを使用することで簡単にマルチユーザーやマルチデバイスを実装できますが今回はPhotonを使用しない方法で通信を実現します。

redhologerbera.hatenablog.com

〇Websocketとは?

WebsocketはWebでの双方向通信を行う仕組みを指すようです。

qiita.com

Photonに比べサーバーを建てる必要がありますが、Webや他のデバイスなどとの通信もできるようです。筆者は今回初めて触っていきます。

〇導入ーUnityで通信

①GitHubから[websocket-sharp]を入手します。

github.com

②ダウンロードし展開した[]をUnityで使用するためには一度VisualStudioを使用してビルドを行う必要があります。[websocket-sharp.sln]を開きます。

f:id:Holomoto-Sumire:20220129090647p:plain

③ダイアログが表示された場合[OK]を選択します。

f:id:Holomoto-Sumire:20220129090845p:plain

④[ソリューションエクスプローラー]から[Example]を削除します。

f:id:Holomoto-Sumire:20220129091111p:plain

⑤[Debug]→[Release]へ切り替え[ソリューションのビルド]を実行します。

f:id:Holomoto-Sumire:20220129091304p:plain

⑥websocket-sharp-master/websocket-sharp/bin/Releaseに[websocket-sharp.dll]が生成されていた場合成功になります。

f:id:Holomoto-Sumire:20220129091605p:plain

⑦[websocket-sharp.dll]をUnityのProjectウィンドウにインポートします。ここではPluginというファイルを作成して配置しています。

f:id:Holomoto-Sumire:20220129091830p:plain

以上でWebsocketの導入が完了しました。

次にUnityの実装を行います。

〇スクリプト

今回は参考として挙げたサイトさんのコードを変数だけ変えてそのまま使用しています。

using UnityEngine;
using System.Collections;
using WebSocketSharp;

public class ClientExample : MonoBehaviour
{
    private WebSocket _webSocket;

    private const string WEBSOCKET_URL = "ws://(PCのIPアドレス):8080";

  
    private void Start()
    {
        _webSocket = new WebSocket(WEBSOCKET_URL);
        Debug.Log(_webSocket);
        _webSocket.OnMessage += (sender, e) => Debug.Log(e.Data);
        _webSocket.OnClose += (sender, e) => Debug.Log("Close");

        _webSocket.Connect();
    }

    private void Update()
    {
        if(Input.GetKeyDown(KeyCode.S))
            _webSocket.Send("Send a message");
    }

    private void OnDestroy()
    {
        _webSocket.Close();
        _webSocket = null;
    }
}

WEBSOCKET_URLはIPアドレスを入力します。またポートに関しては筆者環境では3000が使用できなかったため8080を使用しています。

次に通信を受け取る側です。こちらも参考にさせていただいたサイトさんをほぼ流用しています。

using UnityEngine;
using System.Collections;
using WebSocketSharp;
using WebSocketSharp.Server;

public class ServerExample : MonoBehaviour
{
    private WebSocketServer _server;

    private void Start()
    {
        _server = new WebSocketServer(8080);
        _server.AddWebSocketService<Echo>("/");
        _server.Start();
    }

    private void OnDestroy()
    {
        _server.Stop();
        _server = null;
    }

    public class Echo : WebSocketBehavior
    {
        protected override void OnMessage(MessageEventArgs e)
        {
            Sessions.Broadcast(e.Data);
            Debug.Log(e.Data);
        }
    }
}

上記のスクリプトを2つのUnityプロジェクトのシーンに配置します。

2つのUnityプロジェクトを使用する意味は違うアプリ(環境)で通信を行う必要があるためです。

両方のプロジェクトでエディタを実行しSキーを入力することで両方のプロジェクトのconsoleウィンドウにメッセージが表示されます。

f:id:Holomoto-Sumire:20220129195543p:plain

以上でローカル環境でですがWebsocketが使用できました。

〇参考

【Unity】Websocket-sharpで通信する|Hiko|note