渋谷ほととぎす通信

完全趣味でやってるUnityメモ。説明できないところを説明できるようにするための個人ブログ。昨日の自分より少しでも大きくなれるように。。。 ※所属団体とは一切関係がありません

Unityでバイブレーションネイティブプラグインを書く


f:id:esakun:20150730215258g:plain

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

Handheld.Vibrate ();

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

しかし、バイブレーションの長さを制御する機能はリファレンスにありません。 https://docs.unity3d.com/ScriptReference/Handheld.Vibrate.html

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

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

AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

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

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

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

このタイミングでバイブレーションを実行すれば断続的な振動を作ることができるかなと思いましたが、一瞬振動が止むタイミングが発生するようで、期待する動きはしませんでした。

一応成果物として、指定回数バイブレーションを鳴らすネイティブプラグインを作りましたので、それをアップしておきます。

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

VibrationPlugin.PlayVibration(3);

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

環境

  • Unity2017.1.0f3
  • iOS11
  • Xcode9