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

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

ただいまの
回答率

88.77%

unity GameObjectを一定時間だけ表示

解決済

回答 1

投稿 編集

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

TIE_Atushi

score 11

前提・実現したいこと

unityでクイズゲームを作っています。
正誤判別をさせてボタンをクリックして正解だったら◯を、不正解だったら✖の表示を一定時間だけ表示させたい。
(不正解だった場合、ハートのGameObjectの×3を減らす処理をさせたいと思っています。)

ここに質問の内容を詳しく書いてください。
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<Text>();

if (selectedBtn.text == "10万km"){

// 正解のボタンを押した時の○の表示
if(Input.GetMouseButtonDown(0){

Debug.Log("正解");
maru.SetActive(true);

}else{

// 不正解のボタンを押した時の✖の表示
if(Input.GetMouseButtonDown(0)){

Debug.Log("不正解");
batsu.SetActive(true);

}
}
}
}
}

上記のようにスクリプトを書いたのですが、ボタンにアタッチしても何も起きません。
スクリプトがおかしいとは思うのですがどう修正してよいか分からないので教えてもらいたいです。

発生している問題・エラーメッセージ

ボタンにアタッチしても何も起きない。
エラーメッセージ

### 該当のソースコード

ここに言語名を入力
ソースコード
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<Text>();

if (selectedBtn.text == "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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

とりあえず動くようにする

分けて考えていきましょう。まずは提示されたソースを動くようにしていきます。
この書き方だと汎用性が無いので慣れてきたら改善すると良いと思います。ボタン側に正解かどうか判定させるんじゃなくて、クイズマネージャーみたいなのを作ってそこでジャッジするようにするとかですね。

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<Text>();

        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<Text>();

        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のかわりに、作成したコルーチンを呼ぶようになっています。
中身は簡単で、引数として渡したゲームオブジェクトをまず表示し、引数で渡した秒数後にまた非表示にするという仕組みです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/08 14:07

    早々に回答ありがとうございます。
    実際に修正してみたのですが、ShowImageSecondのところでエラーがでました。
    重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
    エラー CS0103 現在のコンテキストに 'ShowImageSecond' という名前は存在しません。 Assembly-CSharp C:\Users\kurat\Desktop\クイズ脱出ゲーム2\Assets\Judgde.cs 29 アクティブ
    と上記のようになっていたのですがどうすればよいでしょうか?

    キャンセル

  • 2019/05/09 11:40

    スクリプトのエラーは自己解決できましたが、ボタンをクリックすると◯と✖が表示されますがそのままで消えません。たぶんですが、スタートコルーチンが起動してないように思うのですが、どうなんでしょうか?

    キャンセル

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

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

関連した質問

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