unityプロジェクト(PC)とunityプロジェクト(oculus)での通信

実現したいこと

pc上で実行したunityプロジェクトからandroidアプリ向けにビルドしoculus questで実行したunityプロジェクトにテキストを送信したい

前提

oculusでVRアプリケーションを作っています.別プロジェクトからテキスト送信ができたらよいなと思い,こちらを参考にTCP通信を試しました.しかし,PC上でのプロジェクト間通信はうまくいくものの,oculusとpcでの通信はできませんでした.
同一のネットワーク上で試しています.

試したこと

参考サイトのコードを試しました.

C#

1using System;2using System.Net.Sockets;3using System.Text;4using UnityEngine;5 6/// <summary>7/// TCP 通信を行うクライアント側のコンポーネント8/// </summary>9public class Client : MonoBehaviour 10{11 //================================================================================12 // 変数13 //================================================================================14 // この IP アドレスとポート番号はサーバ側と統一すること15 public string m_ipAddress = "127.0.0.1";16 public int m_port = 2001;17 18 private TcpClient m_tcpClient;19 private NetworkStream m_networkStream;20 private bool m_isConnection;21 22 private string m_message = "ピカチュウ"; // サーバに送信する文字列23 24 //================================================================================25 // 関数26 //================================================================================27 /// <summary>28 /// 初期化する時に呼び出されます29 /// </summary>30 private void Awake()31 {32 try 33 {34 // 指定された IP アドレスとポートでサーバに接続します35 m_tcpClient = new TcpClient( m_ipAddress, m_port );36 m_networkStream = m_tcpClient.GetStream();37 m_isConnection = true;38 39 Debug.LogFormat( "接続成功" );40 }41 catch ( SocketException )42 {43 // サーバが起動しておらず接続に失敗した場合はここに来ます44 Debug.LogError( "接続失敗" );45 }46 }47 48 /// <summary>49 /// GUI を描画する時に呼び出されます50 /// </summary>51 public void OnGUI()52 {53 // Awake 関数で接続に失敗した場合はその旨を表示します54 if ( !m_isConnection )55 {56 GUILayout.Label( "接続していません" );57 return;58 }59 60 // サーバに送信する文字列61 m_message = GUILayout.TextField( m_message );62 63 // 送信ボタンが押されたら64 if ( GUILayout.Button( "送信" ) )65 {66 try 67 {68 // サーバに文字列を送信します69 var buffer = Encoding.UTF8.GetBytes( m_message );70 m_networkStream.Write( buffer, 0, buffer.Length );71 72 Debug.LogFormat( "送信成功:{0}", m_message );73 }74 catch ( Exception )75 {76 // サーバが起動しておらず送信に失敗した場合はここに来ます77 // SocketException 型だと例外のキャッチができないようなので78 // Exception 型で例外をキャッチしています79 Debug.LogError( "送信失敗" );80 }81 }82 }83 84 /// <summary>85 /// 破棄する時に呼び出されます86 /// </summary>87 private void OnDestroy()88 {89 // 通信に使用したインスタンスを破棄します90 // Awake 関数でインスタンスの生成に失敗している可能性もあるので91 // null 条件演算子を使用しています92 m_tcpClient?.Dispose();93 m_networkStream?.Dispose();94 95 Debug.Log( "切断" );96 }97}

C#

1using System.Net;2using System.Net.Sockets;3using System.Text;4using System.Threading.Tasks;5using UnityEngine;6 7/// <summary>8/// TCP 通信を行うサーバ側のコンポーネント9/// </summary>10public class Server : MonoBehaviour 11{12 //================================================================================13 // 変数14 //================================================================================15 // この IP アドレスとポート番号はクライアント側と統一すること16 public string m_ipAddress = "127.0.0.1";17 public int m_port = 2001;18 19 private TcpListener m_tcpListener;20 private TcpClient m_tcpClient;21 private NetworkStream m_networkStream;22 23 private string m_message = string.Empty; // クライアントから受信した文字列24 25 //================================================================================26 // 関数27 //================================================================================28 /// <summary>29 /// 初期化する時に呼び出されます30 /// </summary>31 private void Awake()32 {33 // クライアントから文字列を受信する処理を非同期で実行します34 // 非同期で実行しないと接続が終了するまで受信した文字列を UI に表示できません35 Task.Run( () => OnProcess() );36 }37 38 /// <summary>39 /// クライアント側から通信を監視し続けます40 /// </summary>41 private void OnProcess()42 {43 var ipAddress = IPAddress.Parse( m_ipAddress );44 m_tcpListener = new TcpListener( ipAddress, m_port );45 m_tcpListener.Start();46 47 Debug.Log( "待機中" );48 49 // クライアントからの接続を待機します50 m_tcpClient = m_tcpListener.AcceptTcpClient();51 52 Debug.Log( "接続完了" );53 54 // クライアントからの接続が完了したので55 // クライアントから文字列が送信されるのを待機します56 m_networkStream = m_tcpClient.GetStream();57 58 while ( true )59 {60 var buffer = new byte[256];61 var count = m_networkStream.Read( buffer, 0, buffer.Length );62 63 // クライアントからの接続が切断された場合は64 if ( count == 0 )65 {66 Debug.Log( "切断" );67 68 // 通信に使用したインスタンスを破棄して69 OnDestroy();70 71 // 再度クライアントからの接続を待機します72 Task.Run( () => OnProcess() );73 74 break;75 }76 77 // クライアントから文字列を受信した場合は78 // GUI とログに出力します79 var message = Encoding.UTF8.GetString( buffer, 0, count );80 m_message += message + "\n";81 82 Debug.LogFormat( "受信成功:{0}", message );83 }84 }85 86 /// <summary>87 /// GUI を描画する時に呼び出されます88 /// </summary>89 private void OnGUI()90 {91 // クライアントから受信したすべての文字列を表示します92 GUILayout.TextArea( m_message );93 }94 95 /// <summary>96 /// 破棄する時に呼び出されます97 /// </summary>98 private void OnDestroy()99 {100 // 通信に使用したインスタンスを破棄します101 m_networkStream?.Dispose();102 m_tcpClient?.Dispose();103 m_tcpListener?.Stop();104 }105}

発生している問題・エラーメッセージ

接続が失敗する.→ andoroidアプリにビルドして実行しているのが原因かもしれない.
androidでビルド&実行したものとPC上で実行したプロジェクト間でのTCP通信のサンプル等があれば教えて頂きたいです.

補足情報(FW/ツールのバージョンなど)

oculus quest
unity hub :3.4.1
unity editor :2021.3.22f1

コメントを投稿

0 コメント