モバイルウィンドウの切り替え中に時間参照を維持するにはどうすればよいですか?(団結)[重複]

Nov 23 2020

私はキューマッチアップシステムを持っているゲームを持っています。プレイヤーが現在のキューにどれくらいいるのかを示したいと思います。プレーヤーが電話のメニュー/アプリの概要ボタンを押すまではうまく機能します。これにより基本的にタイマーがフリーズし、プレーヤーが電話でフルスクリーンモードに戻ったときにのみカウントが続行されます。
アプリのライフサイクルメソッドを探してみました(onApplicationPauseに似ていますが、機能しませんでした)
また、データベースに保存してデータベースから実際に読み込むことで時刻を同期しようとしましたが、Firebaseで遅延が発生するためです。正確ではありません。どうすればこれを解決できますか?ユーザーが電話のアプリの概要/メニューボタンを押したときにカウントされ続けますか?

今のところ、ユーザーのキュー時間をカウントする次のコードがあります。

private void Update() {
    if(startedCounting) {
        timer += Time.deltaTime;
        int seconds = Mathf.FloorToInt(timer % 60);
        int minutes = Mathf.FloorToInt(timer / 60);
        queueStatusText.text = "You are in the queue\n"
                               + string.Format("{0:00}:{1:00}", minutes, seconds);
    }
}

回答

2 Tatranskymedved Nov 23 2020 at 17:36

さまざまなアプローチがあり、静的クラスまたはシングルトンパターンを使用するものもあります。更新のたびにUpdate()計算時間がかかるため、この時間変数を毎回更新しないことをお勧めします(他にこの時間を必要としない場合)。また、ユーザーはフレームごとに正確な時間を持っている必要がないため、の追加などを回避できますTime.deltaTime

静的クラスの例を示します。静的クラスはこの情報を保持できます。また、このスクリプトはC#ファイルとしてのみ追加されますが、どのスクリプトにも添付しないことに注意してくださいGameObject

public static class QueueTimerInformation //It is not inheriting from MonoBehavior!
{
    private static DateTime dt;
    private static bool isRunning = false;

    //Save current DateTime when user did the action
    public static void Start()
    {
        if(!isRunning)
        {
            dt = DateTime.Now;
            isRunning = true;
        }
    }

    public static void Reset()
    {
        isRunning = false;
    }

    // This gets the actual time in String value
    // Usually it is better to return just `elapsedTime` and format it later
    public static string GetTimeElapsed()
    {
        if(!isRunning) return "00:00"; //Not running, return some default

        var elapsedTime = (DateTime.Now - dt);
        return $"{elapsedTime:mm\\:ss}";
    }
}

使用法

//On 1st time enter lobby
QueueTimerInformation.Start();

//In update method
var result = QueueTimerInformation.GetTimeElapsed();