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

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

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

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

Q&A

解決済

1回答

2990閲覧

unityでゲームオブジェクトクリック時に会話文を繰り返し表示させたい

naokis0116

総合スコア13

C#

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

0グッド

1クリップ

投稿2018/12/20 12:18

編集2018/12/20 22:17

前提・実現したいこと

Unityでゲームオブジェクトをクリック時に会話文を表示させ、何回も同じ処理を繰り返したい。

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

unityでゲームオブジェクトをクリックすると会話文を表示させて、何度も同じ会話文がでるようなスクリプトを作りたいのですが、
オブジェクトクリック時(1回目)→会話文表示→クリック時会話文を消す→オブジェクトクリック時(2回目)→会話文表示→クリックしても会話文が消えない
という状態なり2回目の会話文が消えないままで処理が終わってしまうのですが、どうすれば処理を繰り返し行うことができるのでしょうか?
会話文の表示にはコールチンを使っていてTextO1に会話文TextO2にキャラ名Image4にメッセージボックスの画像を入れて、Setactiveで表示/非表示を切り替えています。

該当のソースコード

using

1using System.Collections.Generic; 2using UnityEngine; 3using UnityEngine.UI; 4using UnityEngine.EventSystems; 5using UnityEngine.SceneManagement; 6using System.Linq; 7 8public class Osonomessage : MonoBehaviour { 9 10 public GameObject parentobject;//キャンバス 11 public GameObject TextO1; 12 public GameObject TextO2; 13 public GameObject Image4; 14 15 // Use this for initialization 16 17 public void OnclickBaron2() 18 { 19 StartCoroutine(SampleCoroutine()); 20 } 21 IEnumerator SampleCoroutine() 22 { 23 24 Image4.SetActive(true); 25 TextO1.SetActive(true); 26 TextO2.SetActive(true); 27 28 parentobject = GameObject.Find("Canvas"); 29 Image4 = Instantiate(Image4) as GameObject; 30 Image4.transform.SetParent(parentobject.transform, false); 31 TextO1 = Instantiate(TextO1) as GameObject; 32 TextO1.transform.SetParent(parentobject.transform, false); 33 TextO2 = Instantiate(TextO2) as GameObject; 34 TextO2.transform.SetParent(parentobject.transform, false); 35 yield return new WaitUntil(Touch); 36 yield return new WaitWhile(Touch); 37 Image4.SetActive(false); 38 TextO1.SetActive(false); 39 TextO2.SetActive(false); 40 yield return new WaitUntil(Touch); 41 yield return new WaitWhile(Touch); 42 43 44 45 46 } 47 bool Touch() 48 { 49 return Input.GetMouseButtonDown(0); 50 } 51 52} 53

試したこと

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

bochan2

2018/12/20 12:57

コードのマークダウンが正しく閉じてないですよ ```ここに言語を入力 (naokisさんのコード) ```←ここ
naokis0116

2018/12/20 13:35

すいません。 訂正いたしました。
guest

回答1

0

ベストアンサー

もしかしてTextO1TextO2Image4はプレハブでしょうか?
実行中にCanvas階層下をご確認いただきたいのですが、現状のコードですとこれらテキストやイメージが、オブジェクトをクリックするたびにどんどん増殖していませんでしょうか。
前回表示したテキスト・イメージが生き残ったまま毎回複製が作られ、最新の複製のみ非表示に切り替えても、それ以前の生き残りが表示されっぱなしになるためにメッセージが消えなかったように見える...といった状況のような気がします。

一案としては、不要なインスタンスをDestroyで削除する方法が考えられますね。
あるいは別の案として、プレハブ用のフィールドの他にシーン上のインスタンス用のフィールドを追加し、1回目のみプレハブからテキスト・イメージを生成、2回目以降はシーン上に現れたテキスト・イメージの表示非表示切り替えのみを行うというのはどうでしょう。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using UnityEngine.EventSystems; 6using UnityEngine.SceneManagement; 7using System.Linq; 8 9public class Osonomessage : MonoBehaviour 10{ 11 12 public GameObject parentobject;//キャンバス 13 public GameObject TextO1; 14 public GameObject TextO2; 15 public GameObject Image4; 16 17 // プレハブインスタンス用のフィールドを追加 18 private GameObject textO1; 19 private GameObject textO2; 20 private GameObject image4; 21 22 // Use this for initialization 23 24 public void OnclickBaron2() 25 { 26 StartCoroutine(SampleCoroutine()); 27 } 28 IEnumerator SampleCoroutine() 29 { 30 // インスタンスが未生成ならプレハブから生成、フィールドにセットしておく 31 if (image4 == null) 32 { 33 parentobject = GameObject.Find("Canvas"); 34 image4 = Instantiate(Image4) as GameObject; 35 image4.transform.SetParent(parentobject.transform, false); 36 textO1 = Instantiate(TextO1) as GameObject; 37 textO1.transform.SetParent(parentobject.transform, false); 38 textO2 = Instantiate(TextO2) as GameObject; 39 textO2.transform.SetParent(parentobject.transform, false); 40 } 41 42 // シーン上のインスタンスの表示非表示を切り替える 43 image4.SetActive(true); 44 textO1.SetActive(true); 45 textO2.SetActive(true); 46 yield return new WaitUntil(Touch); 47 yield return new WaitWhile(Touch); 48 image4.SetActive(false); 49 textO1.SetActive(false); 50 textO2.SetActive(false); 51 52 // 以下のyieldの後には特に処理がないため、削除してしまってもいいでしょう 53 // yield return new WaitUntil(Touch); 54 // yield return new WaitWhile(Touch); 55 } 56 bool Touch() 57 { 58 return Input.GetMouseButtonDown(0); 59 } 60 61}

投稿2018/12/20 22:22

Bongo

総合スコア10807

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

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

naokis0116

2018/12/21 12:53

無事に会話文を繰り返すことができました。 丁寧な説明有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問