Unity3D使用陀螺仪控制节点旋转
更新时间:2020年6月25日 10:35 点击:1994
本文实例为大家分享了Unity3D陀螺仪控制节点旋转的具体代码,供大家参考,具体内容如下
/******************************************************************** Desc: 陀螺仪对相机的逻辑类。 *********************************************************************/ using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using UnityEngine; namespace Game.Gyro { /// <summary> /// 职责: /// 1.实现陀螺仪对相机的影响和操作; /// 2.尽量重现崩坏3的主界面驾驶舱效果; /// </summary> class GyroCamera : MonoBehaviour { #region 声明 /// <summary> 陀螺仪的输入类型 </summary> public enum EGyroInputType { /// <summary> RotateRate </summary> RotateRate, /// <summary> RotateRateUniased </summary> RotateRateUniased, /// <summary> UserAcceleration </summary> UserAcceleration, } #endregion #region 控制变量 public float m_gyro_max_x = 15.0f; public float m_gyro_max_y = 15.0f; public float m_gyro_max_z = 15.0f; #endregion #region 变量 /// <summary> editor开发环境下的模拟陀螺仪输入 </summary> public Vector3 m_editor_debug_input = Vector3.zero; /// <summary> 陀螺仪的输入参数,用以控制相机 </summary> public Vector3 m_gyro_input = Vector3.zero; /// <summary> 当前的摄像机角度 </summary> public Vector3 m_cur_euler = Vector3.zero; /// <summary> 陀螺仪数据的更新频率 </summary> public int m_upate_rate = 30; /// <summary> 当前陀螺仪的输入输入类型 </summary> public EGyroInputType m_gyro_input_type = EGyroInputType.RotateRate; /// <summary> 陀螺仪的系数 </summary> public float m_gyro_factor = 1.0f; private Vector3 m_camera_init_euler = Vector3.zero; private Transform mTransform; #endregion #region 访问接口 /// <summary> 陀螺仪的输入参数,用以控制相机 </summary> protected Vector3 GyroInput { get { return m_gyro_input; } set { m_gyro_input = value; } } /// <summary> 陀螺仪输入数据的类型 </summary> protected EGyroInputType GyroInputType { get { return m_gyro_input_type; } set { m_gyro_input_type = value; } } /// <summary> 陀螺仪的系数 </summary> protected float GyroFactor { get { return m_gyro_factor; } set { m_gyro_factor = value; } } /// <summary> 当前的旋转角 </summary> protected Vector3 CurEuler { get { return m_cur_euler; } set { m_cur_euler = value; } } #endregion #region Unity // Use this for initialization void Start() { Input.gyro.enabled = true; mTransform = gameObject.transform; CurEuler = mTransform.localEulerAngles; m_camera_init_euler = CurEuler; } /// <summary> 绘制UI,方便调试 </summary> void OnGUI() { //GUI.Label(GetRect(0.1f, 0.05f), "Attitude: " + Input.gyro.attitude); //GUI.Label(GetRect(0.1f, 0.15f), "Rotation: " + Input.gyro.rotationRate); //GUI.Label(GetRect(0.1f, 0.25f), "RotationUnbiased: " + Input.gyro.rotationRateUnbiased); //GUI.Label(GetRect(0.1f, 0.35f), "UserAcceleration: " + Input.gyro.userAcceleration); //// 陀螺仪的系数 //{ // string t_factor_str = GUI.TextField(GetRect(0.7f, 0.05f), "" + GyroFactor); // GyroFactor = float.Parse(t_factor_str); //} //// 陀螺仪输入参数 //{ // if (GUI.Button(GetRect(0.8f, 0.8f, 0.2f), "" + GyroInputType)) // { // switch (GyroInputType) // { // case EGyroInputType.RotateRate: // GyroInputType = EGyroInputType.RotateRateUniased; // break; // case EGyroInputType.RotateRateUniased: // GyroInputType = EGyroInputType.UserAcceleration; // break; // case EGyroInputType.UserAcceleration: // GyroInputType = EGyroInputType.RotateRate; // break; // } // } //} } // Update is called once per frame void Update() { // 设置陀螺仪更新频率 Input.gyro.updateInterval = 1.0f / m_upate_rate; // 根据陀螺仪计算相机的控制数据 UpdateGyro(); // Editor下的调试 #if UNITY_EDITOR // 开发环境下不能用陀螺仪,模拟数据 GyroInput = m_editor_debug_input; #endif // 因值不确定范围,需增加系数控制 GyroInput = GyroInput * GyroFactor; // 根据控制数据,对相机进行操作和变化 UpdateCamera(); } #endregion #region 控制逻辑 /// <summary> 更新陀螺仪数据,并计算出相应的控制数据 </summary> protected void UpdateGyro() { // 更新陀螺仪数据,并计算出控制变量 switch (GyroInputType) { //手机上左倾斜x是负值,又倾斜x是正值。上倾斜y是负值,下倾斜y是正值 case EGyroInputType.RotateRate: GyroInput = Input.gyro.rotationRate; break; case EGyroInputType.RotateRateUniased: GyroInput = Input.gyro.rotationRateUnbiased; break; case EGyroInputType.UserAcceleration: GyroInput = Input.gyro.userAcceleration; break; default: Debug.LogError("GyroInputTypeNot defined: " + GyroInputType); break; } } /// <summary> 更新相机的行为 </summary> protected void UpdateCamera() { // 不需要gyro的z参数 #if UNITY_EDITOR Vector3 t_gyro_input = new Vector3(GyroInput.x, GyroInput.y, GyroInput.z); #else Vector3 t_gyro_input = new Vector3(0.0f, GyroInput.y, GyroInput.x); #endif CurEuler += t_gyro_input; // 范围控制 { float t_x = ClampFloat(CurEuler.x, m_camera_init_euler.x, m_gyro_max_x); float t_y = ClampFloat(CurEuler.y, m_camera_init_euler.y, m_gyro_max_y); float t_z = ClampFloat(CurEuler.z, m_camera_init_euler.z, m_gyro_max_z); CurEuler = new Vector3(t_x, t_y, t_z); } mTransform.localEulerAngles = CurEuler; } #endregion #region 支持函数 protected float ClampFloat(float p_float, float p_init, float p_offset) { p_offset = Mathf.Abs(p_offset); if (p_float > p_init + p_offset) { p_float = p_init + p_offset; } if (p_float < p_init - p_offset) { p_float = p_init - p_offset; } return p_float; } /// <summary> 根据百分比获取gui的大概坐标 </summary> protected Rect GetRect(float p_x_percent, float p_y_percent, float p_w = 0.5f, float p_h = 0.1f) { return new Rect( Screen.width * p_x_percent, Screen.height * p_y_percent, Screen.width * p_w, Screen.height * p_h); } #endregion } }
将脚本挂在想被陀螺仪操控的节点上就ok了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。
下一篇: C# 使用GDI绘制雷达图的实例
相关文章
C#中图片旋转和翻转(RotateFlipType)用法分析
这篇文章主要介绍了C#中图片旋转和翻转(RotateFlipType)用法,实例分析了C#图片旋转及翻转Image.RotateFlip方法属性的常用设置技巧,需要的朋友可以参考下...2020-06-25- 本文主要介绍了jQuery制作图片旋转效果的示例代码。具有很好的参考价值,下面跟着小编一起来看下吧...2017-02-08
- 这篇文章主要为大家详细介绍了Unity3D UGUI实现翻书特效,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 本文主要介绍了js实现图片360度旋转的思路与方法。具有很好的参考价值,下面跟着小编一起来看下吧...2017-01-26
- 这篇文章主要介绍了JavaScript图片旋转效果实现方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-29
- 这篇文章主要介绍了unity 实现摄像机绕某点旋转一周,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
- 这篇文章主要为大家详细介绍了Unity3D实现飞机大战游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-11-03
- 这篇文章主要为大家详细介绍了Unity3D使用GL实现图案解锁功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要介绍了jquery实现可旋转可拖拽的文字效果代码,涉及jquery响应鼠标事件动态操作页面元素样式的相关技巧,需要的朋友可以参考下...2016-01-30
Unity3D游戏开发数据持久化PlayerPrefs的用法详解
在本篇文章里小编给大家整理了关于Unity3D游戏开发之数据持久化PlayerPrefs的使用的相关知识点内容,需要的朋友们参考下。...2020-06-25- 这篇文章主要介绍了Unity3D基于OnGUI实时显示FPS,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要为大家详细介绍了Unity3D仿写Button面板事件绑定功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要为大家详细介绍了unity3D实现三维物体跟随鼠标,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这个是在网上看到的,经测试可以在电脑上运行,确实调用了本地摄像头。有需要的小伙伴可以参考下。...2020-06-25
- 这篇文章主要为大家详细介绍了Unity3D Shader实现镜子效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要为大家详细介绍了Unity3D实现待机状态图片循环淡入淡出,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要为大家详细介绍了Unity3D Shader实现动态屏幕遮罩效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要为大家详细介绍了Unity3D使用UGUI开发原生虚拟摇杆,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要为大家详细介绍了Unity3D UGUI特效之Image高斯模糊效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要为大家详细介绍了Unity实现绕任意轴任意角度旋转向量,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25