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

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

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

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Unity

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

Q&A

解決済

2回答

3873閲覧

Unity C# 一定時間同じ処理をする機能を作りたい

kakashi4310

総合スコア11

C#

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Unity

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

0グッド

0クリップ

投稿2021/09/26 15:27

Unityで弾幕ゲームを制作しています

 以下のように、「ランダムで生成された指定位置に移動」を5秒間繰り返し、その後画面下に移動し画面外に消えるという敵を作りました。
イメージ説明

 そこで、この5秒間の間だけミサイルを一定間隔で打ち出すという機能を作りたいのですが、コルーチンで自分で書いてみたところ何度も無限ループに陥ったり1度しか打ち出されなかったりと成功しませんでした。
ですので、どうすれば良いのか助言を頂きたいです。

C#

1public class Enemy8 : MonoBehaviour 2{ 3 //ランダム移動について 4 private float speed1 = 0.1f; 5 private int speed2 = 13; 6 public GameObject player; 7 Vector3 movePosition; 8 9 //最初の移動について 10 private Vector3 destination; 11 12 //ミサイル発射について 13 public GameObject enemyFireEnemyPrefab; 14 public int wayNumber; 15 16 void Start() 17 { 18 destination = new Vector3(0f, 0f, 20f); 19 } 20 21 void Update() 22 { 23 24 transform.position += new Vector3(0, 0, -1) * speed1; 25 26 if (Vector3.Distance(transform.position, destination) < 0.5f) 27 { 28 speed1 = 0f; 29 this.GetComponent<CapsuleCollider>().enabled = true; 30 movePosition = moveRandomPosition(); 31 32 //最初の位置についたらコルーチン開始 33 StartCoroutine(FireEnemy()); 34 } 35 this.player.transform.position = Vector3.MoveTowards(player.transform.position, movePosition, speed2 * Time.deltaTime); 36 37 //ランダム移動について 38 if (movePosition == player.transform.position) 39 { 40 movePosition = moveRandomPosition(); 41 } 42 this.player.transform.position = Vector3.MoveTowards(player.transform.position, movePosition, speed2 * Time.deltaTime); 43 } 44 45 //移動範囲 46 Vector3 moveRandomPosition() 47 { 48 Vector3 randomPosi = new Vector3(Random.Range(-20, 20), 0, Random.Range(0, 40)); 49 return randomPosi; 50 } 51 52 //ここをどう書けばいいか分からないです 53 private IEnumerator FireEnemy() 54 { 55 for (int i = 0; i < wayNumber; i++) 56 { 57 Instantiate(enemyFireEnemyPrefab, transform.position, Quaternion.Euler(0, 120 + (30 * i), 0)); 58 } 59 } 60}

「5秒たったら真っ直ぐ移動する」などは他のスクリプトで操作します。

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

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

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

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

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

bboydaisuke

2021/09/26 15:36

以前の質問に回答しましたが、まだ解決済みになってないですね。
kakashi4310

2021/09/27 08:41

申し訳ありません、ベストアンサーを決め忘れていました。 本当にすみません。
guest

回答2

0

一定間隔で処理を行う場合は、Time.deltaTimeで時間差を取得するかコルーチン内でyield return new WaitForSeconds(timeOut);を使用する方法が一般的です。

private IEnumerator FireEnemy(){ while(true){ for (int i = 0; i < wayNumber; i++) { Instantiate(enemyFireEnemyPrefab, transform.position, Quaternion.Euler(0, 120 + (30 * i), 0)); } yield return new WaitForSeconds(timeOut); //timeOutを5にすれば5秒ごとに繰り返されます。 } }

投稿2021/09/27 01:34

YOshim

総合スコア1085

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

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

kakashi4310

2021/09/27 08:45

回答ありがとうございます。 素人質問で申し訳ないのですが、この場合は無限ループになる可能性はないんでしょうか?
YOshim

2021/09/27 08:52

もちろんこのままでは無限ループとなります。 条件を指定してbreakする必要があります。
guest

0

ベストアンサー

まずは定期的にミサイル撃つ、ってのを実装しましょう
それができたら、一定時間でそれを止めるようにすればよろしい

投稿2021/09/26 20:47

y_waiwai

総合スコア88042

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問