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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Unity

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

Q&A

解決済

2回答

3109閲覧

コルーチン内でのTime.deltaTimeに関して。

退会済みユーザー

退会済みユーザー

総合スコア0

Unity

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

0グッド

0クリップ

投稿2018/11/16 16:46

前提・実現したいこと

コルーチン内でのTime.deltaTimeに関して、2点質問があります。

・1点目。
コルーチン内で、Time.deltaTimeを使うとしたら、基本的にyield return nullも合わせて使うことが多い気がするのですが、
「コルーチン内でTime.deltaTimeを使う場合、yield return nullもセットで使う」という覚え方をしておかしくないでしょうか?
(例外等、あったりしますか?例えば、Time.deltaTimeとyield return new WaitForSeconds()を合わせて使うケース等無いような気がします。)

・2点目。
下記のようにコルーチン内で指定した時間、処理を行うようにしたのですが、
ログを見ると、3秒を超えていました。
Time.deltaTimeを使って、指定した時間ぴったり処理を行うというのは無理なような気がしますが(無理ですよね?)、
指定した時間以内に抑えて処理をする(下記の場合だと3秒以内に抑えて処理をする)というのも無理ですか?

float time = 0; //3秒間、毎フレーム行う処理をwhile文の中に記述。 while(time < 3){ time += Time.deltaTime; Debug.Log(time); yield return null; }

 ご教示お願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

2.

起動するのが面倒でメモ帳でこしらえたので自信がありませんが

float startTime = Time.realtimeSinceStartup; while(Time.realtimeSinceStartup - startTime + Time.deltatime < 3){ //実際の処理 yield return null; }

フレームレートが30でも60でもいいので固定で安定していてプチフリを起こしたりしないという前提でなら3秒を超える前に終了してくれるような気がします

運悪く初回前フレームがプチフリ3秒おこすと一度も行われないポンコツですね

元のコードだと初回前からの時間計算になるのと、2.999999999xxxxxxxxxxxxxx秒のとき絶対もう一度走るので3秒超えるのは仕方ない気がします。もしかしたら処理自体は3秒以内におさまっている可能性も

1.
yield return nullで次フレームに移行というのが基本的な使い方なのでそれでいいと思います。
Time.deltaTimeyield return new WaitForSeconds()を併用することが無いとは言い切れません。

前フレームの処理時間分待たせたいということが無いとは言い切れませんので

関係ありませんがflanさんの書いている数式が暗号にしかみえない。Unity弄りだしてから数学から逃げた過去を呪う毎日でございます

投稿2018/11/16 20:22

編集2018/11/16 20:24
DeadEndShoot666

総合スコア203

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

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

退会済みユーザー

退会済みユーザー

2018/11/17 05:15

ご回答ありがとうございます。 ご提示のコードで3秒以内に終わるのをログをとって確認致しました。 プチフリを起こすと動かないとのことでしたので、time += Time.deltaTime;のコードの方を使っていきたいと思います。 なるほど、では「基本的にコルーチン内でTime.deltaTimeを使う場合、yield return nullもセットで使う」という覚え方をしようと思います。 自分もflan様の数式は理解できませんでした。 ありがとうございました。
guest

0

Time.deltaTime
最後のフレームを完了するのに要した時間(秒)(Read Only)

フレームの定義:
たぶんFixedUpdateからOnAplicationPauseまで(下図参照

>>1点目
yield return nullまでが1フレームで完結

WaitForSeconds()をつかうと
2秒後にスレッドが移ったフレームの直前のフレームにかかった時間
WaitForSeconds()を実行したフレームの次のフレームにかかった時間を計測できないためだと思われる

>>2点目
limx→af(a)=b
↔∀ϵ>0,∃δ>0:|x−a|≤δ→|f(x)−b|≤ϵ
理論上は可能
イメージ説明

投稿2018/11/16 18:53

flan

総合スコア146

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

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

退会済みユーザー

退会済みユーザー

2018/11/17 05:12

ご回答ありがとうございます。 limx→af(a)=b ↔∀ϵ>0,∃δ>0:|x−a|≤δ→|f(x)−b|≤ϵ の式に関しては、自分が理解できるレベルではありませんでしたが、 イベントハンドラの動き等、勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問