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

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

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

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

Unity

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

Q&A

解決済

2回答

2553閲覧

Unity C# 決められたフレームごとに同じことを繰り返す処理を作りたい

kakashi4310

総合スコア11

C#

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

Unity

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

0グッド

0クリップ

投稿2021/08/14 09:54

弾幕ゲームを制作している初心者です

移動しながら後方に爆弾を置いていく敵を作りたいです。
以下のように書いてみたのですが動かしてみると、指定されたインターバルの時に爆弾を作る作成する処理を1回だけ行った後、何もせず進むだけです。

どこが問題なのか教えてほしいです。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Enemy3 : MonoBehaviour 6{ 7 public float speed; 8 9 private float frame = 0f; 10 public int interval; 11 public GameObject Enemy2; 12 public GameObject Enemy2B; 13 14 void Start() 15 { 16 Rigidbody rb = this.gameObject.GetComponent<Rigidbody>(); 17 18 rb.AddForce(transform.forward * speed); 19 } 20 21 void Update() 22 { 23 frame += Time.frameCount; 24 25 if(frame == interval) 26 { 27 Vector3 pos = this.gameObject.transform.position; 28 Instantiate(Enemy2, new Vector3(pos.x, pos.y, pos.z + 10), transform.rotation); 29 30 frame = 0f; 31 } 32 } 33} 34

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

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

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

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

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

guest

回答2

0

ベストアンサー

Time.frameCountはフレーム数です。
「前回から経過したフレーム数」ではありません。
それを求めたい場合は「Time.frameCount」に「前回のフレーム数」を引く必要があります。

しかし、そもそも、その方法は適切でありません。
前提として、Unityの(Update()の)フレーム数は可変です。
このフレーム数はパソコンやモニターの性能によって変わり、自分のパソコンで60FPSだとしても、他では30や120になる場合もあります。
また、処理に遅延が発生した場合、わざとフレーム数を落として、処理落ちを防止するといった処理も行われます。

FixedUpdate()であれば固定なので、当たり判定や移動などについては、そちらを使うことが推奨されています。
フレーム数のカウントは、毎回+1すれば求めることができます。
あるいは、この前私が回答したように、yield return new WaitForFixedUpdate();を使って、コルーチンで実装するのもいいでしょう。

投稿2021/08/14 10:19

fiveHundred

総合スコア10130

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

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

kakashi4310

2021/08/15 12:44

ありがとうございました。 コルーチンで実装したところできました。
guest

0

Time.frameCountは開始してから現在までのフレーム数を示します。従って現在のコードでは、frameの値は非常に大きくまた飛び飛びの値となり、intervalの値によってはframe == intervalがtrueとはないはずです。
下記とすればinterval回目のフレームでif文中を実行するようになると思います。

C#

1void Update(){ 2 if(Time.frameCount % interval == 0){ 3 Vector3 pos = this.gameObject.transform.position; 4 Instantiate(Enemy2, new Vector3(pos.x, pos.y, pos.z + 10), transform.rotation); 5 } 6}

上記のコードでは開始直後にif文中が実行されます。それを避けたければ
if(Time.frameCount % interval == (interval -1))とすればよいです。
*未検証なので見当違いであれば申し訳ありません。
また、上記コードでは不要ですがframeを用いる場合はTime.frameCountと同じint型で宣言して下さい。

投稿2021/08/14 10:11

編集2021/08/14 10:18
YOshim

総合スコア1085

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問