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

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

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

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

Q&A

0回答

2000閲覧

Unity 2D:フラグ管理について

Gluek731

総合スコア26

C#

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

0グッド

1クリップ

投稿2016/11/18 08:27

編集2016/11/21 15:47

どうも、Unityについて勉強中の者です。

現在、TCP/IP通信を用いてUnity側へ特定の操作を要求するプログラムを組んでおります。

その要求は「指定された数字を送り、その番号に対応するキャラクターを消す」処理です。

TCP/IPでUnityへ操作を送るプログラムは完成し、現在操作を送るとキャラが段階を踏んで消えるという処理までできています。

ですが、他のキャラクターに対応させてみてもうまくいかず、フラグ管理がうまくいかない状態になり、どうしても分からなくなったので書き込みました。

※***の部分はIPアドレスです
TCP/IP通信でUnity側に操作を要求するコード

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Windows.Forms; 9 10/*通信宣言*/ 11using System.Net; 12using System.Net.Sockets; 13using System.IO; 14 15/*スレット*/ 16using System.Threading.Tasks; 17 18 19/*送信側のプログラム 20 基本こっちが親サーバになるので 21 こっちが支持を出す*/ 22namespace TCPserver 23{ 24 public partial class Form1 : Form 25 { 26 //別スレットを使うときデリゲートを使う 27 private delegate void DelegateSetText(string str); 28 29 private StreamReader sr; 30 private StreamWriter sw; 31 32 public Form1() 33 { 34 InitializeComponent(); 35 } 36 37 private void Form1_Load(object sender, EventArgs e) 38 { 39 /* 40 //ネットワークの設定 41 //自分のIPアドレス,ポート番号 42 IPEndPoint ep = new IPEndPoint(IPAddress.Parse("***.***.***.***"),8888); 43 TcpListener listener = new TcpListener(ep); 44 listener.Start(); 45 TcpClient client = listener.AcceptTcpClient(); 46 */ 47 48 /*タスクの実行*/ 49 Task.Factory.StartNew(() => WaitConnect()); 50 51 } 52 53 /*ネットワーク設定用タスク*/ 54 private void WaitConnect() 55 { 56 /*ネットワークの設定*/ 57 /*自分のIPアドレス,ポート番号*/ 58 IPEndPoint ep = new IPEndPoint(IPAddress.Parse("***.***.***.***"), 8888); 59 TcpListener listener = new TcpListener(ep); 60 listener.Start(); 61 TcpClient client = listener.AcceptTcpClient(); 62 63 NetworkStream ns = client.GetStream(); 64 sr = new StreamReader(ns); //読み込み 65 sw = new StreamWriter(ns, Encoding.UTF8); //文字コードを指定して送信 66 sw.AutoFlush = true; //一行書き込んだら送信する 67 68 /*マルチスレットを立ち上げる*/ 69 Task.Factory.StartNew(() => Recive()); 70 } 71 72 private void Recive() 73 { 74 string str = string.Empty; 75 do 76 { 77 str = sr.ReadLine(); 78 if (str == null) 79 { 80 break; 81 } 82 //txtDisp.Text = str; 83 Invoke(new DelegateSetText(SetText), str); //テキストに書き込むスレットを呼び出す 84 } while (true); 85 } 86 87 private void SetText(string str) 88 { 89 txtDisp.Text += str + "\r\n"; 90 } 91 92 private void btnSend_Click(object sender, EventArgs e) 93 { 94 if (sw != null) 95 { 96 if (txtSend.Text != null) 97 { 98 sw.WriteLine(txtSend.Text); 99 } 100 } 101 txtSend.Text = null; 102 } 103 104 105 } 106}

Unity側でTCP/IP通信にて受け取った処理を行う

C#

1using System; 2using UnityEngine; 3using System.Collections; 4/*通信宣言*/ 5using System.Net; 6using System.Net.Sockets; 7using System.IO; 8using System.Text; 9/*スレット*/ 10using System.Threading; 11 12public class testTCP : MonoBehaviour 13{ 14 15 private bool Colorflg = true; 16 private bool Enemyflg = false; 17 private bool Enemyflg2 = false; 18 public GameObject myCube; 19 public Sprite[] Dusts; 20 21 private Thread TCP_Thread; 22 23 private StreamReader sr; //受信? 24 private StreamWriter sw; //送信? 25 26 // Use this for initialization 27 void Start() 28 { 29 //青色に変更 30 this.GetComponent<Renderer>().material.EnableKeyword("_EMISSION"); 31 this.GetComponent<Renderer>().material.SetColor("_EmissionColor", Color.red); 32 33 TCP_Thread = new Thread(threadWork); 34 TCP_Thread.Start(); 35 } 36 37 // Update is called once per frame 38 void Update() 39 { 40 41 SpriteRenderer renderer = gameObject.GetComponent<SpriteRenderer> (); 42 43 44 if (Enemyflg) { 45 if(renderer.sprite == Dusts [2]){ 46 } 47 if (renderer.sprite == Dusts [1]) { 48 renderer.sprite = Dusts [2]; 49 Debug.Log (Enemyflg); 50 Enemyflg = false; 51 } 52 if (renderer.sprite == Dusts [0]) { 53 renderer.sprite = Dusts [1]; 54 Debug.Log (Enemyflg); 55 Enemyflg = false; 56 } 57 58 } 59 60 if (Enemyflg2) { 61 if(renderer.sprite == Dusts [2]){ 62 } 63 if (renderer.sprite == Dusts [1]) { 64 renderer.sprite = Dusts [2]; 65 Debug.Log (Enemyflg2); 66 Enemyflg2 = false; 67 } 68 if (renderer.sprite == Dusts [0]) { 69 renderer.sprite = Dusts [1]; 70 Debug.Log (Enemyflg2); 71 Enemyflg2 = false; 72 } 73 } 74 } 75 76 //------------------------------------------------------------ 77 // job process on thread 78 //------------------------------------------------------------ 79 private void threadWork() 80 { 81 while (true) 82 { 83 /*ネットワーク設定用タスク*/ 84 /*ネットワークの設定*/ 85 /*自分のIPアドレス,ポート番号*/ 86 IPEndPoint ep = new IPEndPoint(IPAddress.Parse("***.***.***.***"), 8888); 87 TcpClient client = new TcpClient(); 88 89 /*サーバーに接続できたかの判定*/ 90 /*trycatch文 91 try文の中でcatchに書かれた例外が発生した場合 92 残りの処理をせずにcatch文に遷移していく*/ 93 try 94 { 95 client.Connect(ep); //接続の開始 Connect(繋ぐ) 96 Debug.Log("接続された"); 97 98 NetworkStream ns = client.GetStream(); 99 sr = new StreamReader(ns); //読み込み 100 sw = new StreamWriter(ns, Encoding.UTF8); //文字コードを指定して送信 101 sw.AutoFlush = true; //一行書き込んだら送信する 102 103 Recive(); 104 } 105 catch (Exception e) 106 { 107 Debug.Log(e.Message); //接続できなかった場合の処理 108 } 109 } 110 } 111 112 //受信する関数 113 private void Recive() 114 { 115 string str = string.Empty; 116 do 117 { 118 str = sr.ReadLine(); 119 120 if (str == null) 121 { 122 break; 123 } 124 //txtDisp.Text = str; 125 Debug.Log(str); 126 //Containsメソッド ()内の文字列が含まれていればtrueを返す 127 Debug.Log(str.Contains("1")); 128 Debug.Log(str.Contains("2")); 129 //Colorflgはbool型の変数 130 Colorflg = str.Contains("a"); 131 Enemyflg = str.Contains("1"); 132 Enemyflg2 = str.Contains("2"); 133 Debug.Log(Enemyflg); 134 Debug.Log (Enemyflg2); 135 } while (true); 136 } 137 138}

文字列を送信して、それに対応した操作をするように組んでいます。

EnemyFlgはbool型の変数で、TrueならUpdate()側でスプライトを入れ替える操作をさせてる感じです。

片方のフラグが通ったらもう片方のフラグがデバッグ中に通らなくなってしまったりと、原因がわからずにいます。

支持を受けとって操作する側のコードがおかしいのか、そもそも処理の仕方そのものがおかしいのかわからずにいます。

何かこうしたほうがいいとか、ここがおかしいなどのアドバイスや処理の一例としてコードを書き加えていただけると助かります。

追記:Unityで特定のオブジェクトを指定し、そこにInspector側で設定したSpriteを差し替えることは出来るのでしょうか?

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問