「Inverse Unity Package」の使い始め
このガイドでは、基本的なセットアップと簡単なサンプルを通じて、Haply の「Inverse Unity Package」の基本的な使い方を説明します。パッケージのインストール、ハプティックリグのセットアップ、力制御と位置制御のための簡単なスクリプトの作成について解説します。
詳細な説明や高度な手法については、チュートリアルをご覧ください。
バージョン・サポート
- Unity 2021.3.x LTS:サポート対象
- Unity 2022.1.x LTS:サポート対象
- Unity 6000.x LTS:サポート対象
- Haply Inverse SDK: 3.1.0 以上
前提条件
- Haply Inverse SDK バージョン 3.1.0 以降をインストールしてください。
- Haply Inverse Serviceが動作していることを確認してください。
- シーンを起動する前に、Inverse3 とVerseGripデバイスが接続され、キャリブレーションが完了していることを確認してください。
このパッケージは、Inverse3 のサポートを強化するために継続的に開発されています。サポート、フィードバック、ご要望については、お問い合わせください。
インストール
「Inverse Unity」パッケージは、UnityのScoped Registryから入手できます。パッケージを統合するには、以下の手順に従ってください。
-
「編集」>「プロジェクト設定」>「パッケージマネージャー」を開きます。以下の内容で、新しいスコープ付きレジストリを追加します。
- 名前:
Haply Robotics - URL:
https://unitypackages.haply.co - スコープ(複数可):
co.haply

- 名前:
-
ウィンドウ > パッケージマネージャ を開き、追加 ボタンをクリックして、パッケージを名前で追加する を選択します。
co.haply.inverseと入力し、追加 をクリックします。
インストールが完了すると、パッケージマネージャーに Inverse パッケージが表示されます。
ハプティックリグのセットアップ
ハプティックリグを作成するには、「GameObject」>「Haply Inverse」>「Haptic Rig (one hand)」の順に選択します。 この操作により、Inverse3 コントローラーとVerseGripを含む完全な環境が構築されます。
シーンには以下のものが含まれるようになります。
- Haptic Device Mapper:Haply のInverse Serviceを使用して、デバイスの割り当てを管理します。
- Haptic Origin:シーン内でハプティック設定の拡大・縮小および配置を行います。
- ハプティックコントローラー: Inverse3VerseGripのデバイスデータに基づいて、カーソルの力または位置を制御します。
- カー ソル:シーンの表示用に、Inverse3 カーソルとVerseGripカーソルのコンポーネントが含まれています。

パッケージのコンポーネントの詳細については、「Global Architecture」のドキュメントページをご覧ください。
プレイモードでは、球体が Inverse3 カーソルやVerseGripの向きに合わせて移動・回転します。


