Posted at

Unityでモバイル端末のバイブレーションをコントロールする


Unityに用意されているバイブレーションAPI

Handheld.Vibrate ();

これで、1秒くらいのバイブレーションがブーンとなりますが、

使うシーンによってはちょっとマッチしない。

タップだったりに合わせて鳴らすにはもう少し短いものがほしいですよね。

調べるといろいろ出てきて、その寄せ集めの情報にはなりますが、

iOSとAndroidの情報がまとまってるものが意外となかったので書いておきます。


iOS

秒数での制御ができないので、プリセットのリストから選んで鳴らすことになります。


IOSUtil.cs

#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
}


IOSUtil.mm

#import <Foundation/Foundation.h>

#import <AudioToolBox/AudioToolBox.h>

extern "C" void _playSystemSound (int soundId)
{
AudioServicesPlaySystemSound(soundId);
}

タップに反応する短いものだと 1519 なんかが良さそう。

ただ、ドキュメントを探しても、1519 1520 1521 あたりは載って無くて、

使ってて大丈夫なのかは若干不安なところ..


Android

秒数(ミリ秒)で制御することができます。参考リンクまんまですが。


AndroidUtil.cs

#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