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}";
}
}
おわりに
こちらのリポジトリーにサンプルのシーンを入れています。
コメント