国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

Unity3D使用陀螺儀控制節點旋轉

2020-01-23 20:46:45
字體:
來源:轉載
供稿:網友

本文實例為大家分享了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了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 边坝县| 阜康市| 中山市| 囊谦县| 惠来县| 金山区| 泸溪县| 顺昌县| 贵阳市| 五常市| 光泽县| 阿尔山市| 洛阳市| 保靖县| 临朐县| 酒泉市| 兴宁市| 上犹县| 黄大仙区| 三穗县| 明水县| 长顺县| 科尔| 田林县| 论坛| 张家口市| 昔阳县| 恩施市| 胶南市| 漳浦县| 上思县| 广州市| 金坛市| 阜平县| 高密市| 油尖旺区| 赤壁市| 墨竹工卡县| 景德镇市| 湖州市| 周口市|