Unityに用意されているバイブレーションAPI
Handheld.Vibrate ();
これで、1秒くらいのバイブレーションがブーンとなりますが、
使うシーンによってはちょっとマッチしない。
タップだったりに合わせて鳴らすにはもう少し短いものがほしいですよね。
調べるといろいろ出てきて、その寄せ集めの情報にはなりますが、
iOSとAndroidの情報がまとまってるものが意外となかったので書いておきます。
iOS
秒数での制御ができないので、プリセットのリストから選んで鳴らすことになります。
#if UNITY_IOS && !UNITY_EDITOR
[DllImport ("__Internal")]
static extern void _playSystemSound(int n);
#endif
public static void PlaySystemSound(int n) //引数にIDを渡す
{
#if UNITY_IOS && !UNITY_EDITOR
_playSystemSound(n);
#endif
}
#import <Foundation/Foundation.h>
#import <AudioToolBox/AudioToolBox.h>
extern "C" void _playSystemSound (int soundId)
{
AudioServicesPlaySystemSound(soundId);
}
タップに反応する短いものだと 1519
なんかが良さそう。
ただ、ドキュメントを探しても、1519
1520
1521
あたりは載って無くて、
使ってて大丈夫なのかは若干不安なところ..
Android
秒数(ミリ秒)で制御することができます。参考リンクまんまですが。
#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(long milliseconds)
{
if (isAndroid())
vibrator.Call("vibrate", milliseconds);
else
Handheld.Vibrate();
}
private static bool isAndroid()
{
#if UNITY_ANDROID && !UNITY_EDITOR
return true;
#else
return false;
#endif
}
端末によって差異はありそうですが、
試した感じ結構細かい数値の違いでも、体感の変化を感じられました。
上記で記載したiOSの 1519
の感触に近づけるには 3ms
くらいの短い指定でもよさそう。
Handheld.Vibrate();
の記述について、
コードに残しておくことでAndroidのパーミッションをUnity側でビルド時に自動で追加してくれます。
手動で管理する場合はこの分岐は省略して良いかと思います。
プレビュー
実機で動かして試せるアプリを用意しました。
https://github.com/mrhdms/VibrationTester
iOS, Androidそれぞれで動きます。
iOSはプリセットリストから選択して再生。(音しかならないもの、音とバイブのもの、バイブレーションだけのものが混在)
Androidは0-1秒の間でスライダで調整しながら確認できます。
参考
http://smartgames.hatenablog.com/entry/2019/02/17/125413
http://greenkour.hateblo.jp/entry/2017/11/20/100000