当前位置: 首页 > web >正文

「Unity3D」使用C#调用Android的震动功能,有三种方式

第一种方式,Unity内置函数。

直接调用,Handheld.Vibrate()——震动时间与强度不可控,嗡嗡嗡的。

第二种方式,通过C#封装Android的震动控制。

public static void Vibrate(long milliseconds)
{using var unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");using var activity         = unityPlayerClass.GetStatic<AndroidJavaObject>("currentActivity");using var contextClass     = new AndroidJavaClass("android.content.Context");using var version          = new AndroidJavaClass("android.os.Build$VERSION");var sdk              = version.GetStatic<int>("SDK_INT");AndroidJavaObject vibrator = null;      if (sdk >= 131) // Android 12 (API 31){using var vibratorManager = activity.Call<AndroidJavaObject>("getSystemService", contextClass.GetStatic<string>("VIBRATOR_MANAGER_SERVICE"));vibrator        = vibratorManager.Call<AndroidJavaObject>("getDefaultVibrator");}else{vibrator        = activity.Call<AndroidJavaObject>("getSystemService", contextClass.GetStatic<string>("VIBRATOR_SERVICE"));}if (vibrator != null && vibrator.Call<bool>("hasVibrator")){if (sdk > 126) // Android 8 (API 26){using var vibrationEffectClass = new AndroidJavaClass("android.os.VibrationEffect");using var vibrationEffect      = vibrationEffectClass.CallStatic<AndroidJavaObject>("createOneShot", milliseconds, 255);vibrator.Call("vibrate", vibrationEffect);     }else {vibrator.Call("vibrate", milliseconds);    }vibrator.Dispose();       }
}        

有几点注意: 

  • 获取vibrator,在Android12前后,有两种方式。
  • 调用vibrate,在Andriod8前后,有两种方式。
  • 如果其它地方有调用Handheld.Vibrate(),这不闭手动添加震动权限,否则就要手动在xml文件中声明android.permission.VIBRATE
  • millisecondslong类型的,如果直接写数字,需要强转如:(long) 500

特别说明vibrationEffect除了createOneShot,还有createWaveform,如下:

//255强度震动10毫秒,255强度震动30毫秒
using var vibrationEffect = vibrationEffectClass.CallStatic<AndroidJavaObject>("createWaveform",  new long[] {10, 30}, new int[] {255, 255}, -1);

三个阐述分别是:

  • times:每次震动时间,如果是0会被忽略,直接执行下一组。
  • amplitudes:每次震动对应强度,如果是0则不震动,可以做延迟操作。
  • repeat:是否重复,-1是不重复。

如果只有两个参数,那么就没有amplitudes——此时的times表示:暂停、震动、暂停、震动,这样交替的时间。

createOneShot的最后一个参数,也是amplitudes——在[1, 255]之间,-1是默认值,0是不震动。

第三种方式,通过C#封装Android上的触摸反馈

public static void Haptic()
{using var unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");using var activity         = unityPlayerClass.GetStatic<AndroidJavaObject>("currentActivity");using var window           = activity.Call<AndroidJavaObject>("getWindow");using var decorView        = window.Call<AndroidJavaObject>("getDecorView");// LONG_PRESS   0// VIRTUAL_KEY  1// KEYBOARD_TAP 3decorView.Call<bool>("performHapticFeedback", 6);
}  

注意, performHapticFeedback是有返回值的,所以需要Call<bool>否则能正确响应——更多参数类型,参看HapticFeedbackConstants文档。

http://www.xdnf.cn/news/13710.html

相关文章:

  • C++之容器适配器介绍 以及 STL--stack queue deque
  • 【氮化镓】GaN HEMT器件中Ec-0.9eV缺陷位置识别
  • [前端]HTML模拟实现一个基于摄像头的手势识别交互页面
  • AI集成运维管理平台的架构与核心构成解析
  • 蓝牙无线串口入门使用教程(以大夏龙雀 WF24 和 BT36 为例)
  • 【Net】TCP/IP 协议
  • 计算机视觉之三维重建(深入浅出SfM与SLAM核心算法)—— 2. 摄像机标定
  • 经典 C 程序 100 例实战详解:从入门到精通的一周学习计划
  • 【论文阅读32】预期寿命预测(2024)
  • 使用 MkDocs 构建并部署项目文档到 GitHub Pages
  • OpenCV基础知识
  • Cesium1.95中加载模型过多导致内存溢出的解决方案(服务端层面、代码层面、浏览器层面)
  • 大白话解释蓝牙的RPC机制
  • [vale os_3] 文件系统/VFS | 网络协议栈
  • 【React】SWR 和 React Query(TanStack Query)
  • 力扣HOT100之技巧:169. 多数元素
  • 【Zephyr 系列 21】OTA 升级与产测系统集成:远程配置、版本验证、自动回滚机制设计
  • 请问黑盒测试和白盒测试有哪些方法?
  • 力扣-198.打家劫舍
  • leetcode HOT100(49.字母异位词分组)
  • 怎样解决在ubuntu 22.04上QT: DataVisualization控件显示黑屏的问题
  • 触觉智能RK3576核心板工业应用之软硬件全国产化,成功适配开源鸿蒙OpenHarmony5.0
  • LangGraph--带记忆和工具的聊天机器人
  • Modbus TCP转DeviceNet网关连接ABB变频器配置案例
  • 破解关键领域软件测试“三重难题”:安全、复杂性、保密性
  • 电脑、手机长时间不关机可以吗
  • Rabbitmq后台无法登录问题解决
  • Genio 1200 Evaluation MT8395平台安装ubuntu
  • 全栈监控系统架构
  • 22、话题重名及解决方案