Unity3D使用陀螺儀控制節(jié)點(diǎn)旋轉(zhuǎn)
本文實(shí)例為大家分享了Unity3D陀螺儀控制節(jié)點(diǎn)旋轉(zhuǎn)的具體代碼,供大家參考,具體內(nèi)容如下
/******************************************************************** Desc: 陀螺儀對(duì)相機(jī)的邏輯類。 *********************************************************************/ using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using UnityEngine; namespace Game.Gyro { /// <summary> /// 職責(zé): /// 1.實(shí)現(xiàn)陀螺儀對(duì)相機(jī)的影響和操作; /// 2.盡量重現(xiàn)崩壞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開發(fā)環(huán)境下的模擬陀螺儀輸入 </summary> public Vector3 m_editor_debug_input = Vector3.zero; /// <summary> 陀螺儀的輸入?yún)?shù),用以控制相機(jī) </summary> public Vector3 m_gyro_input = Vector3.zero; /// <summary> 當(dāng)前的攝像機(jī)角度 </summary> public Vector3 m_cur_euler = Vector3.zero; /// <summary> 陀螺儀數(shù)據(jù)的更新頻率 </summary> public int m_upate_rate = 30; /// <summary> 當(dāng)前陀螺儀的輸入輸入類型 </summary> public EGyroInputType m_gyro_input_type = EGyroInputType.RotateRate; /// <summary> 陀螺儀的系數(shù) </summary> public float m_gyro_factor = 1.0f; private Vector3 m_camera_init_euler = Vector3.zero; private Transform mTransform; #endregion #region 訪問接口 /// <summary> 陀螺儀的輸入?yún)?shù),用以控制相機(jī) </summary> protected Vector3 GyroInput { get { return m_gyro_input; } set { m_gyro_input = value; } } /// <summary> 陀螺儀輸入數(shù)據(jù)的類型 </summary> protected EGyroInputType GyroInputType { get { return m_gyro_input_type; } set { m_gyro_input_type = value; } } /// <summary> 陀螺儀的系數(shù) </summary> protected float GyroFactor { get { return m_gyro_factor; } set { m_gyro_factor = value; } } /// <summary> 當(dāng)前的旋轉(zhuǎn)角 </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,方便調(diào)試 </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); //// 陀螺儀的系數(shù) //{ // string t_factor_str = GUI.TextField(GetRect(0.7f, 0.05f), "" + GyroFactor); // GyroFactor = float.Parse(t_factor_str); //} //// 陀螺儀輸入?yún)?shù) //{ // 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() { // 設(shè)置陀螺儀更新頻率 Input.gyro.updateInterval = 1.0f / m_upate_rate; // 根據(jù)陀螺儀計(jì)算相機(jī)的控制數(shù)據(jù) UpdateGyro(); // Editor下的調(diào)試 #if UNITY_EDITOR // 開發(fā)環(huán)境下不能用陀螺儀,模擬數(shù)據(jù) GyroInput = m_editor_debug_input; #endif // 因值不確定范圍,需增加系數(shù)控制 GyroInput = GyroInput * GyroFactor; // 根據(jù)控制數(shù)據(jù),對(duì)相機(jī)進(jìn)行操作和變化 UpdateCamera(); } #endregion #region 控制邏輯 /// <summary> 更新陀螺儀數(shù)據(jù),并計(jì)算出相應(yīng)的控制數(shù)據(jù) </summary> protected void UpdateGyro() { // 更新陀螺儀數(shù)據(jù),并計(jì)算出控制變量 switch (GyroInputType) { //手機(jī)上左傾斜x是負(fù)值,又傾斜x是正值。上傾斜y是負(fù)值,下傾斜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> 更新相機(jī)的行為 </summary> protected void UpdateCamera() { // 不需要gyro的z參數(shù) #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 支持函數(shù) 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> 根據(jù)百分比獲取gui的大概坐標(biāo) </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 } }
將腳本掛在想被陀螺儀操控的節(jié)點(diǎn)上就ok了。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Unity實(shí)現(xiàn)人物旋轉(zhuǎn)和移動(dòng)效果
- Unity實(shí)現(xiàn)物體沿自身的任意軸向旋轉(zhuǎn)
- Unity實(shí)現(xiàn)繞任意軸任意角度旋轉(zhuǎn)向量
- Unity向量按照某一點(diǎn)進(jìn)行旋轉(zhuǎn)
- Unity3D使用鼠標(biāo)旋轉(zhuǎn)縮放平移視角
- Unity實(shí)現(xiàn)旋轉(zhuǎn)扭曲圖像特效
- Unity3D實(shí)現(xiàn)物體旋轉(zhuǎn)縮放移動(dòng)效果
- Unity3D實(shí)現(xiàn)鼠標(biāo)控制旋轉(zhuǎn)轉(zhuǎn)盤
- Unity控制指針旋轉(zhuǎn)到指定位置
- Unity實(shí)現(xiàn)鼠標(biāo)點(diǎn)2D轉(zhuǎn)3D進(jìn)行旋轉(zhuǎn)
相關(guān)文章
C#實(shí)現(xiàn)可緩存網(wǎng)頁到本地的反向代理工具實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)可緩存網(wǎng)頁到本地的反向代理工具,實(shí)例分析了C#實(shí)現(xiàn)反向代理的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04C#五類運(yùn)算符使用表達(dá)式樹進(jìn)行操作
這篇文章介紹了C#五類運(yùn)算符使用表達(dá)式樹進(jìn)行操作,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01Python設(shè)計(jì)模式編程中的備忘錄模式與對(duì)象池模式示例
這篇文章主要介紹了Python設(shè)計(jì)模式編程中的備忘錄模式與對(duì)象池模式,文中分別舉了表單和線程的相關(guān)示例,需要的朋友可以參考下2016-02-02C#數(shù)據(jù)結(jié)構(gòu)之堆棧(Stack)實(shí)例詳解
這篇文章主要介紹了C#數(shù)據(jù)結(jié)構(gòu)之堆棧(Stack),結(jié)合實(shí)例形式較為詳細(xì)的分析了堆棧的原理與C#實(shí)現(xiàn)堆棧功能的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11c#基礎(chǔ)知識(shí)---委托,匿名函數(shù),lambda
這篇文章主要介紹了c# 委托,匿名函數(shù),lambda的相關(guān)知識(shí),文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-06-06