Unity 基础 之 实现简单监听晃动(摇一摇)手机设备震动手机设备的事件的功能

目录

Unity 基础 之 实现简单监听晃动(摇一摇)手机设备震动手机设备的事件的功能

一、简单介绍

二、知识点

三、实现原理

四、注意事项

五、实现步骤

六、关键代码


一、简单介绍

Unity中的一些基础知识点。

本节介绍,在 Unity 种,实现监听手机晃动(摇一摇)触发的事件,并震动手机的功能。

二、知识点

Unity简化了重力感应的开发, 通过访问Input.acceleration属性,取回加速度传感器的值;

Unity3D中重量的取值范围是 -1.0 到 +1.0;

X轴:home按键在下手机面朝天向右旋转90度重力分量为+1.0  向左旋转90度重力分量为-1.0

Y轴:home按键在上手机背朝自己重力分量为+1.0 home按键在下手机面朝自己重力分量为-1.0

Z轴:手机面朝地面重力分量为+1.0 手机面朝天空重力分量为-1.0

unity中使用Input.acceleration的x,y,z属性即可获得重力分量:

Input.acceleration.x; 重力感应X轴的重力分量

Input.acceleration.y; 重力感应Y轴的重力分量

Input.acceleration.z; 重力感应Z轴的重力分量

三、实现原理

1、监听 Input.acceleration.y, 重力感应Y轴的重力分量

2、当 Y轴的重力分量 变化差值查过一定数值,即可判定为晃动,触发晃动事件

四、注意事项

1、这里 监听 Input.acceleration.y, 重力感应Y轴的重力分量,你可以根据需要监听其他轴,或多轴监听产生不同效果

2、变化差值,根据需要进行调整,不唯一

五、实现步骤

1、打开 Unity ,新建工程

2、在工程中新建脚本,ShakePhoneWithVibrateWrapper 实现晃动手机触发震动的功能,MonoSingleton 单例,TestShakePhonrWithVibrateWrapper 测试 ShakePhoneWithVibrateWrapper  脚本功能

3、TestShakePhonrWithVibrateWrapper  挂载到场景中

4、打包到手机设备上测试

5、晃动(摇一摇)手机,触发 震动事件

六、关键代码

1、ShakePhoneWithVibrateWrapper

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;namespace XANTools
{/// <summary>/// 摇一摇且震动手机功能/// 知识点:/// 1、Unity简化了重力感应的开发, 通过访问Input.acceleration属性,取回加速度传感器的值;/// 2、首先我们看一下重力传感器的方向问题。Unity3D中重量的取值范围是 -1.0 到 +1.0;/// </summary>public class ShakePhoneWithVibrateWrapper : MonoSingleton<ShakePhoneWithVibrateWrapper>{//手机晃动的有效距离public float Distance { get => distance;set {distance = Mathf.Clamp01(value);}}/// <summary>/// 初始化摇一摇功能/// </summary>/// <param name="shakeListener">摇一摇触发后的监听事件</param>/// <param name="shakeSensitive">摇一摇的的敏感度(0,1)</param>public void Init(Action shakeListener ,float shakeSensitive =0.5f){shakeAction = shakeListener;Distance = shakeSensitive;}void Update(){Shake();}/// <summary>/// 摇一摇功能/// </summary>void Shake() {new_y = Input.acceleration.y;currentShakeDistance = new_y - old_y;old_y = new_y;if (currentShakeDistance > Distance){//实现手机晃动震动效果 Handheld.Vibrate();// 摇一摇事件if (shakeAction != null) {shakeAction();}}}//记录上一次的重力感应的Y值private float old_y = 0;//记录当前的重力感应的Y值private float new_y;//当前手机晃动的距离private float currentShakeDistance = 0;//手机晃动的有效距离private float distance = 0.75f;// 触发摇一摇震动后的委托事件Action shakeAction;}
}

2、TestShakePhonrWithVibrateWrapper

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XANTools;public class TestShakePhonrWithVibrateWrapper : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){ShakePhoneWithVibrateWrapper.Instance.Init(() =>  Debug.Log("触发摇一摇震动事件"));}}

3、MonoSingleton

