一个简单的小功能,使用TapicEngine增加游戏体验

发表于2018-02-27
评论0 4.1k浏览

本文首发于知乎专栏: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也非常简单,我使用了这个插件:

github.com/asus4/unity-

通过插件的方式调用苹果提供的三个子类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);

通过传入类型调用不同的震动效果,通过传入参数判定是可见范围内的人震动还是只有主角会震动,内部会判断设备是否支持,震动开关是否打开。


手感还不错!

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引