Unity3D使用陀螺仪控制节点旋转

所属分类: 软件编程 / C#教程 阅读数: 113
收藏 0 赞 0 分享

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

c#开发word批量转pdf源码分享

已经安装有Office环境,借助一些简单的代码即可实现批量Word转PDF,看下面的实例源码吧
收藏 0 赞 0 分享

c# xml API操作的小例子

这篇文章主要介绍了c# xml API操作的小例子,有需要的朋友可以参考一下
收藏 0 赞 0 分享

c#唯一值渲染实例代码

这篇文章主要介绍了c#唯一值渲染实例代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

淘宝IP地址库采集器c#代码

这篇文章主要介绍了淘宝IP地址库采集器c#代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

C#在后台运行操作(BackgroundWorker用法)示例分享

BackgroundWorker类允许在单独的专用线程上运行操作。如果需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用BackgroundWorker类方便地解决问题,下面看示例
收藏 0 赞 0 分享

c#文本加密程序代码示例

这是一个加密软件,但只限于文本加密,加了窗口控件的滑动效果,详细看下面的代码
收藏 0 赞 0 分享

c#生成站点地图(SiteMapPath)文件示例程序

这篇文章主要介绍了c#生成站点地图(SiteMapPath)文件的示例,大家参考使用
收藏 0 赞 0 分享

C# 键盘Enter键取代Tab键实现代码

这篇文章主要介绍了C# 键盘Enter键取代Tab键实现代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

C# WinForm导出Excel方法介绍

在.NET应用中,导出Excel是很常见的需求,导出Excel报表大致有以下三种方式:Office PIA,文件流和NPOI开源库,本文只介绍前两种方式
收藏 0 赞 0 分享

C#串口通信程序实例详解

在.NET平台下创建C#串口通信程序,.NET 2.0提供了串口通信的功能,其命名空间是System.IO.Ports,创建C#串口通信程序的具体实现是如何的呢?让我们开始吧
收藏 0 赞 0 分享
查看更多