using UnityEngine;public abstract class MonoSingleton<T> : MonoBehaviour where T : MonoBehaviour
{private static T instance = null;private static readonly object locker = new object();private static bool bAppQuitting;public static T Instance{get{if (bAppQuitting){instance = null;return instance;}lock (locker){if (instance == null){// 保证场景中只有一个 单例T[] managers = Object.FindObjectsOfType(typeof(T)) as T[];if (managers.Length != 0){if (managers.Length == 1){instance = managers[0];instance.gameObject.name = typeof(T).Name;return instance;}else{Debug.LogError("Class " + typeof(T).Name + " exists multiple times in violation of singleton pattern. Destroying all copies");foreach (T manager in managers){Destroy(manager.gameObject);}}}var singleton = new GameObject();instance = singleton.AddComponent<T>();singleton.name = "(singleton)" + typeof(T);singleton.hideFlags = HideFlags.None;DontDestroyOnLoad(singleton);}instance.hideFlags = HideFlags.None;return instance;}}}protected virtual void Awake(){bAppQuitting = false;}protected virtual void OnDestroy(){bAppQuitting = true;}
}

备注:ShakePhoneWithVibrateWrapper Update 监听可能会监听不到,可以协程监听

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;namespace XANTools
{/// <summary>/// 摇一摇且震动手机功能/// 知识点:/// 1、Unity简化了重力感应的开发, 通过访问Input.acceleration属性,取回加速度传感器的值;/// 2、首先我们看一下重力传感器的方向问题。Unity3D中重量的取值范围是 -1.0 到 +1.0;/// </summary>public class ShakePhoneWithVibrateWrapper : MonoSingleton<ShakePhoneWithVibrateWrapper>{//手机晃动的有效距离public float Distance { get => distance;set {distance = Mathf.Clamp01(value);}}/// <summary>/// 初始化摇一摇功能/// </summary>/// <param name="shakeListener">摇一摇触发后的监听事件</param>/// <param name="shakeSensitive">摇一摇的的敏感度(0,1)</param>public void Init(Action shakeListener ,float shakeSensitive =0.5f){shakeAction = shakeListener;Distance = shakeSensitive;StartCoroutine(ShakeCor());}void Update(){//Shake();}IEnumerator ShakeCor() {Debug.Log(GetType()+"/Shake Init OK ,Start to Listen/");while (true) {yield return new WaitForEndOfFrame();Shake();// 触发一次摇一摇后,间隔一定时间再次监听if (isShake ==true){yield return new WaitForSeconds(intervalShakeTime);isShake = false;}}}/// <summary>/// 摇一摇功能/// </summary>void Shake() {new_y = Input.acceleration.y;currentShakeDistance_y = new_y - old_y;old_y = new_y;new_x = Input.acceleration.x;currentShakeDistance_x = new_x - old_x;old_x = new_x;if (currentShakeDistance_y > Distance || currentShakeDistance_x > Distance){isShake = true;// 摇一摇事件if (shakeAction != null) {shakeAction();}//实现手机晃动震动效果 Handheld.Vibrate();Debug.Log(GetType() + "/Shake .../");}}//记录上一次的重力感应的Y值private float old_y = 0;//记录当前的重力感应的Y值private float new_y;//当前手机晃动的距离private float currentShakeDistance_y = 0;//记录上一次的重力感应的X值private float old_x = 0;//记录当前的重力感应的X值private float new_x;//当前手机晃动的距离private float currentShakeDistance_x = 0;//手机晃动的有效距离private float distance = 0.75f;// 触发摇一摇震动后的委托事件Action shakeAction;// 是否触发bool isShake = false;// 触发一次的间隔时间float intervalShakeTime = 0.1f;}
}

Unity 基础 之 实现简单监听晃动(摇一摇)手机设备震动手机设备的事件的功能相关推荐

  1. Unity 基础 之 代码动态监听UI交互组件汇总

    一,Button组件 按钮组件:可响应用户的点击并用于启动或确认操作. 1.1 组件介绍 属性: Interactible:此属性确定该组件是否接受输入.此属性设置为 false 时,交互被禁用,过渡 ...

  2. Python黑客编程基础3网络数据监听和过滤

    Python黑客编程3网络数据监听和过滤 课程的实验环境如下: •      操作系统:kali Linux 2.0 •      编程工具:Wing IDE •      Python版本:2.7. ...

  3. JavaScript监听页面的关闭、刷新和最小化、onload事件、ctrlKey、altKey事件

    visibilitychange事件是指当浏览器的某个标签页切换到后台或者从后台切换到前台时,会触发该事件.可以用来判断当前页面可见性的状态,用于判断当前页面是否是最小化状态. onload事件 on ...

  4. 小程序监听android返回键,微信小程序左上角返回按钮触发事件

    从A页面跳转到B页面,再从B页面通过左上角返回按钮,返回到A页面 A页面: B页面: 从B页面返回到A页面时,触发事件请求接口: 代码如下: B页面js代码 onShow: function () { ...

  5. 【Unity】监听编辑器聚焦/激活状态OnEditorFocus

    Unity提供了大量监听Asset目录下资源变化/导入时的回调,只需写个类继承AssetPostprocessor,实现各种回调方法即可接收到消息.但是Asset目录之外的文件变化该如何监听呢? 配置 ...

  6. Spring容器的事件监听机制(简单明了的介绍)

    文章目录 前言 事件 1. 定义事件 2. 定义监听器 3. 定义发布器 Spring容器的事件监听机制 1.事件的继承类图 监听器的继承类图 总结 前言 上一篇我们介绍了SpringFactorie ...

  7. 你值得拥有!更省钱地完成数据监听

    作者 | 梁唐 来源 | TechFlow(ID:techflow2019) 大家好,今天一起来了解一个新的设计模式--观察者模式. 观察者模式的思路很简单,它被广泛地应用在各种数据监控上. 很多时候 ...

  8. Fabricjs对Canvas画布和对象的事件监听

    场景 Fabricjs一个简单强大的Canvas绘图库快速入门: Fabricjs一个简单强大的Canvas绘图库快速入门_BADAO_LIUMANG_QIZHI的博客-CSDN博客 在上面的基础上, ...

  9. java 自动启动监听_Spring Boot 启动事件和监听器,太强大了!

    大家都知道,在 Spring 框架中事件和监听无处不在,打通了 Spring 框架的任督二脉,事件和监听也是 Spring 框架必学的核心知识之一. 一般来说,我们很少会使用到应用程序事件,但我们也不 ...

  10. Object.defineProperty也能监听数组变化?

    本文简介 点赞 + 关注 + 收藏 = 学会了 首先,解答一下标题:Object.defineProperty 不能监听原生数组的变化.如需监听数组,要将数组转成对象. 在 Vue2 时是使用了 Ob ...

最新文章

  1. 【spring】初识aop(面向切面编程) 使用jdk动态代理
  2. CRM和ERP的Sales Organization的映射关系
  3. python 简单socket_Python 简单socket
  4. python中的property_python中的property属性
  5. 使用pickle模块序列化数据,优化代码
  6. mysql之desc 与asc
  7. fw150um2.0linux驱动下载,fw150um无线网卡驱动
  8. spring mvc文件流形式下载
  9. Java第十二次作业:继承与抽象类解决工人与学生的问题,抽象类实例。抽象类作用——为多态创造了可能。抽象类的作用总结...
  10. vue项目中报常见错误
  11. php文章重复度检测,有哪些可以检测文章原创度的工具,避免文章重复度过高
  12. YS-F4Pro开发板第四章:开发环境搭建【IAR和KEIL区别】【cube软件】【ST-Link和Jlink】
  13. 小程序input框失去焦点后触发bindinput事件
  14. 安装win7时缺少所需的CDDVD驱动器设备驱动程序
  15. 学计算机好还是学数学好,大学专业学计算机好还是学数学好
  16. 积化和差 和差化积公式
  17. 数字ic设计自学ing
  18. 阿卜杜拉国王科技大学的计算机,阿卜杜拉国王科技大学,沙特国王大学开设专业。...
  19. 【Shotcut】开源免费视频编辑软件 - 微信视频编辑利器
  20. ac.find_template 踩坑,寻找相似图片,安卓自动化代码

热门文章

  1. 使用pandas来根据出生日期判断星座
  2. Java实现支付功能(支付宝)
  3. php5 ereg,ereg / eregi替代PHP 5.3
  4. 第一篇 外贸企业出口退税
  5. 爱老虎油和你探索flash中的对象
  6. Delphi 金额转大写
  7. 自制 kazzo 烧录器
  8. java xml特殊字符_mybatis xml中特殊字符处理及特殊符号
  9. Python个人总结(基础+进阶)
  10. 电商行业短信平台选择,电商行业短信通道选择考虑的问题