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

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

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

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

Q&A

解決済

2回答

1108閲覧

IEnumeratorが起動されません

bozusyogen

総合スコア12

C#

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

0グッド

0クリップ

投稿2022/03/10 16:00

編集2022/03/12 14:24

IEnumeratorを使い、銃弾を複製したいのですがIEnumeratorの中の処理が実行されません。原因がわかる方、教えてくれると嬉しいです。

行いたいこと

2Dゲームを作っており、その敵に自分の座標に銃を撃ってくるプログラムをしたい。
そこで2秒に一発、銃弾のプレハブを作り、その銃弾が複製されたときの自分の座標に向かって飛んでくるプログラムを書こうと考え、ネットでしらべたところ、IEnumeratorという時間の取り扱いができる関数があることを知りそれを使ってみようと考えた。

問題点

IEnumerator内の処理が全て、一回も行われない

経緯

IEnumerator関数を作り、その中に弾の複製や弾を飛ばす座標をどう決めるかのプログラムを書き、Start関数内に、Start Coroutineのコードを書き、そこからIEnumeratorの処理を行えるようして、実行させようと試みたがプレハブが作成されなかった。

プレハブの作成に問題があるのか、IEnumerator関数そのものに問題があるのか、IEnumerator関数内に文字を表示させるプログラムを書いたところ、コンソールに表示されなかった。

わかっていること

・start関数は文字を表示させるプログラム(DebugLog)により動作していることが確認済み
・IEnumerator内部にDebugLogを打ち込んでも反応しなかった
・キーを押したときにIEnumeratorを実行するような、start関数内以外からの関数を実行する方法も試したが起動されなかった。
・update内にプレハブを生成するプログラムを書くと、その時は正常に一フレームに一つプレハブが生成された。
・コードエラーは確認されておらず、ゲームは普通にプレイできる。
・IEnumeratorの中のループ文の外に書いたプログラムは実行された。

C#

1コード 2```using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5 6public class enemyattacksc : MonoBehaviour 7{ 8 GameObject chobforenemyattack; 9 GameObject enemyobforenemyattack; 10 public GameObject bulletprefab; 11 character chscforenemyattack; 12 enemysc enemyscforenemyattack; 13 14 Vector3 chposfornerai; 15 Vector3 enemypos2; 16 public Vector3[] neraizahyou; 17 18 public int counter; 19 20 // Start is called before the first frame update 21 void Start() 22 { 23 Debug.Log("Oi"); 24 chobforenemyattack = GameObject.Find("figure_hashiru"); 25 chscforenemyattack = chobforenemyattack.GetComponent<character>(); 26 27 enemyobforenemyattack = GameObject.Find("enemy"); 28 enemyscforenemyattack = enemyobforenemyattack.GetComponent<enemysc>(); 29 30 // 関数"Zahyouset"を実行 31 StartCoroutine(Zahyouset()); 32 33 counter = -1; 34 } 35 36 // 以下"Zahyouset"関数 37 IEnumerator Zahyouset() 38 { 39 while (true) 40 { 41 counter += 1; 42 neraizahyou[counter] = chposfornerai; 43 44 Instantiate(bulletprefab, enemypos2, Quaternion.identity); 45 46 yield return new WaitForSeconds(2f); 47 } 48 } 49 50 // Update is called once per frame 51 void Update() 52 { 53 chposfornerai = chscforenemyattack.charactermovement; 54 55 enemypos2 = enemyscforenemyattack.enemypos; 56 57 } 58}

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

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

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

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

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

Zuishin

2022/03/10 16:38 編集

「IEnumerator」「起動」「使う」「内部」「反応」「DebugLog」「Startcoroutine」「する」などのオレオレ独自用語ではなく、普通の言葉を使ってください。 短い言葉で表せないなら、具体的に詳細に誤解のないよう表現してください。 ソースコードは画像ではなくコピペしてください。 その際にマークダウンのコードブロックを使ってください。
bozusyogen

2022/03/11 13:05

至らない点が非常に多く、申し訳ございません。 修正いたしましたが、また何かわかりづらい点等ありましたらご指摘いただけるとありがたいです。
Zuishin

2022/03/11 14:31 編集

IEnumerator はインターフェースの一つで、起動するものではありません。 独自用語ではなく、他人に通じる言葉を使ってください。 短い言葉で表せないなら、具体的に詳細に誤解のないよう表現してください。 たとえば、「車」の代わりに「人が長距離を移動するための四輪のガソリンエンジンの車」と書けば、大八車や機関車と誤解することはありません。 短い言葉を使いたいなら、正確に使ってください。 「IEnumerator が起動」では、実際に何が問題なのか伝わりません。
bozusyogen

2022/03/11 15:12

問題点としては、IEnumeratorの中の処理が全く行われず、何故行われないかの理由がわからないと言うことです。
Zuishin

2022/03/11 15:16

プレハブが作成されていないのなら、それ以前の問題では?
bozusyogen

2022/03/12 14:26 編集

プレハブの生成のコードをupdate内に移したところ、うまくプレハブが生成されなかったので、少し変更を加えたところ、update内にそのコードがある場合、1フレームに一つ、正常にプレハブが生成されました。 しかし、そのコードをIEnumerator内部に移したところ、またプレハブが生成されなくなってまいました。 しかし、IEnumeratorの中の、ループ文の外に書いた操作はしっかり実行されていることが判明しました。 よって、ループ文がうまく実行されていないのかと思われます。
guest

回答2

0

StartCoroutine(Zahyouset());

StartCoroutine("Zahyouset");

に変更しても解消されませんでしょうか?

投稿2022/03/13 02:31

編集2022/03/13 02:37
moneykgn

総合スコア6

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

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

bozusyogen

2022/03/13 08:58

試してみましたが、最初のコードと変わりませんでした
guest

0

自己解決

以下に示したコードをIEnumeratorの中から消すと、IEnumeratorが正常に実行されつことが分かりました。
この現象はIEnumeratorの中に限らずupdateの中に書いてもupdateが実行されなくなりました。
おそらく、このコードを書くと、そのコードが書いてある{}内のプログラムがすべて行われなくなると思われます。
そして、私がしたかった操作では、配列を使わなくていいということが判明したので、いったん解決ということにさせていただきます。
しかし、この現象が私のunityのバグが原因なのか、それともコードミスなのかはわかっていません。ので、まだ根本的な原因が解決されたとは言い難いです。

そして、この問題について話を聞いてくださった皆さん、本当にありがとうございました。
皆さんのおかげで今まで考えなかったようなところに、思考を凝らすことができ、問題解決に近づきました。

c#

1コード 2``` neraizahyou[counter] = chposfornerai;

投稿2022/03/13 11:02

bozusyogen

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問