如何在 Unity 中检测 android 手机旋转?

Posted

技术标签:

【中文标题】如何在 Unity 中检测 android 手机旋转?【英文标题】:How to detect android phone rotation in Unity? 【发布时间】:2017-06-27 17:16:33 【问题描述】:

在我的 Unity 应用程序中,我想检测横向方向的 android 手机是否向上或向下倾斜 - 例如这里:https://lh3.ggpht.com/A-9UCSQn7nujEMF5qmJir2YKIHbu3ehFneELSXprBBId_TYhVONTCd3guPUgQ-qte6GO=h900-rw

旋转矢量传感器可能是我正在寻找的工具,但我没有找到如何使用 Unity 访问它。 我不希望它依赖于速度,我只需要知道手机是面向地板还是面向天空。

如何检测旋转?

【问题讨论】:

你能澄清一下你在寻找什么轮换吗?你只是在寻找手机的方向吗?或者,如果您将手机横向放置在您面前,您想知道它是朝下还是朝上? 您需要设备朝向天空/地面的角度还是只需要一个二进制 - 它向下/向上? – 大卫 1 小时前 我将组件代码添加到我的答案中。请让我知道您的想法。 【参考方案1】:

我相信你必须使用 Gyroscope.attitude

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour 
    void Update() 
        transform.rotation = Input.gyro.attitude;
    

参考:https://docs.unity3d.com/ScriptReference/Gyroscope-attitude.html

【讨论】:

【参考方案2】:

实现这一目标的最简单方法之一是使用 Input.deviceOrientation。

if (Input.deviceOrientation == DeviceOrientation.Portrait)

if (Input.deviceOrientation == DeviceOrientation.LandscapeLeft)

您还可以检查: 未知、人像、PortraitUpsideDown、LandscapeLeft、LandscapeRight、FaceUp 和 FaceDown。

看看: https://docs.unity3d.com/ScriptReference/Input-deviceOrientation.html

【讨论】:

这不起作用,因为 deviceOrientation() 会告诉您手机的左侧还是右侧朝上,但 OP 想知道手机是“面向天空还是面向地板” @David 你可以使用 DeviceOrientation.FaceUp 和 DeviceOrientation.FaceDown 啊,是的,对,但这取决于@Yerdno 是否想要二进制向上/向下,或者他是否想要手机的仰角......试图通过对 Yerdno 的评论来澄清跨度> 【参考方案3】:

正如@Demon 所说,您需要使用 Input.gyro.attitude,但您需要注意一些事项:

#1 确保设备有陀螺仪:

if (!SystemInfo.supportsGyroscope)

    // Exit with message

#2 确保启用陀螺仪

Input.gyro.enabled = true;

#3 陀螺仪右手坐标系转换为Unity左手坐标系:

    private static Quaternion GyroToUnity(Quaternion q)
    
        return new Quaternion(q.x, q.y, -q.z, -q.w);
    

*** 编辑 ***

这是获取手机倾斜方向的组件:

using System;
using UnityEngine;
using UnityEngine.UI;

public class Orientation : MonoBehaviour

    public Text textComponent;
    public GameObject blockText;
    Gyroscope gyro;
    float initAng;

    const float angTolerance = 20;

    Quaternion gyroCalibration;
    void Start()
    
        // Make sure device supprts Gyroscope
        if (!SystemInfo.supportsGyroscope) throw new Exception("Device does not support Gyroscopoe");

        gyro = Input.gyro;
        gyro.enabled = true;    // Must enable the gyroscope

        textComponent = GameObject.Find("Text").GetComponent<Text>();
        blockText = GameObject.Find("Block Text");

        Quaternion attitude = Attitude();
        initAng = Elevation(attitude);
    

    // Update is called once per frame
    void Update()
    

        Quaternion attitude = Attitude();
        float ang = Elevation(attitude) - initAng;

        String dirStr;
        if (ang < -angTolerance)
           dirStr = "Down";
        else if (ang > angTolerance)
            dirStr = "Up";
        else
            dirStr = "Center";

        textComponent.text = ang.ToString() + "\n" + dirStr;    // +ang = up   -ang = down
    

    private Quaternion Attitude()
    
        Quaternion rawAttitude = gyro.attitude;             // Get the phones attitude in phone space
        Quaternion attitude = GyroToUnity(rawAttitude);     // Convert phone space to Unity space

        return attitude;
    

    private static Quaternion GyroToUnity(Quaternion q)
    
        return Quaternion.Euler(90, 0, 0) * new Quaternion(q.x, q.y, -q.z, -q.w);
    

    private static float Elevation(Quaternion attitude)
    
        Vector3 dir = attitude * Vector3.forward;           // Convert Quaterinon to Dir
        Vector2 horizontalDir = new Vector2(dir.x, dir.z);
        float horizontalDis = horizontalDir.magnitude;
        float ang = Mathf.Atan2(dir.y, horizontalDis) * Mathf.Rad2Deg;  // Calculate the elevation

        return ang;
    

您可以只使用“deviceOrientation()”,但这样做有两个好处:

#1 您可以控制需要将手机倾斜多远才能注册倾斜如果使用 deviceOrientation,您必须将手机倾斜很远才能注册倾斜

#2 它使用设备起始高度作为参考,以补偿用户通常稍微向下或向上握住手机的情况

【讨论】:

以上是关于如何在 Unity 中检测 android 手机旋转?的主要内容,如果未能解决你的问题,请参考以下文章

android adb 如何检测手机中某个软件的版本?

Unity-使用UnityRemote调试手机Android Studio打印日志

unity3d 怎样发布android程序

如何在 Android 中检测设备状态离线/在线

如何检测音频当前是不是正在 Android 手机扬声器上播放?

如何把unity 集成到现有的android app