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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

Unity

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

Q&A

解決済

2回答

2161閲覧

UDP通信の接続先を選択できるようにしたい

marumaru0303

総合スコア1

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

Unity

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

0グッド

0クリップ

投稿2020/07/10 07:56

編集2020/07/10 08:23

前提・実現したいこと

最近UnityとC#でプログラミングの勉強をはじめました。

UDP通信をやってみようと思い、下記参考にして通信はできるようになりました。
http://www.ams.eng.osaka-u.ac.jp/user/ishihara/?p=1931

そこで複数の接続先をUI上で切り替えたいと思い
プログラム上で入力したIPアドレスを、ボタンをトリガーにして別のIPアドレスに変更できるようにしたいです。

ボタンを押すと設定しておいたIPがremoteHostに入力され、
テキストに今remoteHostに入っている文字を表示させるようにしてみましたが、
テキスト上の文字が変わっても実際の接続先が変わりません。

remoteHostを上書きするだけじゃ接続先を切り替えられないのでしょうか?

どんな単語を調べれば良いかも分からず、どう実装すれば良いかわかりません、、、
よろしくお願いいたします

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System.Text; 5using System.Net; 6using System.Net.Sockets; 7using System.Threading; 8using UnityEngine.UI; 9 10 11public class UDP 12{ 13 private UdpClient udpForSend; 14 private string remoteHost = "デフォルトのIP";//送信先 15 private int remotePort; 16 17 private UdpClient udpForReceive; 18 public string rcvMsg = "ini"; 19 private System.Threading.Thread rcvThread; 20 21 public string RemoteHost 22 { 23 get { return remoteHost; } 24 set { remoteHost = value; } 25 } 26 27 public UDP() 28 { 29 30 } 31 32 public bool init(int port_snd, int port_to, int port_rcv) 33 { 34 try 35 { 36 udpForSend = new UdpClient(port_snd); 37 remotePort = port_to; 38 udpForReceive = new UdpClient(port_rcv); 39 rcvThread = new System.Threading.Thread(new System.Threading.ThreadStart(receive)); 40 return true; 41 } 42 catch 43 { 44 return false; 45 } 46 } 47 48 public void send(string sendMsg) 49 { 50 try 51 { 52 byte[] sendBytes = Encoding.ASCII.GetBytes(sendMsg); 53 udpForSend.Send(sendBytes, sendBytes.Length, remoteHost, remotePort); 54 } 55 catch { } 56 } 57 58 public void receive() 59 { 60 IPEndPoint remoteEP = null; 61 while (true) 62 { 63 try 64 { 65 byte[] rcvBytes = udpForReceive.Receive(ref remoteEP); 66 Interlocked.Exchange(ref rcvMsg, Encoding.ASCII.GetString(rcvBytes)); 67 } 68 catch { } 69 } 70 } 71 72 public void start_receive() 73 { 74 try 75 { 76 rcvThread.Start(); 77 } 78 catch { } 79 } 80 81 public void stop_receive() 82 { 83 try 84 { 85 rcvThread.Interrupt(); 86 } 87 catch { } 88 } 89 90 public void end() 91 { 92 try 93 { 94 udpForReceive.Close(); 95 udpForSend.Close(); 96 rcvThread.Abort(); 97 } 98 catch { } 99 } 100} 101 102 103public class UDPManager : MonoBehaviour 104{ 105 public Text IPText; 106 107 private void Start() 108 { 109 var UDP = new UDP(); 110 IPText.text = UDP.RemoteHost;//getを使って取得している 111 } 112 113 public void toY_button_Clik() 114 115 { 116 var UDP = new UDP(); 117 UDP.RemoteHost = "IP候補1";//setを使って代入している 118 IPText.text = UDP.RemoteHost;//getを使って取得している 119 } 120 121 public void toA_button_Clik() 122 123 { 124 var UDP = new UDP(); 125 UDP.RemoteHost = "IP候補2";//setを使って代入している 126 IPText.text = UDP.RemoteHost;//getを使って取得している 127 128 } 129 130}

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System.Text; 5using System.Net; 6using System.Net.Sockets; 7using System.Threading; 8using UnityEngine.UI; 9 10 11public class UDP_button_Manager : MonoBehaviour 12 { 13 public Text receiveText; 14 15 private UDP commUDP = new UDP(); 16 private bool sendSwitch = false; 17 private bool receiveSwitch = false; 18 19 private void Start() 20 { 21 commUDP.init(8887, 9001, 9000);//(送信用ポート番号、送信先ポート番号、受信用ポート番号) 22 receiveText.text = "Test"; 23 } 24 25 private void Update() 26 { 27 if (receiveSwitch) 28 { 29 receiveText.text = commUDP.rcvMsg; 30 } 31 } 32 33 public void wifiSend() 34 { 35 if (sendSwitch == false) 36 { 37 sendSwitch = true; 38 commUDP.send("ぽ"); 39 40 } 41 else 42 { 43 sendSwitch = false; 44 commUDP.send("め"); 45 46 } 47 48 } 49 50 51 public void WiFiReceive() 52 { 53 if (receiveSwitch == false) 54 { 55 receiveSwitch = true; 56 commUDP.start_receive(); 57 58 59 } 60 else 61 { 62 receiveSwitch = false; 63 commUDP.stop_receive(); 64 } 65 66 } 67 68 69 }

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

StartやtoY_button_Clikなどでそれぞれ新しいUDPクラスを作成していますがそれがまずいでは?
Startでの処理対象のUDPクラスとtoY_button_Clik、toA_button_Clikで処理するUDPクラスがそれぞれで違うものになっていますよ。

実際に通信する為にUDPクラスを呼び出している部分がないので分かりませんが、そちらとも別のUDPクラスとなっているのではないでしょうか。

修正された質問を見ましたが、やはり実際に通信を行っているUDPクラスと通信先を設定しようとしているUDPクラスは別物ですね。

投稿2020/07/10 08:11

編集2020/07/10 08:26
YAmaGNZ

総合スコア10489

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

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

marumaru0303

2020/07/10 08:30

public class UDP内に public class UDPManagerやpublic class UDP_button_Manager内の処理を書く必要があるということでしょうか?
YAmaGNZ

2020/07/10 08:40

そうではなくUDP_button_Managerで作成したUDPクラスのcommUDPのRemoteHostを変更しないとデータの送信先が変わりません。 ですので、どうにかしてUDP_button_ManagerのcommUDPをUDPManagerに知らせてやるか UDPManagerのUDPクラスをUDP_button_Managerに知らせてやって、使用するUDPクラスを1つにしなくてはなりません。 そのあたりは、「別スクリプトにデータを渡すには」みたいな質問が一杯あったりしますので参考になるかと思います。
marumaru0303

2020/07/14 05:59

別スクリプトにデータを渡す方法としてでてきた参照渡しやGetComponentなど調べて試してみましたがうまくいかず、、、 結局UDPManager内にIP切り替えとデータの送受信のコードを入れて解決しました。 ”” ( public void Click() { if (IPSwitch == false) { IPSwitch = true; commUDP.RemoteHost = “IP1”; } else { IPSwitch = false; commUDP.RemoteHost = "1Ip2”; } }) ”” 今後切り替えたいIPやボタンの操作が増えた時を考えてスクリプトを分けたかったのですが、時間がかかってしまいそうなので 接続先を切り替えるということはできたので一旦これについては解決にしておきます ありがとうございました もしこういうやり方があるなど追加でヒントいただければ助かります
guest

0

public void send(string sendMsg)

どこからも実行されていないようですが

投稿2020/07/10 08:10

y_waiwai

総合スコア88042

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

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

marumaru0303

2020/07/10 08:24

すみません、別のスクリプトから実行してたのですが漏れてたので追加しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問