一个简单的小功能,使用TapicEngine增加游戏体验
本文首发于知乎专栏:MACK的游戏开发笔记,欢迎各位关注。
最近策划同学在体验一款别人的游戏时发现开枪会有震动效果,也想加到游戏内,就研究了一下。我们游戏的技能系统是我实现的一套基于状态机和时间轴,通过配表和Cinematic脚本驱动的技能框架,本身就支持角色震动镜头震动等各种震动效果。
例如增加镜头震动只需要在技能脚本里增加一句话:
Func.CameraShake(0.0F,
0.1F, Vector3.left, 0.06f, 6.0f, -0.2f, Info.Owner);
传入延迟多长时间执行,震动类型,振幅,振频,加速度等参数即可。
这还不容易,不就是再加一句话么。增加一个Action,调用Unity封装的Vibrate:
/// <summary> /// 手机震动 /// </summary> /// <param name="_fTriggerTime">延迟多久</param> public void Vibrate(float _fTriggerTime) { m_kTimerMgr.Wait(_fTriggerTime, delegate () { UnityEngine.Handheld.Vibrate(); }); }
然后让策划调用一下Func.Vibrate尝试了一下效果。
结果和别人家的手感差别非常大。。。仔细对比了一下,发现参考的游戏使用的是iPhone的新技术TapicEngine。这个技术最早在iPhone6s上使用,在iPhone7开始提供了接口供开发者使用。
TapicEngine是苹果使用了线性震动马达来提供震动的模块,相比传统的ERM偏心转子电机,能够准确再现点击、触碰以及其他触觉效果。苹果的3DTouch和假的Home键就完美使用了TapicEngine。
要在Unity里使用TapicEnigine也非常简单,我使用了这个插件:
https://github.com/asus4/unity-taptic-plugin/tree/master/iOS/unity-taptic-plugin
通过插件的方式调用苹果提供的三个子类UIImpactFeedbackGenerator 、 UISelectionFeedbackGenerator 和 UINotificationFeedbackGenerator的功能,在Unity里只要调用TapticManager下面的Impact,Notification和Selection三个接口就可以了。这三中震动方式对应苹果设计的三种震动语言,震动反馈,通知和变化。为了便于测试,进行了封装:
/// <summary> /// IOS的Taptic震动 /// </summary> /// <param name="_eType"></param> void Taptic(eTapticType _eType) { switch (_eType) { case eTapticType.ETT_LIGHT: TapticManager.Impact(ImpactFeedback.Light); break; case eTapticType.ETT_MEDIUM: TapticManager.Impact(ImpactFeedback.Midium); break; case eTapticType.ETT_HEAVY: TapticManager.Impact(ImpactFeedback.Heavy); break; case eTapticType.ETT_SUCCESS: TapticManager.Notification(NotificationFeedback.Success); break; case eTapticType.ETT_WARING: TapticManager.Notification(NotificationFeedback.Warning); break; case eTapticType.ETT_ERROR: TapticManager.Notification(NotificationFeedback.Error); break; case eTapticType.ETT_SELECTION: TapticManager.Selection(); break; default: MDebug.LogError("不支持的震动类型"); break; } }
然后修改技能脚本的接口,提供震动的时间轴功能,只要一句话即可实现真实的震动效果:
Func.Tapic(0.8f, CmtFunction.eTapticType.ETT_LIGHT, Info.Owner);
通过传入类型调用不同的震动效果,通过传入参数判定是可见范围内的人震动还是只有主角会震动,内部会判断设备是否支持,震动开关是否打开。
手感还不错!