teratail header banner
teratail header banner
質問するログイン新規登録
Unity

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

Q&A

解決済

2回答

292閲覧

Unity コルーチンが難しくてわからない

Tora_ou

総合スコア16

Unity

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

0グッド

0クリップ

投稿2025/06/24 05:57

0

0

実現したいこと

簡易なガチャを作っていてガチャを回した後にカプセルが出てきて割れて、といった一連の動きが終わるまでの間
次のガチャを出すボタンが押せないようにしたいのですがこのような場合、コルーチンを使うのが適切なのでしょうか。

コルーチンについてはよくわからなくて見よう見まねで処理を待機させたい時に1度だけ使った事が有るのですがその時は上手く動いてくれて今回、その上手く動いた時のコードをコピーしているだけなのですがどうも、上手くいきません。
もしかしてif文の中にはコルーチンは書けないのでしょうか?

発生している問題・分からないこと

コルーチンを使う上での注意点があれば知りたいです
書き方がとても回りくどくて
スタート宣言→IEnumerator?→わざわざそっちでも新しい関数作るの?
めちゃくちゃ難しいのですが・・・

該当のソースコード

if(ガチャボタンが押されたら) //省略して書いてます { CoverText.text = "何が出るかな?"; Gatya(); //ガチャを引く関数 StartCoroutine("waitPush");  ↓ここに赤波線が出ていてエラーで動かない IEnumerator waitPush() ←ここに赤波線が出ていてエラーで動かない   { moveButton.GetComponent<Button>().interactable = false; yield return new WaitForSeconds(5.0f); // ボタンを5秒間、押せないようにする moveButton.GetComponent<Button>().interactable = true; //ボタンが押せるように戻す CoverText.text = "長押しでガチャを回そう"; } }

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

初心者として率直な印象は「数秒待つだけ」でこんな煩雑に書かないといけないのか・・・です
〇秒待ってから実行したい、とか
この関数の処理が終わってから実行したい、という事が頻発するのですがその度にコルーチンを使うしかないのでしょうか。

補足

特になし

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

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

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

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

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

Tora_ou

2025/06/24 06:21

StartCoroutine("waitPush"); の部分は StartCoroutine(waitPush()); と書く方法もあるみたいですが その違いもわからないです。前にコルーチンを使った時はどっちで書いてもちゃんと動いてくれているようでした。 どちらの書き方でも問題無いのでしょうか。
mingos

2025/06/24 07:16 編集

コルーチンは関数として定義する必要があります。 なので、ifの中に書くとエラーになります。 コルーチンの呼び出しは、文字列でも出来ますがスペルミスしても気付けないので、 StartCoroutine(waitPush()); とするほうがおすすめです。 スペルミスやコルーチンの未定義だったらコンパイルエラーで気付けるので。
Tora_ou

2025/06/24 19:49

そうなんですね 今後は StartCoroutine(waitPush()); のほうで書くようにします コメントありがとうございました
guest

回答2

0

もしかしてif文の中にはコルーチンは書けないのでしょうか?

if文どころか、関数の中にコルーチンを書くことは出来ません。
関数の外(かつクラスの中)で定義してください。

初心者として率直な印象は「数秒待つだけ」でこんな煩雑に書かないといけないのか・・・です
この関数の処理が終わってから実行したい、という事が頻発するのですがその度にコルーチンを使うしかないのでしょうか。

コルーチン(UniTaskもそうですが)はフレームをまたいでの動作を行うための機能です。
Unityの場合、通常の関数だと「関数が終了するまで次の処理を行わない」ようになっており、通常の関数でやると待機中にすべての機能が停止(フリーズ)します。
そのため、途中で中断して、他の処理を行えるように、コルーチンが使われているわけです。

投稿2025/06/24 09:56

fiveHundred

総合スコア10450

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

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

Tora_ou

2025/06/24 19:50

コルーチン、使い方が難しいです 教えてもらった UniTask のほうを試してみたいと思います コメントありがとうございました
fiveHundred

2025/06/25 00:14

実はUniTaskでも仕組みや考え自体は同じなので、そこを理解すればほとんど変わらなかったりします。 (強いて挙げれば、UniTaskはMonoBehaviourを必須としない・細かい挙動の設定が容易ぐらい)
guest

0

ベストアンサー

確かにコルーチンって難しいですよね。
非同期処理をしたい場合はUniTaskをおすすめします。
https://github.com/Cysharp/UniTask
パッケージマネージャから簡単にインストール出来ます。

UniTask使い方でググるといろいろ記事が見つかると思いますが、ググって出てきた一番上のやつを貼っておきます。
https://shibuya24.info/entry/unity-start-unitask

UniTaskだとawait/asyncを使ってもう少し簡潔に書けます。

cs

1async UniTask StartGachaAsync() 2{ 3 CoverText.text = "何が出るかな?"; 4 Gatya(); //ガチャを引く関数 5 6 moveButton.GetComponent<Button>().interactable = false; 7 await UniTask.Delay(5000); // ボタンを5秒間、押せないようにする 8 moveButton.GetComponent<Button>().interactable = true; //ボタンが押せるように戻す 9 CoverText.text = "長押しでガチャを回そう"; 10}

投稿2025/06/24 06:21

mingos

総合スコア4312

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

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

Tora_ou

2025/06/24 19:51

コルーチン、使い方が難しいです 教えてもらった UniTask を試してみたいと思います コメントありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問