【Meta XR SDK】Meta XR Haptics SDKを使ってコントローラーの振動と音声を連動させる：その1 Haptics SDKとHaptics Studioの使い方【Quest 2, Pro, 3】

こんにちは、きくはなです。
今回はMeta XR SDKのv60から追加された新機能である、Meta XR Haptics SDKの詳細と、関連アプリのHaptics Studioの使い方を紹介していきます。
コントローラーの振動と音声を連動させることができ、XRコンテンツの没入感・臨場性を向上させることにも繋がる重要な機能だと思いますので、ぜひ試してみて下さい。

【追記】
コントローラーの振動と音声を連動させる部分を記述しておらず、若干詐欺っぽくなってしまっていたので、2,3部構成に分けて解説しようと思います。

# Haptics SDK
Haptics SDKは、v60以降のMeta XR All-in-One SDKに含まれています。

https://assetstore.unity.com/packages/tools/integration/meta-xr-all-in-one-sdk-269657

## Haptics SDKで何ができるか

Haptics SDKをインポートすることで、.hapticファイルに設定されたコントローラーの振動を再生できるようになります。

:::note info
サンプルシーンが下記画像の場所にあります。
注意点として、サンプルを使用する場合、All-in-one SDKとは別に、Asset Storeから個別のHaptics SDKをマイアセットに登録しておく必要があります。
https://assetstore.unity.com/packages/tools/integration/meta-xr-haptics-sdk-272446
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659212/36266b87-d81f-9965-1f40-b49d7732c3d4.png)

## スクリプトでの制御方法
.hapticファイルはHapticClipクラスとして扱われ、HapticClipPlayerクラスを使用して再生できます。
ここでは簡単に、[Meta公式のドキュメント](https://developer.oculus.com/documentation/unity/unity-haptics-sdk)に記載されているスクリプトを取り上げて基本機能を解説します。

```cs:MyClass.cs
using Oculus.Haptics;

public class MyClass : MonoBehaviour
{
    // Assign both clips in the Unity editor
    public HapticClip clip1;
    public HapticClip clip2;
    private HapticClipPlayer player;

    void Awake()
    {
        player = new HapticClipPlayer(clip1);
    }

    public void PlayHapticClip1()
    {
       player.Play(Controller.Left);
    }

    public void PlayHapticClip2()
    {
        // Setting a new clip will stop the current playback
        player.clip = clip2;
        // Let's start the player again with the new clip loaded
        player.Play(Controller.Left);
    }

    public void StopHaptics()
    {
        player.Stop();
    }

    void OnDestroy()
    {
        // Free the HapticClipPlayer
        player.Dispose();
    }

}
```
- `using Oculus.Haptics;`を追加しましょう。
- HapticClipPlayerを`new HapticClipPlayer(clip1)`で生成。引数の`clip1`は省略できないようです。
- `Play()`で振動を再生できます。振動させたいコントローラーを右手・左手・両手のうちから選べます。
- `Stop()`で振動を停止できます。
- 処理をやめる場合、HapticClipPlayerを`Dispose()`することが推奨されています。
- 他にも、再生の優先順位を扱う`priority`プロパティや、振動をループさせる`isLooping`プロパティが存在します。振動の強度や周波数の調整など、より詳しい設計方法を知りたい場合、公式のドキュメントを参照してください。

# Haptics Studio
Haptics Studioは、前述の.hapticファイルを作成できるアプリケーションです。
[詳細・ダウンロード先はこちら](https://developer.oculus.com/documentation/unity/haptics-studio)
PC版(Win, Mac)と、VRアプリ版の二種類存在しますが、それぞれ用途が異なり、Wifi経由で連動させることもできます。

## PC(Win, Mac)
音声ファイル(.wav, .ogg, .mp3)をもとに、.hapticファイルを生成できます。
また、振動の強度や周波数を編集することも可能です。
VRアプリと接続させると、生成した.hapticファイルの振動をすぐに確認できます。

## VRアプリ
https://www.meta.com/ja-jp/experiences/6759764157450104/

通常のVRアプリケーションと同様に、Quest Storeからダウンロードできます。
こちらは主に.hapticファイルの振動を確認する用途で使われます。
PCと接続しないと生成した振動の確認はできませんが、単体でも動作するサンプルが用意されています。
コントローラー振動がどのようなものか理解したい場合は、こちらのサンプルだけでも十分可能です。

## 参考URL (Meta公式ドキュメント)
#### Haptics SDK (Unity)
https://developer.oculus.com/documentation/unity/unity-haptics-sdk
#### Haptics Studio
https://developer.oculus.com/documentation/unity/haptics-studio
#### Haptics設計に関するガイドライン
https://developer.oculus.com/resources/haptics-design-guidelines/

特に、"Haptics設計に関するガイドライン"については、Hapticsを使用する際の知見などがまとめられているので、ぜひご一読ください。