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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

2回答

2915閲覧

Unityにおけるコルーチンの使い方

manyo

総合スコア7

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

0クリップ

投稿2016/12/07 13:39

編集2022/01/12 10:55

コルーチンについてお伺いします.今unityで神経衰弱のようなゲームを作っていまして,正解すると次のターゲットに画像が変わるというものです.しかし今のプログラムですと正解した瞬間に画像が変わってしまい,確認する時間がありません.なので,二秒間だけ処理を待つプログラムを作ったつもりでしたが,これではコルーチンsleepを呼び出すことが出来ませんでした.いかがしたらよろしかったでしょうか.(Unity5.4.3f1,VisualStadio2015使用)

void Update()
{
if (target_num == pointer_dir)//正解した時
{
StartCoroutine("sleep");//コルーチンsleepを呼び出す
pic_num = (int)(MAX_PIC * Random.value);//画像をランダムで選択
GetComponent<Renderer>().material.mainTexture = image[pic_num];//次のターゲットを表示
}
}
IEnumerator sleep()
{
yield return new WaitForSeconds(2); //二秒待機
}

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

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

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

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

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

haru666

2016/12/08 01:53

C#とは直接関係ない話題なのでタイトルはUnityにおける、に変更した方がいいですよ
guest

回答2

0

呼べてないわけではないです。

unityにおいてコルーチンは非同期処理を実現させるための機構なので、コルーチンの処理は中がどれだけ時間のかかる処理でも、すぐに次の処理(この場合は絵の表示)が実行されます。

なので、今回の件は例えば以下のようにsleepの後に絵の処理を行うようにするとかすれば解決します。(まぁこの場合、sleepという関数名は妥当ではないですが)

C#

1IEnumerator sleep() 2{ 3 yield return new WaitForSeconds(2); //二秒待機 4 pic_num = (int)(MAX_PIC * Random.value);//画像をランダムで選択 5 GetComponent<Renderer>().material.mainTexture = image[pic_num];//次のターゲットを表示 6}

投稿2016/12/08 02:11

編集2016/12/08 02:12
ishi9

総合スコア1294

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

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

0

本格的な回答はUnityをやっている人に任せるとして一応C#畑なので回答させてもらいます

説明を読む限りコルーチンは画面更新に処理を挟むためのもので呼び出しで待機できるわけではありません

上記のコードではStartCoroutineでsleepメソッドが呼ばれるとsleepメソッドにアクセスした後
何もせずに2秒待機してもう一度sleepメソッドが呼ばれます、そして何もせずに終了します

通常、アプリケーション制作で画面更新の処理をするUpdateメソッドでは直接待機してはいけません
そういうことをするとアプリケーションの描画はフリーズしてしまいます
※Unityでどうかまではわかりませんが…
Updateメソッドはアプリケーションの内部ステータスを参照し、画面の表示状態をどのようにするかだけをつらつらと書く部分です

manyoさんの書き方で一番問題があるのはコルーチンの呼び出し部分ではなく、Updateメソッドに画像選択のロジックが含まれている部分です

pic_num = (int)(MAX_PIC * Random.value);//画像をランダムで選択 GetComponent<Renderer>().material.mainTexture = image[pic_num];//次のターゲットを表示

このロジックが1秒間に行われる描画で再三行われているため、画像が一瞬しか表示されないのだと思います
それから、MAX_PICに掛け算でRandom.valueを足しこむのは処理としておかしいです…たぶん%が正しいです
※ただし、画像のランダム選択としてはこれも正しいとは限らない

ユーザーの入力と共に画像は確定しておき、Updateメソッドでは描画だけをするようにしてみてください

これ以上の詳細はUnityの人に任せます

投稿2016/12/08 02:04

編集2016/12/08 02:11
haru666

総合スコア1591

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問