• Unity3D Application模拟进入前后台及暂停


    前言

    在某些时候,unity程序进入后台运行,我们需要它暂停或关闭一些功能,例如当前正在播放的动画、视频、声音等等之类的,在下次回到unity程序时再接着运行。

    这里我们需要用到两个unity的回调函数OnApplicationForcusOnApplicationPause,使用SendMessage方法发指令,模拟后台运行跟结束后台运行,自动调用OnApplicationForcusOnApplicationPause方法。

    Unity3D Windows版本若要关闭后台运行,可在PlayerSetting中,取消Run In Background即可。

     

    下面转载于:https://blog.csdn.net/aa4790139/article/details/48087877

    正常进:

    OnApplicationFocus, isFocus=True

    正常退:

    OnApplicationQuit
    Home出:

    OnApplicationPause, isPause=True

    OnApplicationFocus, isFocus=False

    Home进:

    OnApplicationPause, isPause=False
    OnApplicationFocus, _isFocus=True

    Kill进程:

    当前应用双击Home,然后Kill:

    OnApplicationQuit  (IOS 有回调,android 没回调)

    跳出当前应用,然后Kill:

    OnApplicationQuit  (IOS和Android都没回调)

    下面转载于:https://www.jianshu.com/p/cfa0263ea1b9

    最简单的暂停游戏的方式

    Time.timeScale = 0;
    

    当想继续游戏时

    Time.timeScale = 1;
    

    注意

    当TimeScale被设置为0时,

    1. Update方法仍然会被调用
    2. FixedUpdate方法不会被调用
    3. Time.time不会继续增加
    4. Time.deltaTime会被影响

    若不想受TimeScale影响

    Time.unscaledDeltaTime 替换 Time.deltaTime
    Time.fixedUnscaledDeltaTime 替换 Time.fixedDeltaTime
    Time.unscaledTime 替换 Time.time

    协程

    用Time.unscaledDeltaTime 替换 Time.deltaTime
    用WaitForSecondsRealtime 替换 WaitForSeconds

    动画控制器

    CullingMode设置为UnscaledTime

    如何暂停音频播放

    AudioListener.pause = true;
    

    当结束暂停时

    AudioListener.pause = false;
    

    如果想在暂停时继续播放某些音效该咋办?

    AudioSource.ignoreListenerPause = true;

    模拟代码片段:

    1. void Update()
    2. {
    3. if (Input.GetKeyDown(KeyCode.A))
    4. SendMessageTest(true);
    5. else if (Input.GetKeyDown(KeyCode.S))
    6. SendMessageTest(false);
    7. }
    8. private void OnApplicationForcus(bool isForcus)
    9. {
    10. if (isForcus)
    11. {
    12. Debug.Log("isForcus:true");
    13. }
    14. else
    15. {
    16. Debug.Log("isForcus:false");
    17. }
    18. }
    19. private void OnApplicationPause(bool isPause)
    20. {
    21. if (isPause)
    22. {
    23. Debug.Log("isPause:true");
    24. Time.timeScale = 0;
    25. AudioListener.pause = true;
    26. }
    27. else
    28. {
    29. Debug.Log("isPause:false");
    30. Time.timeScale = 1;
    31. AudioListener.pause = false;
    32. }
    33. }
    34. void SendPause(bool isPause)
    35. {
    36. transform.SendMessage("OnApplicationPause", isPause, SendMessageOptions.DontRequireReceiver);
    37. }
    38. void SendForcus(bool isForcus)
    39. {
    40. transform.SendMessage("OnApplicationForcus", isForcus, SendMessageOptions.DontRequireReceiver);
    41. }
    42. public void SendMessageTest(bool pause)
    43. {
    44. if (pause)
    45. {
    46. SendPause(true);
    47. SendForcus(false);
    48. }
    49. else
    50. {
    51. SendPause(false);
    52. SendForcus(true);
    53. }
    54. }

  • 相关阅读:
    Mysql分组查询每组最新的一条数据,查询用户的最新的一条记录
    【OpenStack云平台】网络控制节点 HA 集群配置
    一文搞懂设计模式之代理模式
    【云原生】什么是云原生?如何学习云原生?一篇文章带你了解云原生
    美团前端vue面试题(边面边更)
    乘法器设计(流水线)verilog code
    Web前端开发的五大核心技能
    Mysql日志管理
    Java基础-对象序列化
    STM32——SPI通信
  • 原文地址:https://blog.csdn.net/WenHuiJun_/article/details/126009388