You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity应用来电检测与游戏暂停实现:现有函数无效求助

解决Unity中来电自动暂停游戏的问题

我之前也碰到过类似的困扰,OnApplicationPause和OnApplicationFocus在不同平台上的触发逻辑确实有不少坑,尤其是处理来电这类系统事件的时候。咱们一步步来排查和解决:


1. 先检查Application.runInBackground的设置

你提到的这个属性是关键!如果它被设为true,游戏在后台会继续运行,直接导致OnApplicationPause和OnApplicationFocus的触发逻辑不符合预期。

  • 编辑器设置:打开Edit > Project Settings > Player,找到Run In Background选项,取消勾选。
  • 代码设置:也可以在游戏启动时强制关闭该属性:
void Start()
{
    Application.runInBackground = false;
}

2. 优化事件处理逻辑

系统触发这些事件的时机可能和你预期的不一样(比如来电时部分平台先触发OnApplicationFocus(false)再触发OnApplicationPause(true)),而且要确保isPaused变量的状态同步正确。建议给代码加上日志,方便排查事件是否真的被触发:

private void OnApplicationPause(bool paused)
{
    Debug.Log($"OnApplicationPause触发: {paused}");
    if (paused && !isPaused)
    {
        PauseResume(true);
    }
}

private void OnApplicationFocus(bool hasFocus)
{
    Debug.Log($"OnApplicationFocus触发: {hasFocus}");
    if (!hasFocus && !isPaused)
    {
        PauseResume(true);
    }
}

// 确保PauseResume正确更新状态
private void PauseResume(bool pause)
{
    isPaused = pause;
    // 这里替换成你的暂停逻辑,比如冻结时间
    Time.timeScale = pause ? 0 : 1;
    Debug.Log(pause ? "游戏已暂停" : "游戏已恢复");
}

3. 平台特定的补充处理

不同移动平台对来电事件的响应有差异,必要时可以做针对性处理:

  • Android:可以通过AndroidJavaClass注册系统来电广播监听,当检测到来电时直接调用Unity的暂停方法(需要写少量Android原生代码逻辑)。
  • iOS:iOS的来电会触发UIApplicationWillResignActiveNotification,正常情况下Unity的OnApplicationPause会捕捉到,但如果没触发,可以在Xcode项目中添加对应通知监听,再回调到Unity的C#代码。

4. 确认脚本挂载的稳定性

要确保你的暂停脚本挂载在不会被销毁的GameObject上(比如全局的GameManager),并且添加DontDestroyOnLoad标记,避免场景切换后脚本被销毁,导致事件接收失效:

void Awake()
{
    DontDestroyOnLoad(gameObject);
}

内容的提问来源于stack exchange,提问作者roffensive

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:24:34