🫨

【Unity】iOS/Android共通で使える!MobileHapticFeedbackの紹介

に公開

はじめに

ハプティックフィードバック(振動フィードバック)は、ユーザー体験を変える要素の一つです。

ただ、Unityでモバイル向けに実装しようとすると、意外と一手間かかります。

ネイティブコードを書く必要が出てきたり、iOSとAndroidの両方に対応しようとするとプラットフォームごとに処理を書き分けなければならなかったり...。

そこで、iOS/Android共通のAPIでシンプルに実装できる MobileHapticFeedback ライブラリを作りました!

https://github.com/tsyk5/MobileHapticFeedback

この記事では、ライブラリの特徴や各APIの使い方を解説していきます。

ライブラリの特徴

このライブラリの最大の特徴は、iOSとAndroidで共通のAPIが使える点。

プラットフォームを意識せずに使える、3種類のAPIを提供しています。

API 概要
UIKit風API Appleが定義するUIKitをそのまま使える
CoreHaptic風API 強度・鋭さ・継続時間を細かく制御できる
パターンAPI 複雑な振動パターンを配列で定義できる

iOSではAppleのUIKitとCoreHapticsを使用しています(詳しくは後述)。AndroidはAndroid標準のバイブレーションAPIを通じて、iOSの挙動に近くなるよう実装しています。

UIKitとは?

AppleがUI操作時のフィードバック体験として定義したライブラリです。Appleの公式ドキュメントにて、各フィードバックタイプについて確認できます。

MobileHapticFeedbackでは、UIKitが提供する全てのフィードバックタイプに対応しています。

  • Notification(通知):Success / Warning / Error
  • Selection(選択)
  • Impact(衝撃):Light / Medium / Heavy

CoreHapticsとは?

iOS 13から導入された、Apple純正のハプティクスエンジンです。UIKitが「用意されたパターンを選ぶ」のに対して、CoreHapticsは「振動の感触を自分でゼロから設計できる」イメージです。

CoreHapticsが本来できることは、多岐にわたります。

  • サウンドと振動の同期再生
  • Dynamic Parametersによる、再生中のリアルタイムなパラメータ変更
  • AHAPファイル(Appleが定めたJSON形式)による複雑なパターンの定義・再生
  • 瞬間的な振動(Transient)と持続的な振動(Continuous)を組み合わせた細かい制御

などなど。(興味があればドキュメントWWDCのセッション動画を参照ください)

ですが、これらの機能は、iPhoneに搭載されているバイブレーション機能を前提として作られています。

そのため、MobileHapticFeedbackではiOS/Android間の共通化を優先し、CoreHapticsの一部の機能のみを使うようにしました。

3つのAPIについて

1. UIKit風API

UIKitの全7パターンを以下のように指定するだけで使えます。

// 衝撃フィードバック(軽・中・重)
MobileHapticFeedback.PlayImpact(ImpactStyle.Light);
MobileHapticFeedback.PlayImpact(ImpactStyle.Medium);
MobileHapticFeedback.PlayImpact(ImpactStyle.Heavy);

// セレクション(UI選択時など)
MobileHapticFeedback.PlaySelection();

// 通知(成功・警告・失敗)
MobileHapticFeedback.PlayNotification(NotificationType.Success);
MobileHapticFeedback.PlayNotification(NotificationType.Warning);
MobileHapticFeedback.PlayNotification(NotificationType.Error);

2. CoreHaptic風API

強度・鋭さ・継続時間を細かく制御したいときに使います。「UIKit風APIでは微妙に感触が合わない」という場合にパラメータを調整して試してみてください。

// エンジンの初期化(最初に1回だけ呼ぶことを推奨)
MobileHapticFeedback.Prepare();

// カスタムインパクト
MobileHapticFeedback.PlayImpact(
    intensity: 0.6f,    // 強度(0〜1)
    sharpness: 0.3f,    // 鋭さ(0〜1)※iOS専用
    durationSec: 0.2f   // 継続時間(秒)
);

// 停止
MobileHapticFeedback.Stop();

3. パターンAPI

継続時間(秒)と振動強度(0で無振動)を対応する配列で指定することで、リズムのある振動パターンを作れます。

// 振動時間(秒)と振動強度(0〜1)を配列で指定
var durationsSec = new float[] { 0.6f, 0.15f, 0.3f };
var amplitudes   = new float[] { 0.8f, 0.0f,  1.0f };

MobileHapticFeedback.PlayPattern(durationsSec, amplitudes);

ライブラリのサンプルシーンでは、SOS(モールス信号)・心臓の鼓動・だんだん大きくなるパターンを用意しました。

このAPIを活用すれば、シューティングゲームや斬撃ゲームなどで、武器の種類ごとに異なる振動を割り当てることも可能です。SEと同時に鳴らすことで、より体験が深まるかもしれませんね。

注意事項

端末側のバイブレーション設定が必要

ハプティックフィードバックを使うには、端末のバイブレーション機能が有効になっている必要があります。

  • iPhoneの場合:設定 → サウンドと触覚 → システムの触覚
  • Androidの場合:設定またはアクセシビリティからバイブレーションを有効にする

なお、ライブラリは設定がオフの場合や非対応デバイスの場合、自動的に処理をスキップします。

まとめ

自分のアプリに組み込んでみて「ここに入れたらUX良くなるかな?」と考えながら実装するのは、とても楽しい作業でした🍵

今後もAppleとAndroidのハプティックフィードバック関連情報を追いながらブラッシュアップしていく予定です。

もし、ご感想・ご意見があればお気軽にコメントやGitHubのIssueなどでお知らせください!

Discussion