모바일 창 전환 중에 시간 참조를 유지하는 방법은 무엇입니까? (Unity) [중복]

Nov 23 2020

대기열 매치업 시스템이있는 게임이 있습니다. 플레이어에게 현재 대기열에있는 시간을 보여주고 싶습니다. 플레이어가 휴대폰의 메뉴 / 앱 개요 버튼을 눌러 기본적으로 타이머를 고정하고 플레이어가 휴대폰에서 전체 화면 모드로 다시 전환 될 때만 계속 계산됩니다.
앱 수명주기 메서드 (onApplicationPause와 비슷하지만 작동하지 않음)를 찾으려고
시도했지만 db에 저장 한 다음 실제로 데이터베이스에서로드하여 시간을 동기화하려고 시도했지만 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();