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

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

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

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

Unity

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

Q&A

解決済

3回答

2142閲覧

Unityでのタイマー機能実装について

zarakima

総合スコア15

C#

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

Unity

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

0グッド

0クリップ

投稿2017/11/19 14:45

Unityでタイマー機能を作っています。
以下のようにコードを書き、UI>Textにアタッチしています。
タイマーを60.00秒で終わらせようとすると、60秒から行き過ぎた値になり、
最終的に「60.02秒」など行き過ぎた値で終わります。

これをカウントダウンタイマーにしても、-0.02秒など行き過ぎてしまいます。
ぴったり止める方法がありましたらご教示ください。

Unityのバージョンは2007.2.0p1です。

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class Timer : MonoBehaviour {

float countTime = 0;

void Update () { countTime += Time.deltaTime; GetComponent<Text>().text = countTime.ToString("F2"); if(countTime < 60) countTime = 60.00f; }

}

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

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

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

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

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

guest

回答3

0

毎回Time.deltaTimeを足し続けることでの誤差が気になるというのであれば、以下の通りにTime.timeを使って経過時間を調べる方法がよいと思います。

C#

1using UnityEngine; 2using System.Collections; 3using UnityEngine.UI; 4 5public class Timer : MonoBehaviour 6{ 7 // スタート時間 8 float startTime; 9 10 void Start() 11 { 12 // スタート時間を取得 13 startTime = Time.time; 14 } 15 16 void Update() 17 { 18 // 経過時間を取得 19 float countTime = Time.time - startTime; 20 21 GetComponent<Text>().text = countTime.ToString("F2"); 22 } 23}

ただ、この方法でも正確ではないため、結局はCoogahさんの回答の通りにごまかす必要が出てくると思います。

投稿2017/11/20 01:38

fiveHundred

総合スコア9776

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

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

zarakima

2017/11/20 03:40

丁寧なご回答と、他の方の回答のご推薦もしていただきありがとうございます。 Time.deltaTime以外の方法がわかってよかったです。
guest

0

試しにUpdate()ではなくFixedUpdate() を使ってみたらどうでしょう?
Updateはコンピュータの性能差で呼ばれる回数が変わりますがFixedUpdateは固定フレームレートで呼ばれるそうです。(このフレームレートはUnityメニューのEdit>Project Settings>Timeで設定できます)
※なおFixedUpdateの中ではInput.~は使ってはいけません
(一定間隔で呼ばれるのでInputの入力間隔と比較して処理が間に合わなくなる可能性があるため)
FixedUpdate()でも多少の誤差はあるでしょうがUpdate()程は無い…んじゃないかと思います。

投稿2017/11/20 00:36

HiroshiWatanabe

総合スコア2160

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

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

zarakima

2017/11/20 03:40

この方法は試していませんでした。 ありがとうございます。
guest

0

ベストアンサー

C#

1countTime = Mathf.Clamp(countTime + Time.deltaTime, 0, 60); 2 3↑countTimeをmathf.clampで、counttimeにtime.deltatimeを足すが0から60をはみ出さないようにする

C#

1if(countTime < 60) 2{ 3 countTime += Time.deltaTime; 4} 5 6if(countTime > 60) 7{ 8 countTime = 60; 9}

この2つを思いつきました

投稿2017/11/19 22:28

編集2017/11/20 00:14
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

zarakima

2017/11/20 03:41

迅速なご回答ありがとうございます。 この方法で試してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問