iPhone6sから3D Touchと呼ばれるTaptic Engineを使ったリニア振動(カチッとした振動)が使えるようになりました。ここではUnityを使ってiPhoneを振動させる方法を紹介します。
UnityでiPhoneの振動を扱うには、まずはiOS用のプラグインを作成し、その後Unityからプラグインのメソッドを叩くという流れになります。
それでは一つずつ見ていきましょう!
振動用のPluginを作る
Taptic EngineはiOSの機能なので、Unityから直接振動APIを叩くことはできません。そこで、iOS用のPluginを作ってPlugin経由で振動のAPIを呼び出しましょう。
Assetsフォルダの下に、Pluginsフォルダを作成し、その中にiOSフォルダを作成してください。その中にTouch3D.mmという名前でファイルを作成します。
ファイルが作成できたら次のプログラムを入力して下さい。
#import <Foundation/Foundation.h> #import <AudioToolBox/AudioToolBox.h> extern "C" void Touch3D (int n) { AudioServicesPlaySystemSound(n); }
iOSのTaptic EngineはiPhone7以降ではUIFeedbackGeneratorを使って細かく制御できます。ただ、iPhone6sもサポートしたい場合には、AudioServicesPlaySystemSoundメソッドを使ってシステムサウンドを鳴らす必要があります。
http://tech.starttoday-tech.com/entry/ios_ui_feedbcak_generatortech.starttoday-tech.com
AudioServicesPlaySystemSoundメソッドは、振動の細かい制御は出来ませんが、引数に与える値によって幾つかの振動パターンが用意されています。引数の値と振動のパターンの関係は次のようになります。
引数の値 | 振動の種類 |
1519 | カチッ |
1520 | ポコッ |
1521 | カチカチッ |
システムサウンドには上の3つだけではなく、様々な値が用意されています。
上のプログラムでは、Touch3Dメソッドの中でシステムサウンドの種類を引数にとり、それを再生しています。これでプラグイン側のプログラムはできたので、次はUnityからいま作成したTouch3Dメソッドを呼び出しましょう。
UnityからPluginのメソッドを叩く
Pluginが作れたので、次はUnityからPluginを実行するC#プログラムを作りましょう。Test.csというC#ファイルを作成し、空のGameObjectにアタッチしておきましょう。
次に作成したTest.csに次のプログラムを入力してください。
using System.Collections; using UnityEngine; using System.Runtime.InteropServices; public class Test : MonoBehaviour { [DllImport("__Internal")] private static extern void Touch3D(int n); void Update() { if(Input.GetMouseButtonDown(0)){ Touch3D(1519); } } }
上のプログラムはタッチするごとにPluginのVibrationメソッドを呼び出しています。引数の値を1519〜1521までの間で変化させることで、振動の種類も変えることが出来ます。
DllImportを使うにはSystem.Runtime.InteropServicesをusingする必要があるので注意してください。