Unity3D使用陀螺儀控制節(jié)點旋轉(zhuǎn)
更新時間:2019年11月01日 17:06:40 作者:monk_CD
這篇文章主要為大家詳細介紹了Unity3D使用陀螺儀控制節(jié)點旋轉(zhuǎn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了Unity3D陀螺儀控制節(jié)點旋轉(zhuǎn)的具體代碼,供大家參考,具體內(nèi)容如下
/********************************************************************
Desc: 陀螺儀對相機的邏輯類。
*********************************************************************/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
namespace Game.Gyro
{
/// <summary>
/// 職責:
/// 1.實現(xiàn)陀螺儀對相機的影響和操作;
/// 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ù),用以控制相機 </summary>
public Vector3 m_gyro_input = Vector3.zero;
/// <summary> 當前的攝像機角度 </summary>
public Vector3 m_cur_euler = Vector3.zero;
/// <summary> 陀螺儀數(shù)據(jù)的更新頻率 </summary>
public int m_upate_rate = 30;
/// <summary> 當前陀螺儀的輸入輸入類型 </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ù),用以控制相機 </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> 當前的旋轉(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()
{
// 設置陀螺儀更新頻率
Input.gyro.updateInterval = 1.0f / m_upate_rate;
// 根據(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ù),對相機進行操作和變化
UpdateCamera();
}
#endregion
#region 控制邏輯
/// <summary> 更新陀螺儀數(shù)據(jù),并計算出相應的控制數(shù)據(jù) </summary>
protected void UpdateGyro()
{
// 更新陀螺儀數(shù)據(jù),并計算出控制變量
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參數(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的大概坐標 </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é)點上就ok了。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- Unity實現(xiàn)人物旋轉(zhuǎn)和移動效果
- Unity實現(xiàn)物體沿自身的任意軸向旋轉(zhuǎn)
- Unity實現(xiàn)繞任意軸任意角度旋轉(zhuǎn)向量
- Unity向量按照某一點進行旋轉(zhuǎn)
- Unity3D使用鼠標旋轉(zhuǎn)縮放平移視角
- Unity實現(xiàn)旋轉(zhuǎn)扭曲圖像特效
- Unity3D實現(xiàn)物體旋轉(zhuǎn)縮放移動效果
- Unity3D實現(xiàn)鼠標控制旋轉(zhuǎn)轉(zhuǎn)盤
- Unity控制指針旋轉(zhuǎn)到指定位置
- Unity實現(xiàn)鼠標點2D轉(zhuǎn)3D進行旋轉(zhuǎn)
相關文章
C#實現(xiàn)可緩存網(wǎng)頁到本地的反向代理工具實例
這篇文章主要介紹了C#實現(xiàn)可緩存網(wǎng)頁到本地的反向代理工具,實例分析了C#實現(xiàn)反向代理的相關技巧,非常具有實用價值,需要的朋友可以參考下2015-04-04
C#數(shù)據(jù)結(jié)構(gòu)之堆棧(Stack)實例詳解
這篇文章主要介紹了C#數(shù)據(jù)結(jié)構(gòu)之堆棧(Stack),結(jié)合實例形式較為詳細的分析了堆棧的原理與C#實現(xiàn)堆棧功能的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-11-11

