zoukankan      html  css  js  c++  java
  • unity 后台计时器实现

    问题:最近在做一个倒计时的功能,发现倒计时在程序切换到后台是会停止计时,发现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();
                    }                                          
                }
            }
    一直想把之前工作、学习时记录的文档整理到博客上,一方面温故而知新,一方面和大家一起学习 -程序小白
  • 相关阅读:
    UVA 401 回文词
    n的阶乘分解成素数幂的积
    DSSM问答匹配模型
    Enhanced LSTM for Natural Language Inference
    Bidirectional LSTM-CRF Models for Sequence Tagging
    Attention Is All You Need 学习笔记
    BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
    C++学习笔记(四)
    C++学习笔记(三)
    java学习笔记(七)
  • 原文地址:https://www.cnblogs.com/wang-jin-fu/p/8277728.html
Copyright © 2011-2022 走看看