前言
在某些时候,unity程序进入后台运行,我们需要它暂停或关闭一些功能,例如当前正在播放的动画、视频、声音等等之类的,在下次回到unity程序时再接着运行。
这里我们需要用到两个unity的回调函数OnApplicationForcus和OnApplicationPause,使用SendMessage方法发指令,模拟后台运行跟结束后台运行,自动调用OnApplicationForcus和OnApplicationPause方法。
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=TrueKill进程:
当前应用双击Home,然后Kill:
OnApplicationQuit (IOS 有回调,android 没回调)
跳出当前应用,然后Kill:
OnApplicationQuit (IOS和Android都没回调)
下面转载于:https://www.jianshu.com/p/cfa0263ea1b9
最简单的暂停游戏的方式
Time.timeScale = 0;
当想继续游戏时
Time.timeScale = 1;
注意
当TimeScale被设置为0时,
- Update方法仍然会被调用
- FixedUpdate方法不会被调用
- Time.time不会继续增加
- 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;
模拟代码片段:
void Update()
{
if (Input.GetKeyDown(KeyCode.A))
SendMessageTest(true);
else if (Input.GetKeyDown(KeyCode.S))
SendMessageTest(false);
}
private void OnApplicationForcus(bool isForcus)
{
if (isForcus)
{
Debug.Log("isForcus:true");
}
else
{
Debug.Log("isForcus:false");
}
}
private void OnApplicationPause(bool isPause)
{
if (isPause)
{
Debug.Log("isPause:true");
Time.timeScale = 0;
AudioListener.pause = true;
}
else
{
Debug.Log("isPause:false");
Time.timeScale = 1;
AudioListener.pause = false;
}
}
void SendPause(bool isPause)
{
transform.SendMessage("OnApplicationPause", isPause, SendMessageOptions.DontRequireReceiver);
}
void SendForcus(bool isForcus)
{
transform.SendMessage("OnApplicationForcus", isForcus, SendMessageOptions.DontRequireReceiver);
}
public void SendMessageTest(bool pause)
{
if (pause)
{
SendPause(true);
SendForcus(false);
}
else
{
SendPause(false);
SendForcus(true);
}
}