Unity 根据手机陀螺仪,实现流动UI效果
Unity 根据手机陀螺仪,实现流动UI效果

设置Canvas

模式设置为 Screen Space - Camera
指定Camera
挂载脚本
挂载Target
using System;
using UnityEngine; [Serializable]
public class SetUp
{
[Tooltip("敏感度")]
public float sensitivity = 15f; //敏感度 [Tooltip("最大水平移动速度")]
public float maxturnSpeed = 30f; [Tooltip("最大垂直傾斜角移动速度")]
public float maxTilt = 30f; [Tooltip("位移加成速率")]
public float posRate = 1.5f;
} public class MobileScreenOrientation : MonoBehaviour
{ public enum MotionAxial
{
All = , //全部轴
None = ,
x = ,
y = ,
z =
} public enum MotionMode
{
Postion = , //只是位置辩护
Rotation = ,
All = //全部变化
} //就是这里比较笨了。本来使用UnityEditor类库的多选功能。但是这个类库不支持移动平台。
public MotionAxial motionAxial1 = MotionAxial.y;
public MotionAxial motionAxial2 = MotionAxial.None; public MotionMode motionMode = MotionMode.Rotation; //运动模式 public SetUp setUp; public GameObject tager; //被移动的对象 Vector3 m_MobileOrientation; //手机陀螺仪变化的值 Vector3 m_tagerTransform;
Vector3 m_tagerPos;
public Vector3 ReversePosition = Vector3.one; //基于陀螺仪方向的取反 void Awake()
{
Screen.orientation = ScreenOrientation.Landscape;
m_tagerTransform = Vector3.zero;
m_tagerPos = Vector3.zero; } void LateUpdate()
{
if (tager == null)
return; m_MobileOrientation = Input.acceleration; if (motionAxial1 == MotionAxial.None && motionAxial2 == MotionAxial.None) //不操作任何轴
return;
else if (motionAxial1 == MotionAxial.x && motionAxial2 == MotionAxial.None) // X轴
{
m_tagerTransform.x = Mathf.Lerp(m_tagerTransform.x, m_MobileOrientation.y * setUp.maxTilt * ReversePosition.x, 0.2f);
}
else if (motionAxial1 == MotionAxial.y && motionAxial2 == MotionAxial.None) //Y 轴
{
m_tagerTransform.y = Mathf.Lerp(m_tagerTransform.y, -m_MobileOrientation.x * setUp.maxturnSpeed * ReversePosition.y, 0.2f);
}
else if (motionAxial1 == MotionAxial.z && motionAxial2 == MotionAxial.None) // z轴
{
m_tagerTransform.z = Mathf.Lerp(m_tagerTransform.z, -m_MobileOrientation.z * setUp.maxTilt * ReversePosition.z, 0.2f);
}
else if (motionAxial1 == MotionAxial.x && motionAxial2 == MotionAxial.y) // X和Y轴
{
m_tagerTransform.y = Mathf.Lerp(m_tagerTransform.y, -m_MobileOrientation.x * setUp.maxturnSpeed * ReversePosition.y, 0.2f);
m_tagerTransform.x = Mathf.Lerp(m_tagerTransform.x, m_MobileOrientation.y * setUp.maxTilt * ReversePosition.x, 0.2f);
}
else if (motionAxial1 == MotionAxial.y && motionAxial2 == MotionAxial.x) // Y和X轴
{
m_tagerTransform.y = Mathf.Lerp(m_tagerTransform.y, -m_MobileOrientation.x * setUp.maxturnSpeed * ReversePosition.y, 0.2f);
m_tagerTransform.x = Mathf.Lerp(m_tagerTransform.x, m_MobileOrientation.y * setUp.maxTilt * ReversePosition.x, 0.2f);
}
else if (motionAxial1 == MotionAxial.x && motionAxial2 == MotionAxial.z) // x 和 Z 轴
{
m_tagerTransform.x = Mathf.Lerp(m_tagerTransform.x, m_MobileOrientation.y * setUp.maxTilt * ReversePosition.x, 0.2f);
m_tagerTransform.z = Mathf.Lerp(m_tagerTransform.z, -m_MobileOrientation.z * setUp.maxTilt * ReversePosition.z, 0.2f);
}
else if (motionAxial1 == MotionAxial.z && motionAxial2 == MotionAxial.x) // Z 和 X 轴
{
m_tagerTransform.x = Mathf.Lerp(m_tagerTransform.x, m_MobileOrientation.y * setUp.maxTilt * ReversePosition.x, 0.2f);
m_tagerTransform.z = Mathf.Lerp(m_tagerTransform.z, -m_MobileOrientation.z * setUp.maxTilt * ReversePosition.z, 0.2f);
}
else if (motionAxial1 == MotionAxial.y && motionAxial2 == MotionAxial.z) // Y和Z 轴
{
m_tagerTransform.y = Mathf.Lerp(m_tagerTransform.y, -m_MobileOrientation.x * setUp.maxturnSpeed * ReversePosition.y, 0.2f);
m_tagerTransform.z = Mathf.Lerp(m_tagerTransform.z, -m_MobileOrientation.z * setUp.maxTilt * ReversePosition.z, 0.2f);
}
else if (motionAxial1 == MotionAxial.z && motionAxial2 == MotionAxial.y) // Z和 Y轴
{
m_tagerTransform.y = Mathf.Lerp(m_tagerTransform.y, -m_MobileOrientation.x * setUp.maxturnSpeed * ReversePosition.y, 0.2f);
m_tagerTransform.z = Mathf.Lerp(m_tagerTransform.z, -m_MobileOrientation.z * setUp.maxTilt * ReversePosition.z, 0.2f);
}
else if (motionAxial1 == MotionAxial.All && motionAxial2 == MotionAxial.All) // 所有轴向都运动
{
m_tagerTransform.y = Mathf.Lerp(m_tagerTransform.y, -m_MobileOrientation.x * setUp.maxturnSpeed * ReversePosition.y, 0.2f);
m_tagerTransform.x = Mathf.Lerp(m_tagerTransform.x, m_MobileOrientation.y * setUp.maxTilt * ReversePosition.x, 0.2f);
m_tagerTransform.z = Mathf.Lerp(m_tagerTransform.z, m_MobileOrientation.z * setUp.maxTilt * ReversePosition.z, 0.2f);
} m_tagerPos.x = m_tagerTransform.y;
m_tagerPos.y = -m_tagerTransform.x;
m_tagerPos.z = m_tagerTransform.z; if (motionMode == MotionMode.Postion)
{
tager.transform.localPosition = Vector3.Lerp(tager.transform.localPosition, m_tagerPos * setUp.posRate, Time.deltaTime * setUp.sensitivity);
}
else if (motionMode == MotionMode.Rotation)
{
tager.transform.localRotation = Quaternion.Lerp(tager.transform.localRotation, Quaternion.Euler(m_tagerTransform), Time.deltaTime * setUp.sensitivity);
}
else
{
tager.transform.localPosition = Vector3.Lerp(tager.transform.localPosition, m_tagerPos * setUp.posRate, Time.deltaTime * setUp.sensitivity);
tager.transform.localRotation = Quaternion.Lerp(tager.transform.localRotation, Quaternion.Euler(m_tagerTransform), Time.deltaTime * setUp.sensitivity);
}
} }
转自博主 KitStar https://blog.csdn.net/KiTok/article/details/77073860 如有侵权,请告知!
Unity 根据手机陀螺仪,实现流动UI效果的更多相关文章
- 50个Android开发人员必备UI效果源码[转载]
50个Android开发人员必备UI效果源码[转载] http://blog.csdn.net/qq1059458376/article/details/8145497 Android 仿微信之主页面 ...
- Unity 自己使用顶点描绘圆形UI图片
2020-09-10 在游戏的UI中,圆形图片的需求是很高的,但是,在Unity中想要实现圆形UI,一般的做法是是使用圆形Mask(遮罩),但是使用Mask的缺点很明显,主要有三点: 1.比较麻烦,使 ...
- 【Android源代码下载】收集整理android界面UI效果源码
在Android开发中,Android界面UI效果设计一直都是很多童鞋关注的问题,今天给大家分享下大神收集整理的多个android界面UI效果,都是源码,都是干货,贡献给各位网友! 话不多说,直接上效 ...
- Android UI效果实现——滑动模糊渐变效果实现
前言: 大家应该都看到过iOS7解锁屏幕的滑动模糊渐变效果,好了,现在可以把手纸收起来了,今天黄老师就给大家讲一下如何在Android平台上 实现类似的滑动模糊渐变效果,其实方式远比你想像的简单. 目 ...
- [转载] 50个Android开发人员必备UI效果源码
好东西,多学习! Android 仿微信之主页面实现篇Android 仿微信之界面导航篇Android 高仿QQ 好友分组列表Android 高仿QQ 界面滑动效果Android 高仿QQ 登陆界面A ...
- html5调用手机陀螺仪实现方向辨识
获取移动设备的陀螺仪,需要知道陀螺仪包含什么. 我们可以让document监听deviceorientation 来获取相关的数据,里面包括3个值 alpha.beta和gamma. 这三个值分别代表 ...
- 锋利的jQuery-7--query ui效果库--拖动排序插件sortable
一个简单的拖动排序效果,具体请参看jQuery ui官网demo. jquery ui :http://jqueryui.com/ sortable例子:http://jqueryui.com/sor ...
- Unity之2D Sprite Outline外轮廓效果
操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Unity5.3.8f1 Unity提供了2D Object Sprite对象,但是没有提供外轮廓Outline效果的支持 ...
- 安卓高级5 传感器和震动 模仿微信摇一摇Ui效果
效果图: 所用的Ui就三张图: 案例代码: 结构 MainActivity.java package com.example.myapp; import android.content.Intent; ...
随机推荐
- Oracle数据库查询所有关键字
管理员账户登录后,执行以下命令: select * from v$reserved_words
- 学习了clipboard复制剪切插件的使用
第一步:引入clipboard插件JS <script src="dist/clipboard.min.js"></script> 第二步:在HTML代码加 ...
- Oracle 12C执行root.sh CLSRSC-119 CRS-8503 CLSRSC-366
1.环境 OS:SUSE Linux Enterprise 12 SP3 X86_64 (Kernel: 4.4.162-94.69.2) DB:12.2.0.1 两节点RAC 参考文档:在 SLES ...
- mac 安装robot framework报错:No matching distribution found for Pywin32
运行 pip install robotframework-ride ,出现以下错误 解决办法:修改Python的运行方式,需要32位的python运行 defaults write com.ap ...
- JS 获取最近(前)7天(一周内)和最近(前)3天日期
//获取最近7天日期 getDay(0);//当天日期 getDay(-7);//7天前日期 //获取最近3天日期 getDay(0);//当天日期 getDay(-3);//3天前日期 functi ...
- Vue学习之路---No.3(分享心得,欢迎批评指正)
同样的,我们先来回顾一下昨天学习的内容: 1.利用v-once来组织双向绑定 2.filter{}过滤器的使用(详情请看上一章) 3.computed(计算属性),利用computed属性实现filt ...
- 搭建Karma+Jasmine的自动化单元测试
最近在打算将以前的代码进行重构,过程中发现自己不写自动化测试代码,而是手动的写,这样并不好,所以就学了Karma+Jasmine的自动化单元测试,以后写代码尽量要写自动化单元测试,也要测一下istan ...
- 制作Win10 U盘版移动便携系统
制作U盘Win10 灌装WIM VHD_OneKey_beta2 把wim导入VHD文件 复制 WIN8USB.VHD boot bootmgr三个文件到U盘 把制作的Win10的VHD文件重命名为 ...
- lotus domino 软件学习网站(自己收藏的)
lotus domino 软件学习网站(自己收藏的) 我学习lotus domino时间也不是很长,相比较学习lotus,学习java的时间还是比较长的,刚开始看网上的说法都是不看好lotus的, 但 ...
- 《linux 必读》
1. linux 内核设计与实现 2. 深入理解 linux 内核