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

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

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

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

Unity3D

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

Q&A

1回答

10521閲覧

Unity Timeの止め方

Fuku78

総合スコア8

C#

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

Unity3D

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

0グッド

0クリップ

投稿2018/07/04 10:36

前提・実現したいこと

C#初心者です。

2つのテキストにそれぞれTime.timeコマンドを使った時間計測のプログラムをつけています。
(Text1←Timer Text2←Timer2)

このプログラムはTimerでは左マウスボタン、Timer2では右マウスボタンを押すと時間が止まる予定になっています。
ですが、いざ実行した際にどちらかのボタンを押しても時間が止まらずにずっと進んでしまいます。

また、片方のテキストだけにした場合はボタンを押したら時間が止まります。

左ボタンを押したらText1に表示している時間が止まり、右ボタンを押したらText2に表示している時間が止まるようにして欲しいです。

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

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class Timer : MonoBehaviour { private Text timerText; private int minute; private float seconds; private float oldSeconds; // 最初の時間 private float startTime; // Use this for initialization void Start() { timerText = GetComponentInChildren<Text>(); oldSeconds = 0; startTime = Time.time; } // Update is called once per frame void Update() { // Time.timeでの時間計測 seconds = Time.time - startTime; minute = (int)seconds / 60; if ((int)seconds != (int)oldSeconds) { timerText.text = minute.ToString("00") + ":" + ((int)(seconds % 60)).ToString("00"); } oldSeconds = seconds; // マウスの左ボタン押しで一時停止 if (Input.GetMouseButtonDown(0)) { Time.timeScale = Time.timeScale == 0 ? 1 : 0;//未定 } } } -------------------------------------------------------------------- using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class Timer2 : MonoBehaviour { private Text timerText2; private int minute2; private float seconds2; private float oldSeconds2; // 最初の時間 private float startTime2; // Use this for initialization void Start () { timerText2 = GetComponentInChildren<Text>(); oldSeconds2 = 0; startTime2 = Time.time; } // Update is called once per frame void Update () { // Time.timeでの時間計測 seconds2 = Time.time - startTime2; minute2 = (int)seconds2 / 60; if ((int)seconds2 != (int)oldSeconds2) { timerText2.text = minute2.ToString("00") + ":" + ((int)(seconds2 % 60)).ToString("00"); } oldSeconds2 = seconds2; // マウスの左ボタン押しで一時停止 if (Input.GetMouseButtonDown(1)) { Time.timeScale = Time.timeScale == 0 ? 1 : 0; } //while (true) {} } /* [SerializeField] private int minute2; [SerializeField] private float seconds2; // 前のUpdateの時の秒数 private float oldSeconds2; // タイマー表示用テキスト private Text timerText2; void Start() { minute2 = 0; seconds2 = 0f; oldSeconds2 = 0f; timerText2 = GetComponentInChildren<Text>(); } void Update() { seconds2 += Time.deltaTime; if (seconds2 >= 60f) { minute2++; seconds2 = seconds2 - 60; } // 値が変わった時だけテキストUIを更新 if ((int)seconds2 != (int)oldSeconds2) { timerText2.text = minute2.ToString("00") + ":" + ((int)seconds2).ToString("00"); } oldSeconds2 = seconds2; } */

該当のソースコード

C#

1 2 [SerializeField] 3 private int minute2; 4 [SerializeField] 5 private float seconds2; 6 // 前のUpdateの時の秒数 7 private float oldSeconds2; 8 // タイマー表示用テキスト 9 private Text timerText2; 10 11 void Start() 12 { 13 minute2 = 0; 14 seconds2 = 0f; 15 oldSeconds2 = 0f; 16 timerText2 = GetComponentInChildren<Text>(); 17 } 18 19 void Update() 20 { 21 seconds2 += Time.deltaTime; 22 if (seconds2 >= 60f) 23 { 24 minute2++; 25 seconds2 = seconds2 - 60; 26 } 27 // 値が変わった時だけテキストUIを更新 28 if ((int)seconds2 != (int)oldSeconds2) 29 { 30 timerText2.text = minute2.ToString("00") + ":" + ((int)seconds2).ToString("00"); 31 } 32 oldSeconds2 = seconds2; 33 } 34

試したこと

上記のように、片方の時間計測のソースをTime.timeではなくTime.deltaTimeにして実行したところ両方の時間が止まりました。
Time.deltaTimeの方は時間を止めるプログラムをしていないのにです。

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

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

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

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

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

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

guest

回答1

0

Debug.Logでも仕掛ければ一発で分かるのですが、Time.timeScale = 0でUpdateは止まりません。
Unityの一時停止で止まるもの、止まらないもの【Time.timeScale】 | TECH Projin

Time.timeScale = 0になった時、
Update→呼ばれ続ける
Time.time→最後に呼ばれた時(Time.timeScale = 0になる1フレーム前)の値を維持
Time.deltaTime→常に0
となります。

この為、Time.timeを使っていれば値が加算され続けるのでタイマーの表記が進み続け、Time.deltaTimeだと加算はされない(=厳密には「0が加算され続ける」)のでタイマーの表記は止まったままとなります。

ちなみにTime.timeとTime.deltaTimeはそもそも意味が違うので、「Time.timeScale = 0の時に動く動かないの違いではない」点にご注意ください。
Time.time:このフレームが開始された時間(ゲーム開始時からの経過秒数)
Time.deltaTime:前のフレーム開始時から現フレーム開始時までの差(秒単位)

投稿2018/07/04 11:59

sakura_hana

総合スコア11425

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問