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

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

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

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

Unity

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

Q&A

解決済

2回答

2786閲覧

Unity c# コルーチンが終了されない

Sukabo

総合スコア31

C#

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

Unity

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

0グッド

0クリップ

投稿2018/01/02 13:40

編集2018/01/03 01:05

Unity公式の「はじめてのUnity」というチュートリアルのシューティングゲームを作成中です。
コルーチンが終了しない理由がわかりません。

###該当のソースコード

c#

1using UnityEngine; 2using System.Collections; 3 4public class Emitter : MonoBehaviour 5{ 6 // Waveプレハブを格納する 7 public GameObject[] waves; 8 9 // 現在のWave 10 private int currentWave; 11 12 IEnumerator Start () 13 { 14 15 // Waveが存在しなければコルーチンを終了する 16 if (waves.Length == 0) { 17 yield break; 18 } 19 20 while (true) { 21 22 // Waveを作成する 23 GameObject wave = (GameObject)Instantiate (waves [currentWave], transform.position, Quaternion.identity); 24 25 // WaveをEmitterの子要素にする 26 wave.transform.parent = transform; 27 28 // Waveの子要素のEnemyが全て削除されるまで待機する 29 while (wave.transform.childCount != 0) { 30 yield return new WaitForEndOfFrame (); 31 } 32 33 // Waveの削除 34 Destroy (wave); 35 36 // 格納されているWaveを全て実行したらcurrentWaveを0にする(最初から -> ループ) 37 if (waves.Length <= ++currentWave) { 38 currentWave = 0; 39 } 40 41 } 42 } 43}

###発生している問題

上記のコードで、コルーチンがスタートしてからすぐにif文の処理が行われないのはなぜでしょうか。

###URL
リンク内容

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

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

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

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

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

Zuishin

2018/01/02 21:14

タイトルと本文と発生している問題がバラバラでどれが質問かわかりませんし何が問題か分かりません。整理して質問を編集して最初から分かりやすく書き直してください。回答にはこのくらいの丁寧さを求めるということを示すために丁寧に書いて下さい。
Sukabo

2018/01/03 01:07

ご指摘ありがとうございます。質問が複数あったので、タイトルにある問題についての質問のみに変更しました。
guest

回答2

0

ベストアンサー

もし、リンク通りにやっているのであれば、7.2のところでwavesを設定しているはずです。
なので、waves.Lengthは1になっていると思います。
ブレイクポイントで止めるなどして、値を確認してみてはどうでしょう?

投稿2018/01/03 01:39

YAmaGNZ

総合スコア10222

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

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

Sukabo

2018/01/03 02:21

ご回答ありがとうございます。Lengthが1であることは理解できました。重ねて質問になりますが、currentWaveに値を代入していないのに、Waveを作成するときにwaves[0]がGameObject waveに代入されるのはなぜでしょうか。
YAmaGNZ

2018/01/03 02:57

リンク先通りのことを行っているのであれば、インスペクタ上でwavesのElement 0にwaveを設定しているはずです。 これは、wavesの初期値を設定していることになるので、waves[0]はwaveになります。
Sukabo

2018/01/03 08:57

すみません、僕の質問が分かりにくかったですね。要するにcurrentWaveに値を代入しなくてもよいのかが聞きたいです。
YAmaGNZ

2018/01/03 09:40

currentWaveはintで宣言されていて、配列の添え字です。 intの初期値は0になりますので、ソース上等で初期化しなくても大丈夫です。
Sukabo

2018/01/03 12:24

そうなんですか!恥ずかしながら存じて無かったです…ありがとうございます。 ところで、currentWaveの値はif文の条件式中で1ずつ増えていくのですか?currentWave += 1 と記述しなくてもいいのでしょうか。
YAmaGNZ

2018/01/03 12:59

添え字が範囲を超えたかどうか判断するif文にて++currentWaveされています。
Sukabo

2018/01/03 13:45

ご丁寧に教えていただきありがとうございました。おかげで演算についての知識の誤りにも気づけました。モヤっとしていた事がすっきりして非常に助かりました!
guest

0

yield break が実行されるのは waves の値として空配列が入っている場合です。
しかし空配列が入っていた場合は waves[currentWave] の段階で例外が発生します。
例外が発生しないということは空でない配列が入っている証拠です。

インスペクタで空でない配列をアタッチしているのではありませんか?

投稿2018/01/03 01:32

Zuishin

総合スコア28656

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

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

Sukabo

2018/01/03 02:26

ご回答ありがとうございます。配列型にオブジェクトをアタッチするという行為について僕が勘違いしていたようで、たしかにwavesは空配列にはなっていませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問