🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Unity

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

Q&A

解決済

1回答

633閲覧

C#:Time.deltaTimeの挙動が思っている通りにならない

TeRa_130

総合スコア61

C#

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

Unity

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

0グッド

0クリップ

投稿2021/02/05 08:56

前提・実現したいこと

Unityを使用しています。

  • 実現したい内容 …

time(Time.deltaTime)を使ってランプ(discriminative1)の点滅を操作しているのですが、timeの挙動が思った通りになりません。
・ランプ(discriminative1)の点滅は、消灯時にはdiscriminative1_offがactiveになってdiscriminative1_onがnotactiveになるようにしていて、点灯時にはその逆になっています。ランプの管理は下記の図のとおりです。
イメージ説明
・timeがゲーム開始してからfirst_startで設定した時間になるとランプが点灯し、d1_finishで設定した時間になると消灯するようになっています。そして、消灯と同時にtimeが0にリセットされます。
・2回目以降のランプの点滅は、timeがゲーム開始してからd1_intervalで設定した時間になるとランプが点灯し、d1_finishで設定した時間になると消灯するようになっています。そして、消灯と同時にtimeが0にリセットされます。
・図にすると下記の通りになります。緑色が点灯、白色が消灯を示しています。
イメージ説明

Debug.Log(time)でtimeの挙動を確認しているのですが、途中で秒数のカウントが思ったようになりません。

実行したコードとその結果

実行したコード

このようなコードを実行しました。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class discriminative_script : MonoBehaviour 6{ 7 private float time; 8 public GameObject discriminative1_off; 9 public GameObject discriminative1_on; 10 11 public float first_start; 12 13 public float d1_finish; 14 public float d1_interval; 15 16 bool first_on = true; 17 18 19 void d1_on() 20 { 21 discriminative1_off.SetActive(false); 22 discriminative1_on.SetActive(true); 23 } 24 25 26 void reset_time() 27 { 28 discriminative1_off.SetActive(true); 29 discriminative1_on.SetActive(false); 30 time = 0; 31 } 32 33 34 void Update() 35 { 36 time += Time.deltaTime; 37 38 if (first_on == true) 39 { 40 if ((time >= first_start) && (time <= (d1_finish + first_start))) 41 { 42 d1_on(); 43 Invoke("reset_time", (d1_finish)); 44 first_on = false; 45 } 46 } 47 48 if (first_on == false) 49 { 50 if ((time >= d1_interval) && (time <= (d1_finish + d1_interval))) 51 { 52 d1_on(); 53 Invoke("reset_time", (d1_finish)); 54 } 55 } 56 57 Debug.Log(time); 58 59 } 60} 61

実行した結果

上記のコードを実行した結果、
Debug.Log(time)の挙動は以下のようになりました。
first_startは3
d1_finishは5
d1_intervalは5に設定しています。

C#

10.02 20.04 3... 41.02671 51.049601 6... 72.030034 82.051696 9... 103.038296 113.062701 12... 134.030018 144.047465 15... 165.121522 175.138619 18... 196.107556 206.132473 21... 227.03747 237.054451 24... 258.016535 260.0165681←「ここから問題個所:1秒以上経過しているのに小数点以下しか記録されない」 270.0333383 280.0583819 29... 300.874075 310.9010224 320.9274291 330.9529947 340.9798648 351.007345 361.034972 371.061016←「1秒以上経過してからようやく1秒を記録」 38... 39

本来得たい結果

本来は、「0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 1, 2, ...」のように、first_start、d1_finish、d1_intervalで設定したとおりの挙動を得たいです。

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

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

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

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

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

lazh

2021/02/05 09:19

reset_time()にDebug.Log仕込んでみてください 何回も実行されている事がわかると思います
TeRa_130

2021/02/06 01:50

確認してみたところ、確かに何度も実行されていました。 それをもとに修正したところ、うまくいきました。
guest

回答1

0

自己解決

下記の通りに実行コードを修正したところ、うまくいきました。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class discriminative_script : MonoBehaviour 6{ 7 float time; 8 float task_time; 9 public GameObject discriminative1_off; 10 public GameObject discriminative1_on; 11 12 public float first_start; 13 public float d1_finish; 14 public float d1_interval; 15 16 bool first_on = true; 17 18 19 void Update() 20 { 21 task_time = Time.time; 22 time += Time.deltaTime; 23 24 if (first_on == true) 25 { 26 if ((time >= first_start) && (time <= (d1_finish + first_start))) 27 { 28 discriminative1_off.SetActive(false); 29 discriminative1_on.SetActive(true); 30 first_on = false; 31 } 32 33 if (time > (d1_finish + first_start)) 34 { 35 discriminative1_off.SetActive(true); 36 discriminative1_on.SetActive(false); 37 time = 0; 38 } 39 } 40 41 if (first_on == false) 42 { 43 if ((time >= d1_interval) && (time <= (d1_finish + d1_interval))) 44 { 45 discriminative1_off.SetActive(false); 46 discriminative1_on.SetActive(true); 47 } 48 49 if (time > (d1_finish + d1_interval)) 50 { 51 discriminative1_off.SetActive(true); 52 discriminative1_on.SetActive(false); 53 time = 0; 54 } 55 } 56 } 57} 58

投稿2021/02/06 01:50

TeRa_130

総合スコア61

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問