【unity】秒から時、分、秒を計算する。

unityあまり関係ないですが、unityで開発していたので商と余りを便利に使っていけたらと思います。

前提

商と余りのうまく活用

float quotient = 6 / 4;     // 商 1
float remainder = 6 % 4;    // 余り 2

とすれば計算できます。

実際に計算してみる。

仮に100000秒が何時間何分何秒かを考える。

Time.deltaTimeで変数に秒でカウントしていく場合。

※時間経過の計算での注意は【unity】時間経過、カウントダウン、プレイ時間についてfloatを見直すを参考にしてみてください。

時間の計算

時の計算では

1時間は60分,1分は60秒なので1時間は60×60=3600秒ということになる。

では100000秒は何時間になるかというと

double time = 100000;
int h = (int)(time / 3600);
Debug.Log(h); // 27

つまり27時間

分の計算

1分は60秒なので時と同じ計算をするとおかしなことになる・・・

double time = 100000;
int m = (int)(time / 60);
Debug.Log(m); // 1666

1666分ではおかしい。hは27時間と出ていたのでその秒数は引く。

double time = 100000;
int h = (int)(time / 3600);
int m = (int)((time - (h *3600))/ 60);
Debug.Log(m); // 46 

46分

秒の計算

分と同じように出してもよいが、1分が60秒なので60で割ったあまりが秒。

int s = (int)(time % 60);
Debug.Log(s); // 40

40秒

結果

100000秒とは27時間46分40秒ゲーム的?には「27:46:40」

double time = 100000;
int h = (int)(time / 3600);
int m = (int)((time - (h *3600))/ 60);
int s = (int)(time % 60);
Debug.Log($"{h}:{m}:{s}"); // 27:46:40

おまけ

計算で余りをもう少し活用してもよい。

結局分は時間にできなかった余りなので、

double time = 100000;
int h = (int)(time / 3600);
int m = (int)((time % 3600) / 60);
int s = (int)(time % 60);
Debug.Log($"{h}:{m}:{s}"); // 27:46:40

分の計算で唐突に引き算が出なかった分見やすくなった。

※同じように日も計算できる

参考コード

using UnityEngine;
using TMPro;

public class QuotientRemainder : MonoBehaviour
{
    [SerializeField]float m_Base;
    [SerializeField] TextMeshProUGUI m_CounterText;

    private double m_Time;
    // Start is called before the first frame update
    void Start()
    {
        m_Time = m_Base;
    }

    // Update is called once per frame
    void Update()
    {
        m_Time += Time.deltaTime;
        int h = (int)(m_Time / 3600);
        int m = (int)((m_Time % 3600) / 60);
        int s = (int)(m_Time % 60);
        m_CounterText.text = $"{h}:{m}:{s}";
    }
}

おわりに

こちらのリポジトリーにサンプルのシーンを入れています。

コメント