Unity3D开发安卓APP:如何设置无网络时禁止启动应用
解决方案:Unity安卓端启动时强制拦截无网络场景
针对你想要实现无网络时直接阻止应用启动的需求,这里分享几个我在实际项目中验证过的有效方案,都是适配Unity安卓环境的:
方案一:Unity原生API快速实现启动检查
这是最轻量化的方式,用Unity自带的网络状态接口就能完成:
- 在你的启动场景(比如闪屏页)中创建一个管理脚本,挂载到空物体上,在
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 } }
- 确保启动场景是Build Settings里的第一个场景,这样检查逻辑会最先执行。
方案二:安卓原生Activity前置检查(更精准)
如果Unity原生的网络判断在某些特殊网络环境下不够准确,可以直接修改安卓启动Activity的逻辑:
- 在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>
- 编写安卓原生的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
相关产品推荐
相关产品推荐

