[Unity] Comment Faire Vibrer Un Smartphone iOS Ou Android
Voici comment faire vibrer ou gérer une vibration sur un téléphone Android ou iOS avec Unity.
On a tendance à oublier que le smartphone peut aussi vibrer.
Dans les jeux, la vibration peut être utilisée pour accentuer des effets, donner une information supplémentaire ou bien pour alerter le joueur qui joue sans son.
Unity permet d’utiliser la vibration sur tous les smartphones, mais pas les tablettes. Tout simplement parce que les tablettes ne sont pas équipées de vibreurs.
- Sur iOS la vibration est fixée à 300 millisecondes (il me semble), ni plus ni moins.
- En revanche sur Android il est possible de créer des séquences et de régler le temps de vibration.
Cette ligne de code fait vibrer les téléphones iOS et Android pendant 300 millisecondes seulement. Mais impossible de régler le temps de vibration.
Handheld.Vibrate ();
En revanche, le script suivant permet de lancer et gérer des vibrations personnalisées sur Android. Pas besoin de plugins natifs en Objective-C ou en Java. Dans Unity, Java est géré grâce au JNI. Le JNI est le Android Java Native Interface, avec du code C# Unity peut interfacer avec du script natif Java. Ce JNI est très pratique lorsque l’on ne veut pas se lancer dans le développement de plugins natifs.
EDIT : J’ai codé un plugin natif amélioré pour iOS et Android à télécharger sur github.
using UnityEngine; using System.Collections; #if UNITY_ANDROID && !UNITY_EDITOR public class Vibration { #if UNITY_ANDROID && !UNITY_EDITOR public static AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); public static AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"); public static AndroidJavaObject vibrator = currentActivity.Call<AndroidJavaObject>("getSystemService", "vibrator"); #else public static AndroidJavaClass unityPlayer; public static AndroidJavaObject currentActivity; public static AndroidJavaObject vibrator; #endif public static void Vibrate () { if ( isAndroid () ) vibrator.Call ( "vibrate" ); else Handheld.Vibrate (); } public static void Vibrate ( long milliseconds ) { if ( isAndroid () ) vibrator.Call ( "vibrate", milliseconds ); else Handheld.Vibrate (); } public static void Vibrate ( long [] pattern, int repeat ) { if ( isAndroid () ) vibrator.Call ( "vibrate", pattern, repeat ); else Handheld.Vibrate (); } public static bool HasVibrator () { return isAndroid (); } public static void Cancel () { if ( isAndroid () ) vibrator.Call ( "cancel" ); } private static bool isAndroid () { #if UNITY_ANDROID && !UNITY_EDITOR return true; #else return false; #endif } } #endif
Pour une vibration simple :
Vibration.Vibrate();
Pour stopper la vibration en cours sur Android. Sur iOS, il n’est pas possible de stopper une vibration.
Vibration.Cancel()
Pour une vibration de 200 millisecondes. Sur iOS, une vibration sera toujours de 300 millisecondes.
Vibration.Vibrate(200);
Pour une séquence de vibrations (pause de 0ms, vibration de 1000ms, pause de 1000ms, vibration de 1000ms, pause de 1000ms, etc.). Sur iOS, une seule vibration de 300 millisecondes sera lancée. La séquence est répétée indéfiniment et doit être stoppée avec la méthode Cancel().
long [] pattern = { 0, 1000, 1000, 1000, 1000 }; Vibration.Vibrate ( pattern, 0 );
Si vous utilisez ce script, n’hésitez pas à mettre un petit commentaire. Je suis ouvert à toutes propositions d’améliorations également.