UE4.23 震动反馈(Force Feedback)设置

news/2024/7/20 21:02:31 标签: ue4, ios, android

UE4.23提供三组接口触发震动反馈:PlayHapticEffect/StopHapticEffectClientPlayForceFeedback/ClientStopForceFeedbackPlayDynamicForceFeedback。使用方法下图:

PlayHapticEffect/StopHapticEffectClientPlayForceFeedback/ClientStopForceFeedback两组接口需要提供浮点曲线(Float Curve)来控制震动反馈的强度和时间,PlayDynamicForceFeedback接口则是直接通过传入时间强度值控制。浮点曲线控制震动反馈强度和时间,震动时间更具曲线最后一个关键帧(Key)决定,震动强度根据时间获取。

震动强度值被控制在0-1之间,经过查看代码和打包测试发现,在Android和iOS平台上对于震动强度并非连续性的。Android上震动就两档,震动和不震动,当震动强度大于等于0.3的时候震动,小于0.3不震动。iOS上震动强度在iOS 10以上版本分为三档,轻度震动(ImpactLight),中度震动(ImpactMedium)和强度震动(ImpactHeavy),分别对应震动强度为(0.3,0.5](0.5,0.65](0.65,1],而对于iOS 10以下版本则和Android类似,只有震动和不震动两档,震动强度为大于等于0.3时震动。

但是这三组接口并非都能在iOS和Android平台生效,经过查看代码和打包测试发现,PlayHapticEffect/StopHapticEffectiOSAndroid不起作用,iOS平台 FIOSInputInterface 继承了 IForceFeedbackSystem 接口类,但是没有实现 SetHapticFeedbackValues 接口,而Android平台 FAndroidInputInterface 继承了 IForceFeedbackSystem 接口并实现了 SetHapticFeedbackValues 接口,但是 ExternalInputDevices 数组为空。

UE4的震动在iOS和Android平台上的表现效果也不一样。对于Android平台,震动是连续的,而iOS 10以上版本系统之后的震动变成是点震而不是连续震动,并且表现上只震一次,并没有持续的震动。

经过查看源码发现,持续震动时间控制在 APlayerController 类的 ProcessForceFeedbackAndHaptics 函数中,它会根据调用的震动接口不同调用对应的 Update 函数,如:PlayHapticEffect 根据入参Hand(EControllerHand)类型不同分为Left,Right和Gun三种,分别处理各自的持续时间:

而ClientPlayForceFeedback的每次调用都会构造一个FActiveForceFeedbackEffect对象并添加到ActiveForceFeedbackEffects数组中,遍历该数组调用对应 Update 函数判断是否持续时间已到需要从数组中移除;PlayDynamicForceFeedback也是类似处理,不同的是封装了 FDynamicForceFeedbackDetails 对象,并且数组LatentDynamicForceFeedbacks的维护放在了 FLatentDynamicForceFeedbackAction 对象中;

那么震动持续时间逻辑没有平台相关逻辑且逻辑没有问题,只震动一次的问题可能就出现在iOS平台的震动函数本身了。在 FIOSInputInterface 类中,SetForceFeedbackChannelValues 函数负责设置震动的强度值,该函数由 APlayerController 的 UpdateForceFeedback 函数调用,如果在震动持续时间内每帧都会调用。在 SetForceFeedbackChannelValue 函数中,用LastHapticValue变量记录了震动强度的值,只有该值为0的时候才会设置震动强度(PrepareMobileHaptics)和触发震动(TriggerMobileHaptics),当该震动强度值小于0.2时还会直接停止震动,这样看来要实现持续震动这里的逻辑应该是有问题的。

通过对UE4的SetForceFeedbackChannelValue的修改,实现了iOS的连续震动,不过这个“连续”并非真的连续,它是由点震串联起来的“持续”震动,实现代码如下:

这个效果还不是很满意,所以还有待优化。。。

参考资料:

Human Interface Guidelines-Haptics

iOS - 振动相关调研


http://www.niftyadmin.cn/n/1459254.html

相关文章

VisualStudio无法加载符号表“No symbles have been loaded for this document.“

当项目有多个动态库编译的时候,如果出现加载符号表未加载导致无法调试时候,解决办法如下: 1.打开VS的模块管理器,找到符号表未被加载的dll库: 2.选中需要加载符号表的dll库,右键选择加载符号表,…

布隆过滤器速度_布隆过滤器原理及在推荐业务的应用

提到布隆过滤器总想起上大学时候学习的什么切比雪夫滤波器之类的东西(博主是学通信的),我发现过滤器一般都是以发明人的名字命名,布隆过滤器是一种布尔型判断器,可以非常高效的判断一个物品是否在某个列表里。有人说判断一个item是否在一个it…

周长相等的正方形面积一定相等_三年级数学下册面积练习题,给孩子打印练习!...

面积练习题一、填空题1.在横线上填上适当的单位名称:一张课桌高6 ; 一台电视机的屏幕约是50 ; 一枚5角硬币的面积大约是300 ;天安门广场的面积约是40 ;…

document.addeventlistener方法不执行_Java Thread的start和run方法的区别

一、认识Thread的 start() 和 run()“ 概述:t.start()会导致run()方法被调用,run()方法中的内容称为线程体,它就是这个线程需要执行的工作。用start()来启动线程,实现了真正意义上的启动线程,此时会出现异步执行的效果…

rust砖墙_《钢构工程施工的中英翻译文稿》

1、构件制作1. Production of members依据厂内设备条件和钢结构制作的主要工艺流程,构件生产次序为:钢柱→钢梁→檩条、支撑→小型钢构配件→楼面板材(含配件)→墙面板材(配件)等。依以上生产次序,生产过程中主要抓住以下几点:Acc…

file是c语言自带的数据类型吗_C语言编译过程及数据类型

写在前面C语言可以称得上是高级语言中的低级语言,接下来一段时间,我会写一下文章关于c语言,把它的神秘面纱一 一揭开。下面主要是c语言的C语言编译过程及数据类型源文件编译过程为了使计算机能执行高级语言源程序,必须先用一种称为…

typeahead有什么作用_typeahead.js 使用记录

github地址:https://github.com/twitter/typeahead.js在aceAdmin界面模板中,有typeahead这一控件,版本号为0.10.2 , 这个版本对 minLength:0这个参数无效,所以我就到github中找到新版本0.11.1 替换,在此记录使用过程中…

深度学习训练中噪声减小吗_深度学习中噪声标签的影响和识别

问题导入在机器学习领域中,常见的一类工作是使用带标签数据训练神经网络实现分类、回归或其他目的,这种训练模型学习规律的方法一般称之为监督学习。在监督学习中,训练数据所对应的标签质量对于学习效果至关重要。如果学习时使用的标签数据都…