Unity3D使用陀螺儀控制節點旋轉
阿新 • • 發佈:2020-01-07
本文例項為大家分享了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,"" + 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.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了。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。