Conceder permiso de vibración en proyectos móviles de Unity
¡Está basado en Android!
En Unity, la vibración se puede usar básicamente mediante Handheld.Vibrate(), pero tiene el inconveniente de que la intensidad y la duración de la vibración son fijas, por lo que se suele recurrir al siguiente método.
Añadir el archivo Manifest
- En
Edit/Project Settings/Player/Publishing Settings, marca la opciónCustom Main Manifest. - Se generará un archivo
AndroidManifest.xmlmodificable en la rutaAssets/Plugins/Androiddel proyecto. - Dentro de la etiqueta
manifestde ese archivo, añade la línea<uses-permission android:name="android.permission.VIBRATE" />.
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application>
Used when Application Entry is set to Activity, otherwise remove this activity block-->
<activity android:name="com.unity3d.player.UnityPlayerActivity"
android:theme="@style/UnityThemeSelector">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
Used when Application Entry is set to GameActivity, otherwise remove this activity block-->
<activity android:name="com.unity3d.player.UnityPlayerGameActivity"
android:theme="@style/BaseUnityGameActivityTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
<meta-data android:name="android.app.lib_name" android:value="game" />
</activity>
</application>
<uses-permission android:name="android.permission.VIBRATE" />
</manifest>
El archivo AndroidManifest.xml completo se muestra arriba. La aplicación compilada con este archivo solicitará permiso de vibración, y si el jugador lo concede, podrá vibrar.
Añadir la clase Vibration
Añade un archivo C# en cualquier ruta del proyecto, pega el siguiente código y guárdalo. Normalmente se escribe en la ruta Assets/Scripts.
using System.Collections;
using UnityEngine;
public static class Vibration
{
#if UNITY_ANDROID && !UNITY_EDITOR
public static AndroidJavaClass AndroidPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
public static AndroidJavaObject AndroidcurrentActivity = AndroidPlayer.GetStatic<AndroidJavaObject>("currentActivity");
public static AndroidJavaObject AndroidVibrator = AndroidcurrentActivity.Call<AndroidJavaObject>("getSystemService", "vibrator");
#endif
public static void Vibrate()
{
#if UNITY_ANDROID && !UNITY_EDITOR
AndroidVibrator.Call("vibrate");
#else
Handheld.Vibrate();
#endif
}
public static void Vibrate(long milliseconds)
{
#if UNITY_ANDROID && !UNITY_EDITOR
AndroidVibrator.Call("vibrate", milliseconds);
#else
Handheld.Vibrate();
#endif
}
public static void Vibrate(long[] pattern, int repeat)
{
#if UNITY_ANDROID && !UNITY_EDITOR
AndroidVibrator.Call("vibrate", pattern, repeat);
#else
Handheld.Vibrate();
#endif
}
public static void Cancel()
{
#if UNITY_ANDROID && !UNITY_EDITOR
AndroidVibrator.Call("cancel");
#endif
}
}
Esta clase se proporciona de forma estática, por lo que funciona correctamente sin importar dónde se escriba en el proyecto. Recibe la duración de la vibración como un parámetro de tipo long e invoca AndroidVibrator.Call(). Por ejemplo, se puede usar como Vibration.Vibrate(long(1000)). Personalmente, recomiendo usar un valor de long(10).
Ejemplo de uso
public void Vibrate()
{
if (MainManager.ActivatedObject == gameObject)
Vibration.Vibrate((long)10);
}
Lo usé de esta manera en un proyecto anterior. Cuando el jugador tocaba un objeto concreto, ese objeto se activaba y se registraba en ActivatedObject de MainManager. Funcionó de manera satisfactoria.
¡Actualizado el 2025-07-28!
public static void Vibrate()
{
if (PlayerPrefs.GetInt("VibrationEnabled", 1) == 1)
{
#if UNITY_ANDROID && !UNITY_EDITOR
AndroidVibrator.Call("vibrate");
#else
Handheld.Vibrate();
#endif
}
}
O bien, se puede añadir una línea simple como la anterior a Vibration() para que solo vibre cuando esté permitido. Tras probarlo directamente, considero que es mejor, tanto conceptual como prácticamente, pasar por un paso de verificación de la condición.