/********************************************************************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 initializationvoid 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 framevoid 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_EDITORVector3 t_gyro_input = new Vector3(GyroInput.x, GyroInput.y, GyroInput.z);
#elseVector3 t_gyro_input = new Vector3(0.0f, GyroInput.y, GyroInput.x);
#endifCurEuler += 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了

unity 陀螺仪控制节点旋转相关推荐

  1. unity鼠标控制镜头旋转_Unity3D实现鼠标控制视角转动|chu

    前面,学了物体的移动功能,现在来学一下C#实现鼠标控制摄像机(视角)移动. 代码如下: C#脚本(在Unity 5.5.1 下能运行): using System.Collections; using ...

  2. unity鼠标控制镜头旋转_unity3D鼠标滚轮来实现镜头拉近拉远及视角旋转

    镜头拉近拉远的代码(无限拉远拉近) 代码如下: if( Input.GetAxis("Mouse ScrollWheel") != 0 ) { this.gameObject.tr ...

  3. unity鼠标控制镜头旋转_Unity Camera教程之 摄像机跟随鼠标移动而旋转

    FollowMouseMove 脚本具体内容如下: using UnityEngine; public class FollowMouseMove : MonoBehaviour { public f ...

  4. Unity 陀螺仪姿态识别、 控制物体旋转移动

    陀螺仪在Unity中最常用的应用就是控制摄像机的旋转 using UnityEngine; using UnityEngine.UI; public class NewTest : MonoBehav ...

  5. Unity开发《一起来捉妖》教程 | 1.陀螺仪控制相机

    洪流学堂,让你快人几步.你好,我是郑洪智. 洪流学堂公众号回复捉妖,可以获取本教程的源码工程. 大智:"小新,你小子最近是不是谈恋爱了,怎么天天往外跑?" 小新:"嘿嘿& ...

  6. unity 陀螺仪 物体旋转和移动效果

    unity 陀螺仪 物体旋转和移动效果 直接上码 带注释 public class SDKGyroController : MonoBehaviour {//陀螺仪是否存在class GyroGame ...

  7. Unity鼠标控制摄像机 围绕物体旋转

    Unity鼠标控制摄像机 围绕物体旋转 角度范围判定 // An highlighted block using UnityEngine;public class CameraCtrl : MonoB ...

  8. Unity实现触摸屏手势控制镜头旋转与缩放

    一.关于 Unity实现触摸屏手势控制镜头旋转与缩放脚本 /*** * Title:"三维可视化" 项目 * 主题:手势控制物体的旋转缩放 * Description: * 功能: ...

  9. Unity Window触摸屏电脑和移动端Input触控,控制相机旋转缩放

    Unity Window触摸屏电脑和移动端Input触控,控制相机旋转缩放 原理就是获取手指滑动的偏移量,来计算 代码帖出来 using UnityEngine; using System; usin ...

最新文章

  1. 用对齐原则求结构体长度
  2. Struts学习之手动验证
  3. OpenCV中图像轮廓检测
  4. matlab中图像处理的基本函数(2)
  5. 动态类型语言和静态类型语言
  6. 正则判断windows文件路径是否正确
  7. linux上运行tcpserver没反应,linux网络编程/tcp_server中server bind失败原因的调研
  8. DeepL Pro(deepl翻译器)官方中文版V2.2.0 | 翻译软件哪个好用 | 翻译软件排行榜前十的神器
  9. Android 签名板
  10. 嵌入式c语言程序设计 万年历,C语言程序设计万年历
  11. python 微信开发库_WeRoBot 是一个微信公众号开发框架
  12. 【网络安全】永恒之蓝实战 - Mac通过Metasploit攻击Server2008
  13. 使用BIGMAP地图下载器,生成卫星地图
  14. 【CQF Finance Class 3 债券】
  15. stata面板数据gmm回归_stata面板数据回归操作之GMM
  16. 腾讯视频显示网络连接服务器失败,腾讯视频网络连接异常
  17. Vue全家桶打造自适应 web 音乐播放器
  18. 区块链安全分析:安全是重中之重,需要各方企业共同守护 | 新加坡Meetup
  19. 产品经理与程序员之间的孽缘发展历程
  20. 菜鸟的草缸 篇四:菜鸟的草缸:二氧化碳CO2

热门文章

  1. Mysql —— 索引的使用顺序
  2. php+mysql防注入字符串过滤_php 防sql注入过滤代码
  3. [C++]Linux之Ubuntu下编译C程序出现错误:“ stray ‘\302‘或者‘\240‘ in program”的解决方案
  4. 如何在vue项目中修改less变量,多主题项目解决方案
  5. 【jackson 异常】com.fasterxml.jackson.databind.JsonMappingException异常处理
  6. 使用内容脚本将代码插入页面上下文
  7. gradle指令linux守护,gradle之gradlew最全指令攻略
  8. java mvc .net mvc_.NET MVC 和 JAVA MVC有什么区别?
  9. win11任务栏卡死重启也没用怎么办
  10. linux用c++获取mac地址,网卡地址,网口地址,网卡序号ip地址,不使用 ioctl(sock, SIOCGIFCONF, ifc)获取网络接口名称,这个接口有时会返回-1获取不到,换方法获取