こんにちは、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のこともわかってきます。
自分自身が疑問に思う機能を
試しに調べて実装してみるというのは、
意外な発見がありますので、
オススメの勉強方法です。
この記事が気に入ったらフォローしよう
- Unity2017.1.0f3
- iOS11
- Xcode9