Unity开发安卓平台指南针传感器无输出问题求助
Unity开发安卓平台指南针传感器无输出问题求助
大家好,我最近碰到一个Unity安卓指南针的棘手问题,实在搞不定了,想请教下各位大佬:
- 用Unity Remote通过USB连接PC运行时,指南针功能完全正常,能正常显示并跟随方向旋转;
- 但打包成APK安装到设备后,虽然会弹出位置权限请求,我点击授权后,指南针却完全没反应;
- 更奇怪的是,我在
Start函数里明明设置了Input.compass.enabled = true,但在Update里检测到它会自动变成false,日志一直显示“Compass.enable stopped”; - 我已经尝试提取并修改Unity生成的Manifest文件,添加了定位相关权限,但问题还是没解决。
我的指南针脚本代码
using UnityEngine; using UnityEngine.Android; using UnityEngine.UI; public class Compass_Behaviour : MonoBehaviour { [SerializeField] Transform Compass; [SerializeField] Text Text01; [SerializeField] Text Text02; [SerializeField] Text Text03; [SerializeField] Text Text04; [SerializeField] Text Text05; [SerializeField] float currentHeading; [SerializeField] float storedHeading = 0f; void Start() { Text01.text = "Check Location Approval"; Text02.text = "Check Location.Status"; Text03.text = "Check if Compass Stopped"; Text04.text = "Check currentHeading"; Text05.text = "Check StoredHeading"; Permission.RequestUserPermission(Permission.FineLocation); Invoke("_LocationAskPermission", 1f); Input.location.Start(); Input.compass.enabled = true; } void _LocationAskPermission() { if (Permission.HasUserAuthorizedPermission(Permission.FineLocation))Text01.text = "FineLocation Approved"; else Text01.text = "FineLocation Denied"; } void Update() { if(Input.location.status == LocationServiceStatus.Stopped || !Input.location.isEnabledByUser) { Text02.text = "location.status stopped"; Input.location.Start(); } if(!Input.compass.enabled) { Text03.text = "Compass.enable stopped"; Input.compass.enabled = true; } currentHeading = Input.compass.trueHeading; Text04.text = "currentHeading: " + currentHeading.ToString(); if (currentHeading != storedHeading) { if (currentHeading > storedHeading+5 || currentHeading < storedHeading-5) { Compass.rotation = Quaternion.Euler(0f, -currentHeading, 0f); storedHeading = currentHeading; } Text05.text = "storedHeading: " + storedHeading.ToString(); } } }
修改后的Manifest文件
我提取了Unity生成的临时Manifest并改成了永久版本,已经添加了定位相关权限:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.UnityTechnologies.Mobile3DTemplate" android:installLocation="preferExternal" android:versionCode="1" android:versionName="1.0.2" > <uses-sdk android:minSdkVersion="29" android:targetSdkVersion="35" /> <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:smallScreens="true" android:xlargeScreens="true" /> <supports-gl-texture android:name="GL_EXT_texture_compression_dxt1" /> <supports-gl-texture android:name="GL_EXT_texture_compression_dxt5" /> <supports-gl-texture android:name="GL_EXT_texture_compression_s3tc" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-feature android:glEsVersion="0x00030000" /> <uses-feature android:name="android.hardware.vulkan.version" android:required="false" /> <uses-feature android:name="android.hardware.location.gps" android:required="false" /> <uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" /> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <permission android:name="com.UnityTechnologies.Mobile3DTemplate.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION" android:protectionLevel="signature" /> <uses-permission android:name="com.UnityTechnologies.Mobile3DTemplate.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION" /> <application android:appCategory="game" android:appComponentFactory="androidx.core.app.CoreComponentFactory" android:enableOnBackInvokedCallback="false" android:extractNativeLibs="true" android:icon="@mipmap/app_icon" android:label="@string/app_name" > <meta-data android:name="unity.splash-mode" android:value="0" /> <meta-data android:name="unity.splash-enable" android:value="True" /> <meta-data android:name="unity.launch-fullscreen" android:value="True" /> <meta-data android:name="unity.render-outside-safearea" android:value="True" /> <meta-data android:name="notch.config" android:value="portrait|landscape" /> <meta-data android:name="unity.auto-report-fully-drawn" android:value="true" /> <meta-data android:name="unity.auto-set-game-state" android:value="true" /> <meta-data android:name="unity.strip-engine-code" android:value="false" /> <meta-data android:name="android.game_mode_config" android:resource="@xml/game_mode_config" /> <activity android:name="com.unity3d.player.UnityPlayerGameActivity" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density" android:enabled="true" android:exported="true" android:hardwareAccelerated="false" android:launchMode="singleTask" android:resizeableActivity="true" android:screenOrientation="fullUser" android:theme="@style/BaseUnityGameActivityTheme" > <intent-filter> <category android:name="android.intent.category.LAUNCHER" /> <action android:name="android.intent.action.MAIN" /> </intent-filter> <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> <meta-data android:name="android.app.lib_name" android:value="game" /> <meta-data android:name="WindowManagerPreference:FreeformWindowSize" android:value="@string/FreeformWindowSize_maximize" /> <meta-data android:name="WindowManagerPreference:FreeformWindowOrientation" android:value="@string/FreeformWindowOrientation_landscape" /> <meta-data android:name="notch_support" android:value="true" /> </activity> <receiver android:name="com.unity.androidnotifications.UnityNotificationManager" android:exported="false" /> <receiver android:name="com.unity.androidnotifications.UnityNotificationRestartReceiver" android:enabled="false" android:exported="false" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> <meta-data android:name="com.unity.androidnotifications.exact_scheduling" android:value="0" /> <provider android:name="androidx.startup.InitializationProvider" android:authorities="com.UnityTechnologies.Mobile3DTemplate.androidx-startup" android:exported="false" > <meta-data android:name="androidx.emoji2.text.EmojiCompatInitializer" android:value="androidx.startup" /> <meta-data android:name="androidx.lifecycle.ProcessLifecycleInitializer" android:value="androidx.startup" /> </provider> </application> </manifest>
我目前猜测问题可能出在权限申请时机或者Manifest配置上,但试了很多次都没进展,想问问大家有没有遇到过类似情况?或者有没有我没注意到的细节?比如:
- 是不是权限申请的顺序有问题?我在
Start里先请求权限再开启定位和指南针,会不会权限还没授权就执行了开启操作? - 除了
ACCESS_FINE_LOCATION,安卓12以上的定位权限有没有特殊要求? - Unity打包时会不会有隐藏设置覆盖Manifest配置?
- 会不会是设备硬件问题?但Unity Remote运行正常,应该不是吧?
期待各位大佬的指点,谢谢大家!
备注:内容来源于stack exchange,提问作者Miguel Alexander Vasquez Orteg
相关产品推荐
相关产品推荐

