おもちゃラボ

Unityで遊びを作ってます

【Unity】iPhoneを振動(3D Touch)させる方法

iPhone6sから3D Touchと呼ばれるTaptic Engineを使ったリニア振動(カチッとした振動)が使えるようになりました。ここではUnityを使ってiPhoneを振動させる方法を紹介します。

f:id:nn_hokuson:20180605194943j:plain:w600

UnityでiPhoneの振動を扱うには、まずはiOS用のプラグインを作成し、その後Unityからプラグインのメソッドを叩くという流れになります。

それでは一つずつ見ていきましょう!

振動用のPluginを作る

Taptic EngineはiOSの機能なので、Unityから直接振動APIを叩くことはできません。そこで、iOS用のPluginを作ってPlugin経由で振動のAPIを呼び出しましょう。

Assetsフォルダの下に、Pluginsフォルダを作成し、その中にiOSフォルダを作成してください。その中にTouch3D.mmという名前でファイルを作成します。

f:id:nn_hokuson:20180605192654p:plain:w600

ファイルが作成できたら次のプログラムを入力して下さい。

#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つだけではなく、様々な値が用意されています。

dev.classmethod.jp

上のプログラムでは、Touch3Dメソッドの中でシステムサウンドの種類を引数にとり、それを再生しています。これでプラグイン側のプログラムはできたので、次はUnityからいま作成したTouch3Dメソッドを呼び出しましょう。

UnityからPluginのメソッドを叩く

Pluginが作れたので、次はUnityからPluginを実行するC#プログラムを作りましょう。Test.csというC#ファイルを作成し、空のGameObjectにアタッチしておきましょう。

f:id:nn_hokuson:20180605193124j:plain

次に作成した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する必要があるので注意してください。