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

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

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

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

Unity

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

Q&A

解決済

2回答

6264閲覧

【Unity】一定時間経過すると処理を実行するスクリプト作り方について

shushudayo

総合スコア3

C#

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

Unity

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

0グッド

0クリップ

投稿2020/09/14 13:46

Unityで一定時間経過後に処理を実行するスクリプトを書いています。何秒ごとに繰り返し処理をするコードは書けたのですが、何秒後に一回だけ処理を行うコードが書けません。

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test : MonoBehaviour { float time; void Update() { time += Time.deltaTime; if(time > 3.0f) { Debug.Log("3秒経過"); time = 0; } } }

この書き方で書くと、3秒ごとにifの中身が実行されるようです。ただ今回は3秒後に一回だけ処理を実行させたいので次のように書き換えてみました。

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test : MonoBehaviour { float time; void Update() { time += Time.deltaTime; if(time == 3.0f) { Debug.Log("3秒経過"); } } }

しかし、このようにifの条件を==で書くとうまく実行されません。一回だけ実行してほしいのでこの書き方で合っていると思ったのですが、なぜ実行されないのでしょうか?ifの条件を>=にしてもちゃんと実行されるようですが、なぜ==にするときだけ処理が実行されないのかどなたか教えていただけませんか。

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

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

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

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

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

1T2R3M4

2020/09/14 13:52 編集

3.0fぴったりにならないからでは。 繰り返しの方でlogにtimeを出力してみれば確認できると思います。
shushudayo

2020/09/14 13:58

確認してみます!
guest

回答2

0

ベストアンサー

3.1秒後だった、という場合は実行されませんよね?

投稿2020/09/14 13:49

y_waiwai

総合スコア88042

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

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

shushudayo

2020/09/14 13:50

すみませんどういうことでしょうか...?
y_waiwai

2020/09/14 13:52

3.000000秒ちょうどでないと実行されない、ということです。 Update関数は何秒ごとに実行されるのかわかりませんが、これはほぼ不可能かとおもいますが
shushudayo

2020/09/14 13:57

あーそうなんですね!ありがとうございます。このようなTime.deltaTimeを使う場合、一回だけ処理を行う書き方というものはできないと思ったほうがのでしょうか?
y_waiwai

2020/09/14 14:00

なにかフラグを用意して、一回実行したらそのフラグを立てるなりして、以降、実行しないようにすればどうでしょうか。
shushudayo

2020/09/14 14:15

boolの変数tを追加して条件を(time > 3.0f && t == true)にして入れ子の中でt=falseを書いたらうまくいきました!ありがとうございます。
guest

0

なぜ==にするときだけ処理が実行されないのか

Debug.Logを使用しているようですので、if文の直前でtime関数も出力してみてはいかがでしょう?

それで、実行してみてわかると思いますが、Time.deltaTimeは一定ではない、小数が返されます。
それを足しているので、必ず変数timeが整数になる時が来るとは限りません。
そのため、time==3.0fがtrueになる時がなく、実行されなくなります。

投稿2020/09/14 13:51

yuuyu

総合スコア1139

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

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

shushudayo

2020/09/14 14:00

回答ありがとうございます!この場合、何かいい書き方はないでしょうか?不等号を使うループ処理はいろんなサイトに書いてあったのですが、Time.deltaTimeを使って一度だけ処理を行う例がなかったので...
yuuyu

2020/09/14 14:04

一つはy_waiwaiさんも言っているように、フラグを立てて if(time>=3.0&&フラグ) にする、もう一つはコルーチンを使う方法があります。(コルーチンについては仕組みが多少複雑なので、一度調べてみてください)
shushudayo

2020/09/14 14:19

おっしゃるように、boolの変数で制御し、条件内に(time > 3.0f && t == true)で判定を出したらうまくいきました!コルーチンは前々から調べていたのですが、どうもゲームの使用目的と少し合ってなかったので使っていませんでした。ご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問