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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 11:00:30