力制御モード
ForceControl.cs C# スクリプトを作成し、ハプティック・オリジン GameObject にアタッチします。
このスクリプトを使用すると、インスペクターのスライダーで Inverse3 デバイスに力を加えることができます。
using Haply.Inverse;
using UnityEngine;
public class ForceControl : MonoBehaviour
{
[Range(-2, 2)]
public float forceX;
[Range(-2, 2)]
public float forceY;
[Range(-2, 2)]
public float forceZ;
private Inverse3 _inverse3;
private void Awake()
{
_inverse3 = GetComponentInChildren<Inverse3>();
}
protected void OnEnable()
{
_inverse3.DeviceStateChanged += OnDeviceStateChanged;
}
protected void OnDisable()
{
_inverse3.DeviceStateChanged -= OnDeviceStateChanged;
_inverse3.Release();
}
private void OnDeviceStateChanged(object sender, Inverse3EventArgs args)
{
var inverse3 = args.DeviceController;
inverse3.SetCursorLocalForce(new Vector3(forceX, forceY, forceZ));
}
}
スクリプトの説明
-
forceX, Y, Z: スライダーで調整可能な力ベクトルの成分です。力は、CursorSetForceメソッドに渡される前に、安全な範囲内に収まるよう制限されます。 あるいは、標準のVector3フィールドを使用することもできます。 -
Awake(): 現在の GameObject またはその子から Inverse3 コンポーネントを取得します。 -
OnEnable():Awakeメソッドの呼び出し後、およびスクリプトが有効になるたびに、ハプティック更新からのOnDeviceStateChangedコールバックを別のスレッドで登録します。 -
OnDisable(): スクリプトが無効になったり、アプリケーションが停止したりした際に、コールバックの登録を解除し、リセットを行います。 -
OnDeviceStateChanged: インスペクタウィンドウからforceベクトルを取得し、CursorSetForceメソッドを使って Inverse3 に転送します。重要:このコールバックは、1kHz から 8kHz の高頻度でハプティックスレッドから呼び出されます。 このコールバック内のすべてのコードを十分に最適化しておくことが極めて重要です。
使い方
プレイモードに入る前に、カーソルが保持されていることを確認してください。デバイスは、緑色のランプで示される「Force Control」状態に移行します。 その後、スライダーを使って力の出力を調整し、デバイスのワークスペース内で操作を行うことができます。
力を調整すると、Inverse3 が動きます。ワークスペースに障害物がないことを確認し、必ずカーソルを離さないでください。 安全に関するガイドラインについては、「安全な使用方法」の記事を参照してください。

位置制御モード
同様に、デバイスの位置を制御するための PositionControl.cs C# スクリプトを作成し、ハプティック・オリジン GameObject にアタッチします。
using Haply.Inverse;
using UnityEngine;
public class PositionControl : MonoBehaviour
{
[Range(-0.1f, 0.1f)]
public float positionX;
[Range(-0.1f, 0.1f)]
public float positionY;
[Range(-0.1f, 0.1f)]
public float positionZ;
private Inverse3 _inverse3;
private void Awake()
{
_inverse3 = GetComponentInChildren<Inverse3>();
}
protected void OnEnable()
{
_inverse3.DeviceStateChanged += OnDeviceStateChanged;
}
protected void OnDisable()
{
_inverse3.DeviceStateChanged -= OnDeviceStateChanged;
_inverse3.Release();
}
private void OnDeviceStateChanged(object sender, Inverse3EventArgs args)
{
var inverse3 = args.DeviceController;
inverse3.SetCursorLocalPosition(inverse3.WorkspaceCenterLocalPosition + new Vector3(positionX, positionY, positionZ));
}
}
ForceControlスクリプト、またはデバイスを制御するその他のスクリプトが無効になっていることを確認してください。
前の例と同様に:
- 再生モード中にスライダーを使って 位置 を調整するには、
positionX, Y, and Zを利用します。選択した
Range(-0.1, 0.1)は、おおよそ到達可能な最大位置に相当します。 Awakeメソッドは Inverse3 コンポーネントを取得します。OnEnableメソッドは、Awakeメソッドの呼び出し後、およびスクリプトが有効になるたびに、触覚の更新によってOnDeviceStateChangedコールバックを別のスレッドで登録します。OnDisableこのメソッドは、スクリプトが無効になったりアプリケーションが停止したりした際に、コールバックの登録を解除し、状態をリセットします。
ただし、次のような違いがあります:
OnDeviceStateChangedコールバックは、各触覚フレームごとに、 インスペクターウィンドウから位置ベクトルを取得し、それをWorkspaceCenterLocalPositionこれに加えて、CursorSetLocalPositionメソッドを使用して、Inverse3 に送信します。
再生モードに入る前に、カーソルを中心位置の近くに置いておいてください。 デバイスは「位置制御」状態(青いライトで表示されます)に移行するはずです。 その後、スライダーで位置出力を調整し、デバイスの作業領域を確認できます。
位置を調整すると、Inverse3 が動きます。ワークスペースに貴重品がないことを確認し、必ずカーソルを離さないでください。 詳細については、「安全な使用に関する記事」を参照してください。
