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

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

ただいまの
回答率

90.35%

  • C#

    9668questions

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

  • Unity2D

    1395questions

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

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,235

Gluek731

score 24

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

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

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

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

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

using System;
using UnityEngine;
using System.Collections;
/*通信宣言*/
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Text;
/*スレット*/
using System.Threading;

public class testTCP : MonoBehaviour
{

    private bool Colorflg = true;
    private string Enemyflg = null;
    private int Enemyflgs = 0;
    public GameObject myCube;
    public Sprite[] Dusts;


    private Thread TCP_Thread;

    private StreamReader sr;        //受信?
    private StreamWriter sw;        //送信?

    // Use this for initialization
    public Sprite GetSprite(string fileName, string spriteName){
        Sprite[] sprites = Resources.LoadAll<Sprite> (fileName);
        return System.Array.Find<Sprite> (sprites, (sprite) => sprite.name.Equals (spriteName));
    }

    void Start()
    {
        //青色に変更
        this.GetComponent<Renderer>().material.EnableKeyword("_EMISSION");
        this.GetComponent<Renderer>().material.SetColor("_EmissionColor", Color.red);
        GameObject Dust = GameObject.Find ("Dust.Nomal(1)");
        GameObject House = GameObject.Find ("House_Nomal");
        GameObject Hokori = GameObject.Find ("Hokori_Nomal");
        TCP_Thread = new Thread(threadWork);
        TCP_Thread.Start();




    }

    // Update is called once per frame
    void Update()
    {
        //SpriteRenderer renderer = gameObject.GetComponent<SpriteRenderer> ();

        DustChange d= GetComponent<DustChange>();
        HouseChange h = GetComponent<HouseChange>();
        HokoriChange k = GetComponent<HokoriChange>();


        switch (Enemyflg) {
        case "1":
            d = GetComponent<DustChange>();
            Debug.Log ("1が通ったよ");
            Debug.Log (d);
            //d.Dust_Change ();
            break;
        case "2":
            Debug.Log ("2が通ったよ");
            Debug.Log (h);
            //h.House_Change ();
            break;
        case "3":
            Debug.Log ("3が通ったよ");
            Debug.Log (k);
            //k.Hokori_Change ();
            break;
        default :
            break;
        }

        Enemyflg = null;
    }

    //------------------------------------------------------------
    // job process on thread
    //------------------------------------------------------------
    private void threadWork()
    {
        while (true)
        {
            /*ネットワーク設定用タスク*/
            /*ネットワークの設定*/
            /*自分のIPアドレス,ポート番号*/
            IPEndPoint ep = new IPEndPoint(IPAddress.Parse("***.***.**.***"), 8888);
            TcpClient client = new TcpClient();

            /*サーバーに接続できたかの判定*/
            /*trycatch文
              try文の中でcatchに書かれた例外が発生した場合
              残りの処理をせずにcatch文に遷移していく*/
            try
            {
                client.Connect(ep);     //接続の開始 Connect(繋ぐ)
                Debug.Log("接続された");

                NetworkStream ns = client.GetStream();
                sr = new StreamReader(ns);  //読み込み
                sw = new StreamWriter(ns, Encoding.UTF8);   //文字コードを指定して送信
                sw.AutoFlush = true;    //一行書き込んだら送信する

                Recive();
            }
            catch (Exception e)
            {
                Debug.Log(e.Message);   //接続できなかった場合の処理
            }
        }
    }

    //受信する関数
    private void Recive()
    {
        string str = string.Empty;
        do
        {
            str = sr.ReadLine();

            if (str == null)
            {
                break;
            }
            //txtDisp.Text = str;
            Debug.Log(str);
            //Containsメソッド ()内の文字列が含まれていればtrueを返す
            //Colorflgはbool型の変数
            Enemyflg = str;
            //Enemyflgs = (int)str;
        } while (true);
    }

}

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

using UnityEngine;
using System.Collections;

public class HokoriChange : MonoBehaviour {

    public Sprite[] Dust;
    SpriteRenderer spriteRenderer;

    // Use this for initialization
    void Start () {

    }

    public void Hokori_Change () {
        //Debug.Log (spriteRenderer);
        Debug.Log ("HokoriChange通った");
        spriteRenderer = gameObject.GetComponent<SpriteRenderer> ();
        if (spriteRenderer.sprite == Dust [2]) {
            Destroy (gameObject);
        }
        if (spriteRenderer.sprite == Dust [1]) {
            spriteRenderer.sprite = Dust [2];
        }
        if(spriteRenderer.sprite == Dust[0]){
            spriteRenderer.sprite = Dust [1];
        }
    }
}

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

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • sakura_hana

    2016/11/26 16:28

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

    キャンセル

  • Gluek731

    2016/11/27 01:42

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

    キャンセル

  • sakura_hana

    2016/11/28 15:21

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

    キャンセル

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

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

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C#

    9668questions

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

  • Unity2D

    1395questions