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

将Unity作为库使用时如何防止屏幕变暗?

解决Unity作为库集成时屏幕仍变暗的问题

你已尝试常规保屏设置但无效,可能是集成场景下的特殊因素导致,以下是针对性排查和解决方法:

1. 同步配置宿主Activity保屏

若Unity嵌入到宿主App的Activity中,仅配置UnityPlayerActivity可能不够,需在宿主Activity中同步设置:

  • 在宿主Activity的布局XML根View添加android:keepScreenOn="true"
  • 或在宿主Activity代码中添加窗口标志:
@Override
protected void onResume() {
    super.onResume();
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}

2. 延迟重复设置窗口保屏标志

UnityPlayer初始化可能覆盖窗口配置,建议在onResume中重复添加标志确保生效:
修改UnityPlayerActivity的onResume方法:

@Override
protected void onResume() {
    super.onResume();
    // 重新添加保屏标志
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    mUnityPlayer.resume();
}

3. 动态确认WAKE_LOCK权限

Android 6.0+部分厂商权限管控严格,需确保权限已授予:
在UnityPlayerActivity中添加权限检查逻辑:

import android.Manifest;
import android.content.pm.PackageManager;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

private static final int REQUEST_WAKE_LOCK = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 检查并申请WAKE_LOCK权限
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.WAKE_LOCK) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WAKE_LOCK}, REQUEST_WAKE_LOCK);
    }
    // 原有初始化代码...
}

4. 排查Unity侧设置是否被覆盖

确保Screen.sleepTimeout未被其他代码修改:
在Unity脚本中添加日志排查,甚至强制保持设置:

void Update() {
    // 打印当前值,确认是否被篡改
    Debug.Log("当前休眠超时值:" + Screen.sleepTimeout);
    // 强制设置为永不休眠
    Screen.sleepTimeout = SleepTimeout.NeverSleep;
}

建议将设置代码放在Awake或Start的最开头,避免被其他逻辑覆盖。

5. 处理Android电池优化限制

部分设备的Doze模式或电池优化会强制让屏幕变暗,可申请忽略电池优化:

  • 在AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
  • 在UnityPlayerActivity中添加申请逻辑:
import android.os.Build;
import android.os.PowerManager;
import android.provider.Settings;
import android.content.Intent;
import android.net.Uri;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        if (!pm.isIgnoringBatteryOptimizations(getPackageName())) {
            Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
            intent.setData(Uri.parse("package:" + getPackageName()));
            startActivity(intent);
        }
    }
    // 原有初始化代码...
}

6. 确认UnityPlayer焦点状态

确保UnityPlayer始终获取窗口焦点,避免系统判定为闲置:
在Unity侧添加设置:

void Start() {
    // 强制让应用在后台也保持运行(根据需求调整)
    Application.runInBackground = true;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 17:23:22