質問: "10万km"){ // 正解のボタンを押した時の○の表示 if(Input.GetMouseButtonDown(0){ Debug.Log("正解"); maru.SetActive(true); }else{ // 不正解のボタンを押した時の✖の表示 if(Input.GetMouseButtonDown(0)){ Debug.Log("不正解"); batsu.SetActive(true); } } } } } ### 試したこと if(Input.GetMouseButtonDown(0)){ のところがおかしいと思い、public void OnClickにかえたりしてみた。 ### 補足情報(FW/ツールのバージョンなど) Unity 2018.2.14f1
回答: とりあえず動くようにする ============ 分けて考えていきましょう。まずは提示されたソースを動くようにしていきます。 この書き方だと汎用性が無いので慣れてきたら改善すると良いと思います。ボタン側に正解かどうか判定させるんじゃなくて、クイズマネージャーみたいなのを作ってそこでジャッジするようにするとかですね。 ``` using UnityEngine; using System.Collections; using UnityEngine.UI; public class Judgde : MonoBehaviour { public GameObject maru; public GameObject batsu; //選択したボタンのテキストラベルと正解のテキストを比較して正誤を判定 public void JudgeAnswer() { // 正解のデータをテキストでセットする string answerText = "10万km"; // 選択したボタンのテキストラベルを取得する Text selectedBtn = this.GetComponentInChildren(); if (selectedBtn.text == answerText) { // 正解のボタンを押した時の○の表示 Debug.Log("正解"); maru.SetActive(true); } else { // 不正解のボタンを押した時の✖の表示 Debug.Log("不正解"); batsu.SetActive(true); } } } ``` `Input.GetMouseButtonDown(0)`は、マウスを左クリックしたときに動作しますが今回はボタンにアタッチするとのことでしたので不要かと思います。なのでそちらを削り、中カッコの数と位置をあわせます。 あとせっかく定義している`answerText`が使われていなかったので、if文で利用するようにしています。 おそらくこれでボタンをクリックすると正解とか不正解が出るようになるかと思います。 一定時間後に消す ======== ここから、一定時間後に消す方法を考えましょう。n秒後になにかするみたいなことはコルーチンを使うと簡単に実装できます。とりあえず時間を使った処理に便利なんだなぐらいの認識でも良いかと思います。詳しくはリファレンスなどを参照してください。 ``` using UnityEngine; using System.Collections; using UnityEngine.UI; public class Judgde : MonoBehaviour { public GameObject maru; public GameObject batsu; //選択したボタンのテキストラベルと正解のテキストを比較して正誤を判定 public void JudgeAnswer() { // 正解のデータをテキストでセットする string answerText = "10万km"; // 選択したボタンのテキストラベルを取得する Text selectedBtn = this.GetComponentInChildren(); if (selectedBtn.text == answerText) { // 正解のボタンを押した時の○の表示 Debug.Log("正解"); //maru.SetActive(true); StartCoroutine(ShowImageSecond(maru, 2f)); // maruを表示させ、2秒後に非表示 } else { // 不正解のボタンを押した時の✖の表示 Debug.Log("不正解"); //batsu.SetActive(true); StartCoroutine(ShowImageSecond(batsu,2f)); // batsuを表示させ、2秒後に非表示 } } // 引数で当たられたオブジェクトを表示し、引数の秒数後に非表示にするコルーチン IEnumerator ShowImageSecond(GameObject targetObj, float sec) { targetObj.SetActive(true); //引数で指定されたオブジェクトを表示する yield return new WaitForSeconds(sec); // 引数で指定された秒数待つ targetObj.SetActive(false); //引数で指定されたオブジェクトを非表示にする } } ``` SetActiveのかわりに、作成したコルーチンを呼ぶようになっています。 中身は簡単で、引数として渡したゲームオブジェクトをまず表示し、引数で渡した秒数後にまた非表示にするという仕組みです。