目錄
- 一、前言
- 二、Unity的Handheld.Vibrate()
- 三、調用Android原生代碼
- 四、NiceVibrations插件
- 五、DeviceVibration插件
- 六、控制游戲手柄震動
- 七、結語
一、前言
最近開發了一個新的功能——特定情況下讓手機震動,例如點擊界面中的按鈕,手機震動一下。這也是第一次寫移動端的震動的功能,雖然unity有自帶的控制移動設備震動的API,但是API太過于單一不太符合功能要求,因為他只有最簡單的0.5秒的震動,不能控制震動的時長和強度。然而對于一個按鈕的震動反饋來講,0.5秒的時長有點長了。
上網查閱了大量的相關的資料,最終還不錯的解決的功能的開發,所以在這里就羅列出我找到的所有能控制手機震動的API插件。
最后還有控制游戲手柄震動的API
二、Unity的Handheld.Vibrate()
這是Unity自帶的API,這個方法可以觸發移動設備的震動。我們直接看下使用的示例
// 判斷當前設備是否支持震動(最好檢查一下,萬一手機不支持或者馬達壞了有可能報錯)
if (SystemInfo.supportsVibration)
{Handheld.Vibrate();
}
else
{Debug.Log("設備不支持震動");
}
哦對了,一般是Unity自帶的API的話,也是同時支持IOS系統的,但是下面說的這個就只支持安卓系統。
三、調用Android原生代碼
這個方法是直接通過調用Android的Java API來控制震動時長的,所以為什么說只支持安卓系統不支持IOS系統,就是因為直接用的Android的Java API。直接來看下下如何使用吧。
方法還是比較簡單的,先創建一個用于調用Android原生代碼的C#腳本:
using UnityEngine;
public class VibrationManager : MonoBehaviour
{public static void Vibrate(long milliseconds){if (Application.platform == RuntimePlatform.Android){try{using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")){using (AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity")){using (AndroidJavaObject vibrator = currentActivity.Call<AndroidJavaObject>("getSystemService", "vibrator")){if (vibrator != null){vibrator.Call("vibrate", milliseconds);}}}}}catch (System.Exception e){Debug.LogError("VibrationManager: Error while trying to vibrate - " e.Message);}}}
}
然后就可以在需要震動的地方調用這個方法:
VibrationManager.Vibrate(1000); // 震動1000毫秒
當然你也可以直接把 Vibrate()
方法寫在要使用的腳本文件中,就不用單獨寫一個腳本弄一個靜態函數了。使用的時候就直接 Vibrate(1000)
就可以,簡介明了!
四、NiceVibrations插件
我在項目中使用的插件就是這個,這個插件靈活性很高,且簡單易操作,而且支持Android和IOS。
直接來說一下插件導入之后如何使用
首先要引入命名空間
using MoreMountains.NiceVibrations
然后就是在需要的地方調用代碼了。
// 普通的振動
MMVibrationManager.Vibrate();// 不同模式的振動
MMVibrationManager.Haptic(HapticTypes.Selection);1.HapticTypes.Selection:極輕微振動——可用于點擊按鈕2.HapticTypes.Success:普通振動——可用于游戲勝利3.HapticTypes.Warning:普通振動——可用于游戲提示4.HapticTypes.Failure:普通振動——可用于游戲失敗5.HapticTypes.LightImpact:輕微振動6.HapticTypes.MediumImpact:中度振動7.HapticTypes.HeavyImpact:重度振動8.HapticTypes.RigidImpact:強硬而時間稍長一些的振動9.HapticTypes.SoftImpact:柔軟而時間稍長一些的振動// 瞬間振動,震動時長大致只有0.1s左右
MMVibrationManager.TransientHaptic(float intensity, float sharpness);參數:float intensity 強度0-1float sharpness 感知度0-1//還有幾個默認的參數,bool alsoRumble = falseMonoBehaviour coroutineSupport = nullint controllerID = -1//連續的振動
MMVibrationManager.ContinuousHaptic(float intensity, float sharpness, float duration, HapticTypes fallbackOldiOS, this);
參數:float intensity 強度0-1float sharpness 感知度0-1float duration 持續時間HapticTypes fallbackOldiOS = HapticTypes.None 振動類型//控制全局的Haptic振動開啟或關閉
MMVibrationManager.SetHapticsActive(true);
MMVibrationManager.SetHapticsActive(false);//獲取設備是否支持Haptic振動
bool isSupported = MMVibrationManager.HapticsSupported();
除了上面的一下觸發震動的操作,還有一下事件的回調可以綁定,但是僅限于 MMVibrationManager.Haptic
的震動
//OnEnable進行綁定
private void OnEnable()
{MMNViOSCoreHaptics.OnHapticPatternStopped += OnHapticsStopped;MMNViOSCoreHaptics.OnHapticPatternError += OnHapticsError;MMNViOSCoreHaptics.OnHapticPatternReset += OnHapticsReset;
}//OnDisable時解除綁定
private void OnDisable()
{MMNViOSCoreHaptics.OnHapticPatternStopped -= OnHapticsStopped;MMNViOSCoreHaptics.OnHapticPatternError -= OnHapticsError;MMNViOSCoreHaptics.OnHapticPatternReset -= OnHapticsReset;
}//振動結束
protected virtual void OnHapticsStopped()
{//一些處理邏輯
}//振動錯誤
protected virtual void OnHapticsError()
{//一些處理邏輯
}//振動重置
protected virtual void OnHapticsReset()
{//一些處理邏輯
}
MMVibrationManager.TransientHaptic
和 MMVibrationManager.ContinuousHaptic
的事件也有,但是比較少,只有結束事件
private void OnEnable()
{MMNViOSCoreHaptics.OnHapticPatternStopped += OnHapticsStopped;
}private void OnDisable()
{MMNViOSCoreHaptics.OnHapticPatternStopped -= OnHapticsStopped;
}//振動結束
protected virtual void OnHapticsStopped()
{}
五、DeviceVibration插件
插件的靈活度還可以,對于日常簡單的開發就夠用了,但是導入的時候需要自己處理一下意外情況(比如報錯)。
插件里面也自帶使用的示例,有一個Scene示例場景,可以打包成移動端自己測試一下,下面就是它的示例代碼,看起來還是比較簡介的。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;namespace BrainCheck {public enum VibrationIntensity {vibrationIntensity_1,vibrationIntensity_2,vibrationIntensity_3,vibrationIntensity_4,vibrationIntensity_5,vibrationIntensity_6,vibrationWithDelay}public class DemoScript : MonoBehaviour{public VibrationIntensity myOption;void OnMouseUp() {StartCoroutine(BtnAnimation());}private IEnumerator BtnAnimation(){Vector3 originalScale = gameObject.transform.localScale;gameObject.transform.localScale = 0.9f * gameObject.transform.localScale;yield return new WaitForSeconds(0.2f);gameObject.transform.localScale = originalScale;ButtonAction();}private void ButtonAction() {switch(myOption) {case VibrationIntensity.vibrationIntensity_1:BrainCheck.VibrationIntensityBridge.vibrationIntensity_1();break;case VibrationIntensity.vibrationIntensity_2:BrainCheck.VibrationIntensityBridge.vibrationIntensity_2();break;case VibrationIntensity.vibrationIntensity_3:BrainCheck.VibrationIntensityBridge.vibrationIntensity_3();break;case VibrationIntensity.vibrationIntensity_4:BrainCheck.VibrationIntensityBridge.vibrationIntensity_4();break;case VibrationIntensity.vibrationIntensity_5:BrainCheck.VibrationIntensityBridge.vibrationIntensity_5();break;case VibrationIntensity.vibrationIntensity_6:BrainCheck.VibrationIntensityBridge.vibrationIntensity_6();break;case VibrationIntensity.vibrationWithDelay:#if UNITY_IOSBrainCheck.VibrationIntensityBridge.vibrationWithDelay(4, 6);#endif#if UNITY_ANDROIDBrainCheck.VibrationIntensityBridge.vibrationWithDelay(6000, 400);#endifbreak;}}}
}
六、控制游戲手柄震動
這個相對來說比較簡單,沒必要另外單獨一篇文章進行講述了,索性直接放在了一起說。
unity中的 Input.SetVibration
方法可以設置手柄的左右震動馬達強度。震動強度是一個0到1之間的浮點數,其中0表示無震動,1表示最大震動強度。
直接看下示例:(以Xbox手柄為例)
using UnityEngine;
public class GamepadVibrationExample : MonoBehaviour
{void Update(){// 檢測手柄按鈕輸入,例如按下"A"鍵時震動if (Input.GetKeyDown(KeyCode.JoystickButton0)) // Xbox手柄的"A"鍵通常對應JoystickButton0{// 設置手柄震動,左馬達和右馬達的震動強度分別為0.5和1.0Input.SetVibration(0, 0.5f, 1.0f);}// 檢測手柄按鈕輸入,例如按下"B"鍵時停止震動if (Input.GetKeyDown(KeyCode.JoystickButton1)) // Xbox手柄的"B"鍵通常對應JoystickButton1{// 停止手柄震動Input.SetVibration(0, 0.0f, 0.0f);}}
}
七、結語
插件就這么多,僅供交流學習,有什么問題也歡迎再評論區留言或者私信,我看到的話會及時回復,下期見,拜拜。