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

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

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

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

Unity

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

Q&A

解決済

1回答

1116閲覧

unity 会話イベントにおける関数の呼び出しとクリック検知

YYYYYY

総合スコア2

C#

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

Unity

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

0グッド

0クリップ

投稿2022/05/08 10:14

編集2022/05/08 12:06

ゲームでNPCと会話をするコードを書いているのですが、いくつかわからないことが出てきました。
仕様としては、接触している際にマウスをクリックするとtext内容が変更されてそれが表示されるというもので、クリックをするだけで会話の開始、進行、終了ができる、というものです。しかしこの上で困っているのが、

  1. クリック一回で複数回検知されてしまうのか、WaitForSecondsをいれないとテキストが表示されても一瞬で消えてしまう。
  2. 会話が終了した際にもう一度クリックしても何も表示されず、何回も会話ができない。

この2点です。今はただクリックするだけで文章が表示されるだけのものを作りたいのですがうまくいきません、よろしくお願いします。

using

1using System.Collections.Generic; 2using UnityEngine; 3using UnityEngine.UI; 4 5public class kaiwa : MonoBehaviour 6{ 7 // 接触判定 8 private bool isContacted = false; 9 10 void OnCollisionEnter2D(Collision2D target) 11 { 12 if(target.gameObject.tag == "Player") 13 { 14 isContacted = true; 15 } 16 } 17 18 void OnCollisionExit2D(Collision2D target) 19 { 20 if(target.gameObject.tag == "Player") 21 { 22 isContacted = false; 23 } 24 } 25 26 public Text texts; 27 28 //最初に文字を見えなくする。 29 void Start() 30 { 31 if(texts.enabled) 32 { 33 texts.enabled = false; 34 } 35 } 36 37 private IEnumerator Wait_Click() 38 { 39 yield return new WaitForSeconds(0.1f); 40 texts.text = "Hello"; 41 texts.enabled = true; 42 yield return new WaitUntil(() => Input.GetMouseButtonDown(0)); 43 yield return new WaitForSeconds(0.1f); 44 texts.enabled = false; 45 } 46 47 // 接触とクリックで会話開始、会話モードをオンにしてtext表示して、コルーチンでクリック待ちする。 48 void Update() 49 { 50 if((isContacted) && (Input.GetMouseButtonDown(0))) 51 { 52 // 会話開始 53 StartCoroutine(Wait_Click()); 54 } 55 } 56}

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

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

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

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

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

guest

回答1

0

ベストアンサー

会話であればCanvas+UnityEventを使った方が良いですよ。
というかそれが一般的です。
利点は下記です。

  • コードがシンプルになる
  • UnityEventだと前後関係が使える (重なっている場合、後のオブジェクトをクリックできなくなる)
  • イベントが厳密(例えばクリックだとタップした位置から移動せず指を離した場合のみクリックとみなされる)

などです。

テストコード書いてみました

口で説明するのが難しいので簡単なテストコード書いてみました。

TalkTest.unitypackage(保存期間 100日)
https://10.gigafile.nu/0818-b5acd24049d81484b71c6e178dca69b72

イメージ説明

UnityのCustome Packageからインポートできます。

イメージ説明

インポート後、TalkTestシーンを開いて再生してください。
イメージ説明

投稿2022/05/10 05:13

編集2022/05/10 05:18
IShix

総合スコア1724

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

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

YYYYYY

2022/05/13 12:07 編集

そのやり方が主流なんですね... コードも含め参考にさせていただきます。 質問に関しては数行のコードを書くだけで解決してしまいましてお恥ずかしい限りです。 返信が遅れて申し訳ありませんでした。回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問