こんにちは、Unityエンジニアのオオバです。

UnityからiPhoneのバイブレーションを操作したい

UnityからiPhoneのバイブレーションを扱うAPIを調査しました。

Handheld.Vibrate ();  

このようなメソッドが用意されています。

しかし、バイブレーションの長さを制御する機能はリファレンスにありません。

📚 参考サイト : Unity - Scripting API: Handheld.Vibrate

ネイティブプラグインを書けば制御できるかも?
という仮説を立てて、iOSのリファレンスを調査。

するとAudioServicePlaySystemSoundというAPIが用意されていました。

AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);  

しかし長さ制御の情報を見つけれませんでしたが、
バイブレーションの完了をコールバックで
受け取れることがわかりました。

AudioServicesAddSystemSoundCompletion(  
    kSystemSoundID_Vibrate,  
    NULL,  
    NULL,  
    ExecuteVibration,  
    NULL  
);  

AudioServicesAddSystemSoundCompletionメソッドの
第4引数にコールバック関数を定義することでバイブレーションの
終了タイミングを受け取れます。

このタイミングでバイブレーションを実行すれば
断続的な振動を作ることができるかなと思いました。

しかし一瞬振動が止むタイミングが発生し、
期待する動きを実装できませんでした。

今回の成果物として、
指定回数バイブレーションを実行する
ネイティブプラグインのコードをGitHubにアップしています。
何か開発の参考になれば幸いです。
GitHub - baobao/unity-vibration-test

使い方としてはAssets/Plugins/iOS内ファイル一式を、
プロジェクトにインポートし、
以下のように記述すればバイブレーションが実行されます。

VibrationPlugin.PlayVibration(3);  

ちなみにUnityのAPIHandheld.Vibrate ();を実行すると、
先のコールバックが実行されるという結果から、Unity自体もただ単に
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
を利用していると思われます。

ネイティブの実装を自分で検証、実装してみることで
Unityのこともわかってきます。

自分自身が疑問に思う機能を
試しに調べて実装してみるというのは、
意外な発見がありますので、
オススメの勉強方法です。

オススメ記事
検証環境