Unityのアプリで、振動を実装するための手順をまとめます。今回は短めの振動と長めの振動、それぞれを実装する方法について解説しています。
長い振動
まずはお手軽に実装できる、長い振動から解説します!
if (SystemInfo.supportsVibration)
{
Handheld.Vibrate();
}
サンプルコードを振動したい場所で呼び出せば、それなりに長い振動(0.5秒程度)が1回だけ行われます。
※サンプルコードのオブジェクトへのアタッチを忘れないようにしましょう!
ちなみにif文の「SystemInfo.supportsVibration」が振動をサポートしているかを判定し、「Handheld.Vibrate();」実際の振動を行っています。
連続で振動させたい場合はコルーチンなどを使うと便利です。
StartCoroutine(Vibrate(3));
IEnumerator Vibrate(int cnt)
{
for (int i = 0; i < cnt; i++)
{
if (SystemInfo.supportsVibration)
{
Handheld.Vibrate();
}
yield return new WaitForSeconds(0.6f);
}
}
短い振動
短い振動の長さは、Twitterで「いいね」を押した時ぐらいの振動だと考えてください(iOSの場合)。こちらは、長い振動と違い少し前準備が必要になってきます。
※プラグインビルドの参考にしたサイトはこちら
playSystemSoundの準備
まずはUnityで「C#」のスクリプトを作り以下のサンプルコードを貼り付けます。なお名前は「playSystemSound」で作ってください。
#import <Foundation/Foundation.h>
#import <AudioToolBox/AudioToolBox.h>
extern "C" void _playSystemSound(int soundId)
{
AudioServicesPlaySystemSound(soundId);
}
この時エラーが表示されますが、無視して上書き保存を行ってください。
保存が完了したら、ファイルがあるフォルダを開き、「playSystemSound.cs」の拡張子を「.cs」から「.mm」に書き換えます。
また、「playSystemSound.cs.meta」は不要になるので消してください。
振動クラスの実装
ここまでの準備が完了したら以下の「VibrationMng」をC#スクリプトで作ります。
※なおこのスクリプトはオブジェクトにアタッチする必要はありません!
■VibrationMng
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.InteropServices;
public static class VibrationMng
{
// 振動
public static void ShortVibration()
{
if (SystemInfo.supportsVibration)
{
PlaySystemSound(1519);
Vibrate(3);
}
}
// iOS設定
#if UNITY_IOS && !UNITY_EDITOR
[DllImport ("__Internal")]
static extern void _playSystemSound(int n);
#endif
private static void PlaySystemSound(int n) //引数にIDを渡す
{
#if UNITY_IOS && !UNITY_EDITOR
_playSystemSound(n);
#endif
}
// Android設定
#if UNITY_ANDROID && !UNITY_EDITOR
public static AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
public static AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
public static AndroidJavaObject vibrator = currentActivity.Call<AndroidJavaObject>("getSystemService", "vibrator");
#endif
private static void Vibrate(long milliseconds)
{
#if UNITY_ANDROID && !UNITY_EDITOR
vibrator.Call("vibrate", milliseconds);
#endif
if (milliseconds >= 1000)
{
Handheld.Vibrate();
}
}
}
振動を試してみる
スクリプトの作成が完了したら、実際に使用してみます。
VibrationMng.ShortVibration();
振動を行いたい場所で「VibrationMng.ShortVibration();」を呼び出せば短い振動が1回発生します。
連続で振動させたい場合などは、長い振動でやったコルーチンとの組み合わせがおすすめです。ただ、コルーチンの間隔時間「yield return new WaitForSeconds(0.6f);」は「yield return new WaitForSeconds(0.3f);」にするなど、ある程度短くする必要はあります。
まとめ
以上がUnityで短い振動と長い振動を実装するための方法についてでした。短い振動などは、ボタンを押した時のちょっとしたリアクションに使いやすいと思いますので、ぜひ実装してみてください!