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

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

新規登録して質問してみよう
ただいま回答率
85.48%
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

C#

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

Unity

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

Q&A

2回答

1292閲覧

自機弾丸発射のコード

ikeson0801serow

総合スコア4

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

C#

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

Unity

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

0グッド

0クリップ

投稿2020/04/14 02:32

前提・実現したいこと

ここに質問の内容を詳しく書いてください。

C# unityで2Dシューティングを作っており、 
自機の弾丸を数フレーム間隔で発射を繰り返すコードを組んでいるのですが、 
想定通りに動きません。
どなたかアドバイスをいただけると嬉しいです。

発生している問題・エラーメッセージ

スペースキーを押した際に、for文以下を繰り返して、  等間隔に発射したいのですが、  スペースを押してもinput.Getkey以下の文章が起動しません。  またstart関数にあるコルーチンは始動しており、  コンソールにデバッグログの内容が出力しております。 

該当のソースコード

C#

1 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5 6public class BulletController : MonoBehaviour 7{ 8 //弾の速さ 9 private const int SPEED = 10; 10 11 //自機弾丸の生成 12 public GameObject Bullet0Prefab; 13 14 // 画面の一番上のy座標。画面外かどうかの判定に使用 15 private float ScreenTop; 16 17 private Rigidbody2D myRigidbody2d; 18 private Transform myTransform; 19 20 //弾を連続で発射する際の間隔 21 public float interval = 0.1f; 22 23 void Start() 24 { 25 26 StartCoroutine(enumerator()); 27 28 } 29 30 31 void Awake() 32 { 33 myRigidbody2d = GetComponent<Rigidbody2D>(); 34 myTransform = GetComponent<Transform>(); 35 36 // 画面の一番上のy座標を取得 37 ScreenTop = Camera.main.ViewportToWorldPoint(new Vector2(0, 1)).y; 38 // 弾を上に移動させる 39 myRigidbody2d.velocity = myTransform.up.normalized * SPEED; 40 41 42 43 44 } 45 46 void Update() 47 { 48 // Rigidbody2Dのsimulatedがfalse(弾が使われていない状態)であれば何もしない 49 if (myRigidbody2d.simulated == false) 50 return; 51 52 // ここからはRigidbody2Dのsimulatedがtrueの場合(=弾が動いている場合) 53 // 画面外に弾が出ていたらRigidbody2Dのsimulatedをfalseにして物理演算を止める(弾をストップする) 54 // +1しているのは余裕を持っているだけです。 55 if (myRigidbody2d.position.y > ScreenTop + 1) 56 { 57 myRigidbody2d.simulated = false; 58 } 59 } 60 61 62 63 IEnumerator enumerator() 64 { 65 Debug.Log("あいうえお"); 66 67 68 while (Input.GetKey(KeyCode.Space)) 69 { 70 71 72 for (int Bulletlimit = 0; Bulletlimit < 10; Bulletlimit += 1); 73 74 yield return new WaitForSeconds(interval); 75 76 GameObject Bullet0 = Instantiate(Bullet0Prefab) as GameObject; 77 78 79 if (Bullet0Prefab.transform.position.y > ScreenTop) 80 { 81 //画面外の弾丸を破棄する 82 Destroy(this.gameObject); 83 } 84 85 86 87 88 } 89 90 } 91 92}

試したこと

debug.logを用いてIEnumerator enumerator()まで指示が行き届いていることを
確認した。 

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

コルーチンは自動で無限ループしてくれるわけではないので、
下までいったら終了してしまいます。
なので、while(true)で囲ってください。

c#

1 IEnumerator enumerator() 2 { 3 while (true) 4 { 5 while (Input.GetKey(KeyCode.Space)) 6 { 7 for (int Bulletlimit = 0; Bulletlimit < 10; Bulletlimit += 1) ; 8 9 yield return new WaitForSeconds(interval); 10 11 GameObject Bullet0 = Instantiate(Bullet0Prefab) as GameObject; 12 13 /*画面外の弾丸を破棄する処理は弾丸につけたスクリプトで弾丸自身が行ったほうが良いと思います 14 if (Bullet0Prefab.transform.position.y > ScreenTop)//Bullet0PrefabじゃなくてBullet0では? 15 { 16 //画面外の弾丸を破棄する 17 Destroy(this.gameObject); 18 } 19 */ 20 } 21 22 yield return null; 23 } 24 } 25

投稿2020/04/14 04:01

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

C#

1while (Input.GetKey(KeyCode.Space)) 2{ 3 // 省略 4}

このコードでは、一瞬でもスペースキーが押されていないと、一瞬でもループ処理が直ちに終了してしまいます。

スペースキーを押した際に、for文以下を繰り返して、 
等間隔に発射したいのですが、 

コルーチンではなく Update メソッド内でやった方が良いのではないでしょうか。

投稿2020/04/14 03:58

nskydiving

総合スコア6500

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問