数値をカウントアップする処理
数値をカウントアップしながらプレゼンテーションする、というのはよくある。
条件として下記の通り。
・一定時間ごとに特定の値ずつ増える。
・最大でもn秒でカウントアップ処理が終わってほしい。
・カウントアップする最小値を指定したい。
・カウントアップする値は、全体としてn秒に収まるように調整する。
var after = 9999; var before = 111; // 足し込む最小単位 var addMin = 10; // 最小時間 var minSec = 0.1f; // 最大所要時間 var maxSec = 5.0f; // 所要時間 var revise = Mathf.Max(addMin, after - before); var time = Mathf.Min(maxSec, revise / addMin * minSec); // 1回あたりの足し込み量 var add = (long)System.Math.Floor(revise / (time / minSec)); Debug.Log("カウントアップ処理 " + before + " から " + after + " まで, " + minSec + " 秒間隔で " + time + " 秒かけて " + add + " ずつ増やしていく"); var cnt = 0; Observable.Interval(TimeSpan.FromSeconds(minSec)) .TakeUntil(Observable.Timer(TimeSpan.FromSeconds(time))) .Subscribe(_ => { before = Math.Min(after, before + add * cnt++); Debug.Log(before); }, () => { // 端数の場合を考慮し、ストリーム終了時に最終値を出力 Debug.Log(after); });
微妙にちょっとおかしいかも。
【追記】
もうちょい直した。
数値をカウントアップさせる時によくやる処理