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

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

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

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

button

HTMLで用いる<button>タグです。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Unity

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

Q&A

解決済

1回答

7108閲覧

Unity ボタンを押すまで入力待機する

loloGame

総合スコア1

C#

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

button

HTMLで用いる<button>タグです。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Unity

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

0グッド

0クリップ

投稿2020/05/05 07:30

編集2020/05/05 08:16
コード ```### 前提・実現したいこと Unityでカードゲームを作っています。 そこでカードの効果でテフダを捨てる処理をしたいのですが 捨てるパネルを表示して 確定ボタンを押したら パネル上のカードリストを取得 パネルを閉じる という関数を書いてるのですが ボタンを押すまでプログラムの流れを止めたいです コルーチンをやってみましたがプログラムが進んでしまいます。 どうすればいいでしょうか また、コルーチン以外でボタンの入力待機する方法があったら教えてください。 Unityのバージョンは2019.3.91fです。 初心者なのでよくわかっていないところも多々あると思いますがよろしくお願いします。 ### 発生している問題・エラーメッセージ プログラムの流れを一時停止したい 状態遷移のような雰囲気? ### 該当のソースコード Unity ```ここに言語を入力 public class UiSelectCardPanel : MonoBehaviour { GameManager gameManager; [SerializeField] Transform selectCardSpace = default; int CardNum;   bool FixngB; // Start is called before the first frame update void Start() { gameManager = GetComponent<GameManager>(); } public List<int> SelectCard(int CardNumber) { var SelectCardList = new List<int>(); CardNum = CardNumber; //カードパネルの表示 ShowSelectCardPanel(); //ボタン入力待機 StartCoroutine(WaitButton()); //ボタン入力後処理 CardController[] selectSpaceList = selectCardSpace.GetComponentsInChildren<CardController>(); Debug.Log("5"); for (int i = 0; i < CardNumber; i++) { CardController card = selectSpaceList[i]; SelectCardList.Add(card.model.cardId); } //カードパネル閉じる RemoveSelectCardPanel();     return SelectCardList; } private void ShowSelectCardPanel() // 選択カードパネルを出す { gameManager.selectCardPanel.SetActive(true); } private void RemoveSelectCardPanel() // 選択カードパネルを消す { gameManager.selectCardPanel.SetActive(false); } bool FixngB=true; IEnumerator WaitButton() { yield return new WaitWhile(()=>FixngB); } //ボタンを押されたら条件を判定してWaitWhileをTrueにする public void PushBottun() { Debug.Log(CardNum); CardController[] enemyFieldCardList = selectCardSpace.GetComponentsInChildren<CardController>(); if (enemyFieldCardList.Length == CardNum) { FixngB = true; } else { FixngB = false; } } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

ソースコードはあまり読んでいない(というかコードブロックの中に書かないと表示が乱れるので、読みたくないです)ですが、そもそもコルーチンのことが何も分かっていないようなので、これについて解説します。

StartCoroutine()はあくまでコルーチンの開始を行うだけで、開始したら待機せずに即座に次の処理を行います。
その後は、他の処理と並行してコルーチンの続きの処理を行います。

よって、以下のコードのようにすると、以下のようになります。

  • 「A」の次のStartCoroutineでは待機を行わず、即座に「B」が表示されます。
  • waitValがfalseになった場合、(例えStart()の処理が終わっていたとしても)「C」が表示されます。

C#

1bool waitVal = true; 2 3void Start() 4{ 5 Debug.Log("A"); 6 StartCoroutine(Coroutine()); 7 Debug.Log("B"); 8} 9 10IEnumerator Coroutine() 11{ 12 yield return new WaitWhile(()=>waitVal); 13 Debug.Log("C"); 14}

コルーチンで待機させたい場合は以下のようにします。
この場合、「A」と「B」の間に待機が発生します。

C#

1bool waitVal = true; 2 3void Start() 4{ 5 StartCoroutine(Coroutine()); 6} 7 8IEnumerator Coroutine() 9{ 10 Debug.Log("A"); 11 yield return new WaitWhile(()=>waitVal); 12 Debug.Log("B"); 13}

投稿2020/05/05 07:56

編集2020/05/05 08:02
fiveHundred

総合スコア9908

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

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

loloGame

2020/05/05 08:14

回答ありがとうございます。 すいませんコードブロックの中に入れました。ご指摘ありがとうございます。 コルーチンの動きがわかりました。 つまり私のやりたい動きをさせるならば全てのプログラムをコルーチンに入れる必要があるということですね。 もし戻り値を返す場合にはPublic変数に入れるしかなさそうですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問