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

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

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

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

Q&A

解決済

1回答

1840閲覧

UNITYでボタン入力を待ちたい

musiruda

総合スコア15

Unity

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

0グッド

0クリップ

投稿2018/11/03 13:01

編集2018/11/04 11:59

Unityでクイズゲームを作ろうと考えております。
4択問題のプログラムについて、ボタンを4つ配置し、
何れかのボタンが押されたら処理を行う記述としたいのですが、
コルーチンの使い方がいまいちつかめず、うまく処理を行うことが出来ません。

うまい処理の仕方について、ご教授願えると幸いです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using UnityEngine.UI;

public class Quiz1 : MonoBehaviour {

TextAsset csvFile; List<string[]> quizDatas = new List<string[]>(); public GameObject ansbutton1; public GameObject ansbutton2; public GameObject ansbutton3; public GameObject ansbutton4; public int kakunina; public int kakuninb; public int kakuninc; public int kakunind; void Start () { csvFile = Resources.Load("samplequiza") as TextAsset; StringReader reader = new StringReader(csvFile.text); while (reader.Peek() != -1) { string line = reader.ReadLine(); quizDatas.Add(line.Split(',')); } int min = 0; int max = quizDatas.Count; int n; n = UnityEngine.Random.Range(min , max ); Text qLabel = GameObject.Find("Canvas/QLabel").GetComponentInChildren<Text>(); Text ansLavel1 = GameObject.Find("Canvas/AnsButton1").GetComponentInChildren<Text>(); Text ansLavel2 = GameObject.Find("Canvas/AnsButton2").GetComponentInChildren<Text>(); Text ansLavel3 = GameObject.Find("Canvas/AnsButton3").GetComponentInChildren<Text>(); Text ansLavel4 = GameObject.Find("Canvas/AnsButton4").GetComponentInChildren<Text>(); for (int i = 0;i<1;i++) { qLabel.text = quizDatas[n][1]; ansLavel1.text = quizDatas[n][2]; ansLavel2.text = quizDatas[n][3]; ansLavel3.text = quizDatas[n][4]; ansLavel4.text = quizDatas[n][5]; ansbutton1 = GameObject.Find("AnsButton1"); ansbutton2 = GameObject.Find("AnsButton2"); ansbutton3 = GameObject.Find("AnsButton3"); ansbutton4 = GameObject.Find("AnsButton4"); //label; ```StartCoroutine("Hoge");`` kakunina = ansbutton1.GetComponent<Quizansbutton>().kioku; kakuninb = ansbutton2.GetComponent<Quizansbutton2>().kioku; kakuninc = ansbutton3.GetComponent<Quizansbutton3>().kioku; kakunind = ansbutton4.GetComponent<Quizansbutton4>().kioku; if (kakunina != 0 || kakuninb !=0 || kakuninc != 0 || kakunind != 0) { Debug.Log("処理"); //goto label; } } } // Update is called once per frame void Update () { } ```IEnumerator Hoge () { while (!Input.GetMouseButtonDown(0)) { yield return null; } }

``

}

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

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

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

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

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

YOshim

2018/11/03 16:43

ソースコードの前後に```を付けて見やすくして頂けると助かります。
musiruda

2018/11/04 11:59

ご指摘ありがとうございます
sakura_hana

2018/11/05 01:06

Unity(uGUI)ではボタン入力を待つのではなく、「ボタンが押された時に特定のメソッドを呼ぶ」という考え方をします。なので(ボタン入力を受け取る部分に関しては)基本的にコルーチンは使用しません。「unity ボタン」でGoogle検索してみてください。
musiruda

2018/11/06 11:22

メインのほうで繰り返しで処理を行う中で、ボタンを押したらボタン側のスクリプトで処理を行い、その後繰り返し処理の中に復帰することは可能ですか?
sakura_hana

2018/11/08 02:05

出来なくはないです。(izmktrさんの回答のように「ボタンが押された/離された」を保存する変数を作って、ループ内でそれをチェックする等) ただ回りくどい書き方になるので、本当にそれでいいか設計を見直した方が良いかもしれません。
guest

回答1

0

ベストアンサー

Input.GetMouseButtonDown(0)を使っていますが、これだと「マウスをクリックした」という条件で進みます。
「ボタンをクリックした」ですので、ボタン以外でただクリックしただけで進んでしまいます。
正しく、「ボタンがクリックされてない」間、無限ループしなければなりません。

そこで、メンバ変数buttonを作り、0を入れておきます。
ボタンが押されたら、押されたボタンに応じてbuttonの値を1~4の値に変えます。

あとは、Input.GetMouseButtonDownの場所を、buttonの値が0の間と書き換えればOKです。

投稿2018/11/06 12:38

izmktr

総合スコア2856

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問