Unity实现对移动端的陀螺仪控制

来源:互联网 发布:sql备份 编辑:程序博客网 时间:2024/06/16 23:00
using System.Collections;using System.Collections.Generic;using UnityEngine;public class GyroController : MonoBehaviour{    public bool gyroEnabled = false;    public static GyroController _Instance;  void  Awake()    {        _Instance = this;    }    #region [Private fields]    private const float lowPassFilterFactor = 0.2f;    private readonly Quaternion baseIdentity = Quaternion.Euler(90, 0, 0);    private readonly Quaternion landscapeRight = Quaternion.Euler(0, 0, 90);    private readonly Quaternion landscapeLeft = Quaternion.Euler(0, 0, -90);    private readonly Quaternion upsideDown = Quaternion.Euler(0, 0, 180);    private Quaternion cameraBase = Quaternion.identity;    private Quaternion calibration = Quaternion.identity;    private Quaternion baseOrientation = Quaternion.Euler(90, 0, 0);    private Quaternion baseOrientationRotationFix = Quaternion.identity;    private Quaternion referanceRotation = Quaternion.identity;    private bool debug = true;    #endregion    protected void Start()    {        AttachGyro();    }    protected void Update()    {        if (!gyroEnabled)            return;        transform.rotation = Quaternion.Slerp(transform.rotation,            cameraBase * (ConvertRotation(referanceRotation * Input.gyro.attitude) * GetRotFix()), lowPassFilterFactor);    }    private void AttachGyro()    {        gyroEnabled = true;        ResetBaseOrientation();        UpdateCalibration(true);        UpdateCameraBaseRotation(true);        RecalculateReferenceRotation();    }    private void DetachGyro()    {        gyroEnabled = false;    }    private void UpdateCalibration(bool onlyHorizontal)    {        if (onlyHorizontal)        {            var fw = (Input.gyro.attitude) * (-Vector3.forward);            fw.z = 0;            if (fw == Vector3.zero)            {                calibration = Quaternion.identity;            }            else            {                calibration = (Quaternion.FromToRotation(baseOrientationRotationFix * Vector3.up, fw));            }        }        else        {            calibration = Input.gyro.attitude;        }    }    private void UpdateCameraBaseRotation(bool onlyHorizontal)    {        if (onlyHorizontal)        {            var fw = transform.forward;            fw.y = 0;            if (fw == Vector3.zero)            {                cameraBase = Quaternion.identity;            }            else            {                cameraBase = Quaternion.FromToRotation(Vector3.forward, fw);            }        }        else        {            cameraBase = transform.rotation;        }    }    private static Quaternion ConvertRotation(Quaternion q)    {        return new Quaternion(q.x, q.y, -q.z, -q.w);    }    private Quaternion GetRotFix()    {        return Quaternion.identity;    }    private void ResetBaseOrientation()    {        baseOrientationRotationFix = GetRotFix();        baseOrientation = baseOrientationRotationFix * baseIdentity;    }    private void RecalculateReferenceRotation()    {        referanceRotation = Quaternion.Inverse(baseOrientation) * Quaternion.Inverse(calibration);    }}

使用的时候只需要在自己的代码段中添加

           Input.gyro.enabled = falsetrue);            GyroController._Instance.gyroEnabled = falsetrue);

即可现实陀螺仪控制,当然前提是移动设备有陀螺仪。

原创粉丝点击