1. 程式人生 > >unity 後臺計時器實現

unity 後臺計時器實現

dont pause cau ive rep des 調用 pos object

問題:最近在做一個倒計時的功能,發現倒計時在程序切換到後臺是會停止計時,發現unity 安卓後臺運行時,計時器不在運行,再次切回App時從切到後臺的時間點計時,例如切到後臺時位10,後臺切回app還是從10開始

,原因是unity在安卓後臺環境下,Update和協程不會執行。
解決:
1.在Update和協程中,計算計時器的時間用當前的Time.realtimeSinceStartup減去上一次計時的Time.realtimeSinceStartup,而不是直接減去固定數值,例如減去1
2.使用unity自帶的方法void OnApplicationFocus(bool hasFocus),該方法會在App進入後臺和進入程序的時候調用,當進入程序時hasFocus = true,否則hasFocus=false;(參考Start()方法)

3.使用unity自帶的方法

void OnApplicationPause(bool pauseStatus)

該方法會在App暫停和停止暫停的時候調用,當暫停時pauseStatus= true,否則pauseStatus=false;

OnApplicationFocus is called when the application loses or gains focus. Alt-tabbing or Cmd-tabbing can take focus away from the Unity application to another desktop application. This causes the GameObjects to receive an OnApplicationFocus call with the argument set to false. When the user switches back to the Unity application, the GameObjects receive an OnApplicationFocus call with the argument set to true.
hasFocus True if the GameObjects have focus, else False.

代碼如下:只需要監聽OnApplicationEnterFocus和OnApplicationQuitFocus事件即可,FocusContinueTime為進入後臺的總時間,計算倒計時時只要減掉這個數就可以了

public static float FocusContinueTime
        {
            get
            {
                return focusContinueTime;
            }
        }

        public static float PauseContinueTime
        {
            
get { return pauseContinueTime; } } #endregion private static float preFocusTime = 0; private static float prePauseTime = 0; private static float focusContinueTime = 0; private static float pauseContinueTime = 0; void Awake() { this.gameObject.name = "ApplicationEvent"; prePauseTime = Time.realtimeSinceStartup; preFocusTime = Time.realtimeSinceStartup; DontDestroyOnLoad(this); } public void Init() { } public void Release() { } void OnApplicationFocus(bool hasFocus) { if (hasFocus) { focusContinueTime = Time.realtimeSinceStartup - preFocusTime; if (OnApplicationEnterFocus != null) { OnApplicationEnterFocus(); } } else { preFocusTime = Time.realtimeSinceStartup; if (OnApplicationQuitFocus != null) { OnApplicationQuitFocus(); } } } void OnApplicationPause(bool pauseStatus) { if (pauseStatus) { prePauseTime = Time.realtimeSinceStartup; if (OnApplicationEnterPause != null) { OnApplicationEnterPause(); } } else { pauseContinueTime = Time.realtimeSinceStartup - prePauseTime; if (OnApplicationQuitPause != null) { OnApplicationQuitPause(); } } }

unity 後臺計時器實現