【Unity】短い振動と長い振動の実装【iOS/Android】

Unityの長い振動と短い振動の実装
スポンサーリンク

Unityのアプリで、振動を実装するための手順をまとめます。今回は短めの振動と長めの振動、それぞれを実装する方法について解説しています。

こんな人におすすめ

・Unityのアプリに振動を実装したい
・iOSとAndroidそれぞれに有効な振動を実装したい

長い振動

まずはお手軽に実装できる、長い振動から解説します!

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で短い振動と長い振動を実装するための方法についてでした。短い振動などは、ボタンを押した時のちょっとしたリアクションに使いやすいと思いますので、ぜひ実装してみてください!