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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

1回答

2088閲覧

Time.deltaTimeで経過時間を測っているが4回目の計測値がおかしい

cccfffjjj

総合スコア3

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2020/05/10 16:22

編集2020/05/10 17:31

前提・実現したいこと

Time.deltaTimeを用いて、開始から現在までの経過時間を測定しています。
回転や移動などの処理はせず、ただ経過時間を測っているだけであり、1ステップごとに約20ms(0.02秒)程度かかります。
つまり1ステップごとに『20 → 40 → 60 → 80 → 100 → 120...』と増加していくはずなのですが、4ステップ目の更新のみ340msかかってしまいます
『20 → 40 → 60 → 400 → 420 → 440...』といった具合にです
4ステップ目だけ複雑な命令を出しているわけでもないのに、340msもかかってしまう理由がわかりません。
これが起こる原因並びにその解決策、または1ステップごとに同じ経過時間を計測できる方法を探しています

これを使用したいプロジェクトについて

現実時間と連動したゲームを制作しており、「ゲーム開始からの経過時間(ms)をiとした場合」に、ある経過時間になったとき特定の動作をするようなものです(例:開始から100msたったら(i = 100)90度回転、230ms(i = 230)たったら10移動)
1回Updateをするのに20msかかるため、例えばi = 20でUpdateをすると次のiは40となります。この際、例えば30msのときに特定の動作をするようになっていると、21~39はiに入らないため(i = 20 → i = 40)この命令を飛ばしてしまいます。
そのため、動作をさせるかどうかの判断を「if i == 30」ではなく「if i == 30 || abs(i - 30 ) <= 10」としています。こうすることで、iが40であっても30で実行するはずだった命令を行えるようにしています。しかし、このコーディングは、updateの間隔が一定であるという前提で組んでいるため4ステップ目の更新のみ340msかかってしまうと、行いたい挙動をプログラムが行ってくれなくなってしまいます
加えて、上記のような処理は、void Start、void Updateのどちらにも用いたいため、「1回目のUpdateで1秒待ってから経過時間を測る」ような処理は、うまくいかない可能性があります、、、

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

イメージ説明

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class timekeisoku : MonoBehaviour 6{ 7 int i = 0; 8 float totaltime; 9 10 // Start is called before the first frame update 11 void Start() 12 { 13 totaltime = totaltime + Time.deltaTime; 14 i = (int)(totaltime * 1000.0f); 15 UnityEngine.Debug.Log("経過時間は ==" + i); 16 } 17 18 // Update is called once per frame 19 void Update() 20 { 21 totaltime = totaltime + Time.deltaTime; 22 i = (int)(totaltime * 1000.0f); 23 UnityEngine.Debug.Log("経過時間は ==" + i); 24 25 } 26}

試したこと

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

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

Update自体が不規則に呼ばれる可能性あるため、以下のどちらかを採用するのはいかがでしょうか。
以下のどちらかであれば、ほぼほぼ固定値が返却されないでしょうか。

1、Updateメソッドを利用する場合、Time.fixedDeltaTimeの利用に変更する
2、UpdateメソッドではなくFixedUpdateメソッドの利用に変更し、現状のままTime.deltaTimeを利用する

・↓FixedUpdateTime.fixedDeltaTimeに関する参考リンク
Time.fixedDeltaTimeについて。
<Unity> Time.deltaTimeを処理に加える必要性はあるのでしょうか?
Time.fixedDeltaTimeとTime.deltaTimeについて

投稿2020/05/11 00:34

tsuki01

総合スコア1751

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

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

cccfffjjj

2020/05/11 08:30

FixedUpdateに変更したところ無事解決しました ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問