1. 程式人生 > 程式設計 >Unity3D使用陀螺儀控制節點旋轉

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

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。