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

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

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

如何检测旋转?

【问题讨论】:

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

标签: android unity3d rotation gyroscope


【解决方案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 它使用设备起始高度作为参考,以补偿用户通常稍微向下或向上握住手机的情况

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-11
      • 2013-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多