質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

1回答

2243閲覧

UnityOSCで複数台の端末と送受信する方法を探しています。

shin_0525_jik

総合スコア11

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

1クリップ

投稿2016/08/23 08:36

編集2016/08/24 09:32

ProcessingのAndroidModeで作成したモバイルアプリと、PC上で動かすUnityの間でデータの送受信をしたいと考えています。

Unityは1台のPC上で動かし、モバイルアプリをインストールした複数のアンドロイド端末がUnityとデータの送受信を行うといった形です。

Processing側ではKetaiライブラリを用いることで端末のIPアドレスが取得できたため、このIPアドレスを必要に応じて各端末がUnityへ送信し、Unityから特定の端末に対してデータを送信しようとしています。

Unity側で、C#を用いて(1)のようなプログラムを組みました。

(2)は、UnityOSC_masterの中にあるOSCHandler.csのInit()内部を少し書き換えたものです。

ListenToOSC()で何かしらのデータ(IPアドレス)を受け取ると同時にOSCHandler.Instance.Init()を呼び出し、引数にそのIPアドレスを渡して再び初期化することが狙いです。

しかし引数にIPアドレスを渡してOSCHandler.Instance.Init()を呼び出しても、通信に用いるIPアドレスが変化しません。

Start()の中で呼び出した1回目のOSCHandler.Instance.Init()で引き渡したIPアドレスがそのまま引き継がれているようです。

引数としてIPアドレスを渡して再びOSCHandlerのインスタンスを書き換えるにはどのようにすればよろしいでしょうか。

あるいはOSCHandler.Instance.Init()がプログラム中一度しか使えない場合、送受信する相手となる端末を変えるためにIPアドレスを変更するためにはどのようにするべきでしょうか。

初心者のため説明不足な点が多々あり、理解不足の点もあると思いますが、よろしくお願いします。

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

※エラー自体は発生しませんでした。 ※OSCHandler.Instance.Init()を呼び出した最初の1回目は正しく動作し、2回目以降は引数などに関わらずインスタンスが最初の値を保持したままとなっています。

###該当のソースコード

(1) public class test : MonoBehaviour{ // 誰にも該当しない適当なIPアドレスを初期値として代入 public string newIP = "192.168.00.00"; // 使用するポートの文字列 public string sendUserPort = ":10000"; // newIPとsendUserPortを連結させてデータ送信時に使用する public string sendUserComp = ""; private Dictionary<string, ServerLog> servers; void Start(){ OSCHandler.Instance.Init(newIP); server = new Dictionary<string, ServerLog>(); } void Update(){ // sendUserCompは、「受信したIPアドレス:10000」という文字列 sendUserComp = string.Concat(newIP, sendUserPort); if(センサーが反応したら){ OSCHandler.Instance.SendMessageToClient ("targetAndroid", sendUserComp, 送るデータ); } } void ListenToOSC(){ foreach(KeyValuePair<string, ServerLog> item in servers){ if(item.Value.log.Count>0){ newIP = item.Value.packets [lastPacketIndex].Data [0].ToString (); // 端末からIPアドレスを受信するたびにOSCHandler.Instance.Init()を呼び出して再設定したいが・・・ OSCHandler.Instance.Init (newIP); servers = new Dictionary<string, ServerLog>(); } } (2) // UnityOSCのOSCHandler.csのInit関数部分のみ変更 : : public void Init(string newIP){ //端末から送られてきたIPアドレスを引数として受け取ってここを書き換えたい CreateClient("targetAndroid", IPAddress.Parse(newIP), 10000); //受信用 CreateServer("someAndroid", 10001); } : :

###試したこと
・(1)の中の public string newIP = 192.168.00.00 の部分を、送受信したい端末のIPアドレスに書き換えると正しく動作します。このことから、Init()を最初に呼び出したときは正しく動作していると考えています。

###補足情報(言語/FW/ツール等のバージョンなど)
・参考にしたのは以下のサイトです。
NEAREAL様

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

新しいIPアドレスを使うたびに、UnityOSCに標準で組み込まれているOnApplicationQuit関数を実行し、再びInit関数を実行することで新たな経路のインスタンスを生成することができました。

投稿2016/11/14 05:51

shin_0525_jik

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問