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

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

ただいまの
回答率

90.34%

  • C#

    9675questions

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

  • Unity2D

    1395questions

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

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 841

Gluek731

score 24

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

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

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

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

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

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

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

/*通信宣言*/
using System.Net;
using System.Net.Sockets;
using System.IO;

/*スレット*/
using System.Threading.Tasks;


/*送信側のプログラム
  基本こっちが親サーバになるので
  こっちが支持を出す*/
namespace TCPserver
{
    public partial class Form1 : Form
    {
        //別スレットを使うときデリゲートを使う
        private delegate void DelegateSetText(string str);

        private StreamReader sr;
        private StreamWriter sw;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            /*
            //ネットワークの設定
                                                            //自分のIPアドレス,ポート番号
            IPEndPoint ep = new IPEndPoint(IPAddress.Parse("***.***.***.***"),8888);
            TcpListener listener = new TcpListener(ep);
            listener.Start();
            TcpClient client = listener.AcceptTcpClient();
            */

            /*タスクの実行*/
            Task.Factory.StartNew(() => WaitConnect());

        }

        /*ネットワーク設定用タスク*/
        private void WaitConnect()
        {
            /*ネットワークの設定*/
            /*自分のIPアドレス,ポート番号*/
            IPEndPoint ep = new IPEndPoint(IPAddress.Parse("***.***.***.***"), 8888);
            TcpListener listener = new TcpListener(ep);
            listener.Start();
            TcpClient client = listener.AcceptTcpClient();

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

            /*マルチスレットを立ち上げる*/
            Task.Factory.StartNew(() => Recive());
        }

        private void Recive()
        {
            string str = string.Empty;
            do
            {
                str = sr.ReadLine();
                if (str == null)
                {
                    break;
                }
                //txtDisp.Text = str;
                Invoke(new DelegateSetText(SetText), str);    //テキストに書き込むスレットを呼び出す
            } while (true);
        }

        private void SetText(string str)
        {
            txtDisp.Text += str + "\r\n";
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            if (sw != null)
            {
                if (txtSend.Text != null)
                {
                    sw.WriteLine(txtSend.Text);
                }
            }
            txtSend.Text = null;
        }


    }
}

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

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 bool Enemyflg = false;
    private bool Enemyflg2 = false;
    public GameObject myCube;
    public Sprite[] Dusts;

    private Thread TCP_Thread;

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

    // Use this for initialization
    void Start()
    {
        //青色に変更
        this.GetComponent<Renderer>().material.EnableKeyword("_EMISSION");
        this.GetComponent<Renderer>().material.SetColor("_EmissionColor", Color.red);

        TCP_Thread = new Thread(threadWork);
        TCP_Thread.Start();
    }

    // Update is called once per frame
    void Update()
    {

        SpriteRenderer renderer = gameObject.GetComponent<SpriteRenderer> ();


        if (Enemyflg) {
            if(renderer.sprite == Dusts [2]){
            }
            if (renderer.sprite == Dusts [1]) {
                renderer.sprite = Dusts [2];
                Debug.Log (Enemyflg);
                Enemyflg = false;
            }
            if (renderer.sprite == Dusts [0]) {
                renderer.sprite = Dusts [1];
                Debug.Log (Enemyflg);
                Enemyflg = false;
            }

        }

        if (Enemyflg2) {
            if(renderer.sprite == Dusts [2]){
            }
            if (renderer.sprite == Dusts [1]) {
                renderer.sprite = Dusts [2];
                Debug.Log (Enemyflg2);
                Enemyflg2 = false;
            }
            if (renderer.sprite == Dusts [0]) {
                renderer.sprite = Dusts [1];
                Debug.Log (Enemyflg2);
                Enemyflg2 = false;
            }
        }
    }

    //------------------------------------------------------------
    // 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を返す
            Debug.Log(str.Contains("1"));
            Debug.Log(str.Contains("2"));
            //Colorflgはbool型の変数
            Colorflg = str.Contains("a");
            Enemyflg = str.Contains("1");
            Enemyflg2 = str.Contains("2");
            Debug.Log(Enemyflg);
            Debug.Log (Enemyflg2);
        } while (true);
    }

}

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

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

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

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

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

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

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

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

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

  • C#

    9675questions

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

  • Unity2D

    1395questions