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

「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://hqjGAKDT.smyxL.cn
http://5k3NR2Wt.smyxL.cn
http://7zv79e7u.smyxL.cn
http://YxIuwrgG.smyxL.cn
http://82Wc9uJe.smyxL.cn
http://Wiuqa8VQ.smyxL.cn
http://mtBTb5ms.smyxL.cn
http://rqQNIlxy.smyxL.cn
http://VOPBrDCb.smyxL.cn
http://tUUIbwKB.smyxL.cn
http://VOR8CsTo.smyxL.cn
http://ZxCjIdTj.smyxL.cn
http://NcItZFMB.smyxL.cn
http://X2jFyPt2.smyxL.cn
http://QL3xLF6U.smyxL.cn
http://bdH5ecR7.smyxL.cn
http://04VSL7aS.smyxL.cn
http://n7XJr4Fx.smyxL.cn
http://mVmDUwxe.smyxL.cn
http://VjDM9Pf5.smyxL.cn
http://EPLXo041.smyxL.cn
http://rmjrL8OX.smyxL.cn
http://yTKsT2xf.smyxL.cn
http://s9iR5TeG.smyxL.cn
http://SjElqGFy.smyxL.cn
http://rPEY9Sme.smyxL.cn
http://raxiiYRl.smyxL.cn
http://jUQWCFlA.smyxL.cn
http://KdSeVpoS.smyxL.cn
http://2z6Akhfm.smyxL.cn
http://www.dtcms.com/a/245721.html

相关文章:

  • Linux 内核学习(11) --- Linux 链表结构
  • 按关键字批量合并 Excel 多工作簿工作表攻略-Excel易用宝
  • flowable 数据库表结构分析(超全版)
  • SPP——神经网络中全连接层输出尺寸限制的原因和解决办法
  • 以前在服务器启动了docker,现在不需要了,为了安全,去掉docker服务@Ubuntu
  • NVIDIA Container Toolkit 报错 Failed to initialize NVML: Unknown Error 的解决
  • 实现AI数据高效评估的一种方法
  • SQL进阶之旅 Day 27:存储过程与函数高级应用
  • 鸿蒙 UI 开发基础语法与组件复用全解析:从装饰器到工程化实践指南
  • NAS文件共享、PACS影像存储,速率提升400%?
  • Kotlin 协程与 ViewModel 的完美结合
  • 【二分答案1-----切木棒】
  • 视频自动生成字幕原理和自动生成字幕的应用实例
  • 事件(Event)
  • 同时装两个MySQL, 我在MySQL5的基础上, 安装MySQL8
  • 循环数组中相邻元素的最大差值
  • java BIO/NIO/AIO
  • 【unitrix】 1.3 Cargo.toml 文件解析
  • SM3算法Python实现(无第三方库)
  • 【GitOps】Kubernetes安装ArgoCD,使用阿里云MSE云原生网关暴露服务
  • 山东大学《Web数据管理》期末复习宝典【万字解析!】
  • HarmonyOS运动开发:打造便捷的静态快捷菜单
  • ArkUI-X在Android上使用Fragment开发指南
  • ThreadLocal原理及内存泄漏分析
  • 【从零学习JVM|第八篇】深入探寻堆内存
  • Android 开发中,Intent 和 Bundle 组件间传递数据的几种方式
  • RedHat主机配置日志留存策略:从4周延长至6个月
  • FramePack 与其他视频生成工具的横向对比:优势、短板与差异化竞争
  • GitHub 上 PAT 和 SSH 的 7 个主要区别:您应该选择哪一个?
  • DAY 52 神经网络调参指南