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

Unity3D开发安卓APP:如何设置无网络时禁止启动应用

解决方案:Unity安卓端启动时强制拦截无网络场景

针对你想要实现无网络时直接阻止应用启动的需求,这里分享几个我在实际项目中验证过的有效方案,都是适配Unity安卓环境的:

方案一:Unity原生API快速实现启动检查

这是最轻量化的方式,用Unity自带的网络状态接口就能完成:

  1. 在你的启动场景(比如闪屏页)中创建一个管理脚本,挂载到空物体上,在Awake()或Start()里做网络校验:
using UnityEngine;
using UnityEngine.SceneManagement;

public class LaunchNetworkChecker : MonoBehaviour
{
    void Awake()
    {
        // 优先在启动初期做检查,避免用户看到不必要的界面
        if (!HasValidNetwork())
        {
            ShowOfflineWarning();
            // 延迟2秒让用户看到提示后退出
            Invoke("ExitApp", 2f);
        }
        else
        {
            // 网络正常,跳转主场景
            SceneManager.LoadScene("MainGameScene");
        }
    }

    // 判断当前是否有可用网络
    private bool HasValidNetwork()
    {
        return Application.internetReachability != NetworkReachability.NotReachable;
    }

    // 展示无网络提示(支持Unity UI和安卓原生Toast)
    private void ShowOfflineWarning()
    {
        Debug.Log("当前无网络连接,请检查后重试");
        // 安卓端调用原生Toast示例
        #if UNITY_ANDROID && !UNITY_EDITOR
        AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        AndroidJavaClass toastClass = new AndroidJavaClass("android.widget.Toast");
        currentActivity.Call("runOnUiThread", new AndroidJavaRunnable(() => {
            AndroidJavaObject toast = toastClass.CallStatic<AndroidJavaObject>("makeText", currentActivity, "无网络连接,请检查后重试", toastClass.GetStatic<int>("LENGTH_LONG"));
            toast.Call("show");
        }));
        #endif
    }

    // 适配不同平台的退出逻辑
    private void ExitApp()
    {
        #if UNITY_ANDROID && !UNITY_EDITOR
        // 安卓平台调用原生退出,避免残留进程
        AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        currentActivity.Call("finish");
        #else
        Application.Quit();
        #endif
    }
}
  1. 确保启动场景是Build Settings里的第一个场景,这样检查逻辑会最先执行。

方案二:安卓原生Activity前置检查(更精准)

如果Unity原生的网络判断在某些特殊网络环境下不够准确,可以直接修改安卓启动Activity的逻辑:

  1. 在Unity的Plugins/Android目录下创建自定义AndroidManifest.xml,并添加网络权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

<application>
    <activity android:name=".MainActivity" android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
  1. 编写安卓原生的MainActivity,在onCreate阶段就做网络校验:
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.widget.Toast;
import com.unity3d.player.UnityPlayerActivity;

public class MainActivity extends UnityPlayerActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        if (!isNetworkConnected()) {
            Toast.makeText(this, "无网络连接,请检查后重试", Toast.LENGTH_LONG).show();
            finish(); // 直接关闭Activity,阻止应用启动
            return;
        }
    }

    // 精准判断网络连接状态
    private boolean isNetworkConnected() {
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        return activeNetwork != null && activeNetwork.isConnected();
    }
}

踩坑提示

  • 务必在真机上测试!编辑器的网络状态模拟和真机可能存在差异。
  • 如果你的应用有启动动画,一定要把网络检查放在动画播放前,避免用户产生困惑。
  • 安卓10及以上版本,ACCESS_NETWORK_STATE属于正常权限,无需动态申请,直接在Manifest中声明即可。

如果之前的方案无效,可以排查下是不是检查时机太晚(比如场景加载完成后才执行),或者权限没有正确配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:36:18