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

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

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

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

Q&A

0回答

3353閲覧

Unity2D : スクリプトから画像を変更するには

Gluek731

総合スコア26

C#

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

0グッド

1クリップ

投稿2016/11/25 10:28

編集2016/11/25 11:00

以前、スクリプトから画像を変更しようとして詰まっています。

Unity2Dをいろいろ勉強して、Sence内のスプライトをクリックして、画像を変更したりするのはできました。

ですが、それ以外の方法で画像を変えることができないのです。具体的には「表示されてるスプライトごとに番号を振り分け、その番号を入力したら対応したスプライトが切り替わる」

という方法を適用したいと思っています。これがなかなかうまくいかず、
どうやって分けたらいいかわからず苦戦しています

↓外部からのTCP通信を受信する関数↓

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

↓画像を変えるscript。これがあと3種類あります↓

C#

1 2using UnityEngine; 3using System.Collections; 4 5public class HokoriChange : MonoBehaviour { 6 7 public Sprite[] Dust; 8 SpriteRenderer spriteRenderer; 9 10 // Use this for initialization 11 void Start () { 12 13 } 14 15 public void Hokori_Change () { 16 //Debug.Log (spriteRenderer); 17 Debug.Log ("HokoriChange通った"); 18 spriteRenderer = gameObject.GetComponent<SpriteRenderer> (); 19 if (spriteRenderer.sprite == Dust [2]) { 20 Destroy (gameObject); 21 } 22 if (spriteRenderer.sprite == Dust [1]) { 23 spriteRenderer.sprite = Dust [2]; 24 } 25 if(spriteRenderer.sprite == Dust[0]){ 26 spriteRenderer.sprite = Dust [1]; 27 } 28 } 29} 30

1枚目のソースコードのUpdate部分で、外部からTCP/IP通信で受け取ったstring型の変数を使って、1,2,3という風にswitch文で分けています。

何回かビルドを繰り返したのですが、1個しかうまく通らず、しかもビルドを通す度に毎回違う箇所が通ったり通らなかったりします。

これはコード側の問題なのか通信側で異常があるのか、今のところ手詰まりです。

更に、DustChange d= GetComponent<DustChange>();という風に、外部で作ったスクリプトを宣言できるようにしているのですが、なぜか他の二つも通る時と通らないときがあって、もうさっぱりです。

だれか代案やアドバイスを頂けたら嬉しいです。

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

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

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

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

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

sakura_hana

2016/11/26 07:28

質問1.testTCP内のUpdate()のswitchは想定通りの動作をしていますか?(「1が通ったよ」などのログは正常に出ていますか?) 質問2.「何回かビルドを繰り返したのですが、1個しかうまく通らず、しかもビルドを通す度に毎回違う箇所が通ったり通らなかったりします。」これは具体的にどういう状態でしょうか?
Gluek731

2016/11/26 16:42

質問1のアンサー:ログは正常に出ています。宣言した関数の中身もしっかり処理されていました 質問2:Update内でGetComponentを用いて各オブジェクトの画像を編集する関数を呼び出しているのですが、3つめのオブジェクトだけ処理が正常に行われて他の2個はNullReferenceExceptionのエラーを吐かれる状態です。各分岐点に宣言したh.k,dの中身を監視するログを置いているのですが、dとhがnullになっていました。
sakura_hana

2016/11/28 06:21

各スクリプトはどのようにオブジェクトに付いていますか? GetComponentしているということはtestTCP、DustChange、HouseChangeが同じオブジェクトにあると推測されますが、これは想定通りでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問