You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Unity3D中如何通过Android陀螺仪控制游戏重力?

用陀螺仪控制Unity游戏中的重力方向

嘿,我来帮你搞定这个需求!你之前找到的Gyroscope.gravity其实就是核心,只是需要把它从设备坐标系转换成Unity世界空间的方向就行,我给你一步步拆解:

核心思路

手机陀螺仪输出的gravity向量是基于设备自身坐标系的,而Unity的世界坐标系是Y轴向上,所以我们需要做一个坐标系转换,然后直接修改Unity物理系统的全局重力参数。

实现步骤 & 代码示例

先创建一个C#脚本,比如GyroGravityController,把它挂在场景里任意一个持久化的GameObject上(比如MainCamera或者专门的GameManager):

using UnityEngine;

public class GyroGravityController : MonoBehaviour
{
    void Start()
    {
        // 先检查设备是否支持陀螺仪
        if (SystemInfo.supportsGyroscope)
        {
            Input.gyro.enabled = true;
            Debug.Log("陀螺仪已成功启用");
        }
        else
        {
            Debug.LogError("当前设备不支持陀螺仪功能哦!");
        }
    }

    void Update()
    {
        if (Input.gyro.enabled)
        {
            // 获取设备坐标系下的重力向量
            Vector3 deviceGravity = Input.gyro.gravity;
            
            // 转换为Unity世界坐标系:调整轴的对应关系,匹配Unity的Y轴向上规则
            // 这里的旋转和轴映射是关键,你可以根据实际测试微调
            Vector3 worldSpaceGravity = Quaternion.Euler(90, 0, 0) * new Vector3(deviceGravity.x, deviceGravity.z, -deviceGravity.y);
            
            // 设置全局重力,乘以9.81是为了保持真实重力的大小
            Physics.gravity = worldSpaceGravity * 9.81f;
        }
    }
}

关键细节解释

  • 陀螺仪启用:一定要在Start里检查并启用Input.gyro,默认是关闭状态的。
  • 坐标系转换:当你把手机平放屏幕朝上时,设备的重力向量是(0, 0, -1)(Z轴指向屏幕外),我们通过Quaternion.Euler(90, 0, 0)旋转加上轴映射,把它转换成Unity世界空间的(0, 9.81, 0)(正常向下的重力)。当你倒置手机时,设备重力向量变成(0, 0, 1),转换后就会变成(0, -9.81, 0),实现重力倒置的效果。
  • 测试注意:一定要在真实的Android设备上测试!编辑器里的陀螺仪模拟和真实设备的表现差异很大。

调整小技巧

如果测试时重力方向和预期不符,可以试试调整转换时的参数:

  • 修改Quaternion.Euler的角度,比如改成(90, 180, 0)
  • 调整向量的轴顺序,比如把deviceGravity.z换成-deviceGravity.z

内容的提问来源于stack exchange,提问作者Abhishek Singh

火山引擎 最新活动