近い対話機能を追加する方法

近くの相互作用は、接触とグラブの形になります。 Touch イベントとグラブイベントは、それぞれ PokepointerSpherePointerによってポインターイベントとして発生します。

特定の視聴オブジェクトでタッチまたはグラブ入力イベントをリッスンするには、3つの主要な手順が必要です。

  1. 関連するポインターがメイン Mrtk 構成プロファイルに登録されていることを確認します。
  2. 目的の作成オブジェクトに、適切な グラブ または タッチ スクリプトコンポーネントとがあることを確認し Unity Collider ます。
  3. グラブイベントまたはタッチイベントをリッスンするために、アタッチされたスクリプトに対して、必要な接続オブジェクトに入力ハンドラーインターフェイスを実装します。

グラブ操作の追加

  1. Mrtk ポインタープロファイルSpherePointerが登録されていることを確認します。

    既定の mrtk プロファイルと既定の HoloLens 2 プロファイルには、既に SpherePointer が含まれています。 SpherePointer が作成されることを確認するには、mrtk 構成プロファイルを選択し、[入力 > ポインター > ポインターのオプション] に移動します。 既定 GrabPointer の prefab (Assets/MRTK/SDK/Features/UX/Prefabs/ポインター) には、コントローラーの 種類 が表示されます。 カスタム prefab は、クラスが実装されている限り利用でき SpherePointer ます。

    グラブポインタープロファイルの例

    既定のグラブポインターは、既定の Hololens 2 インターフェイスと一致するように、グラブポイントを中心にした円錐内の近くのオブジェクトを照会します。

    円錐グラブポインター

  2. Grabbable しなければならないオブジェクトで、collider と共にを追加し NearInteractionGrabbable ます。

    作成したオブジェクトのレイヤーが grabbable レイヤー上にあることを確認します。 既定では、 空間認識無視 Raycasts を除くすべてのレイヤーが grabbable です。 GrabPointer prefab で グラブレイヤーマスク を調べて、どのレイヤーが grabbable されているかを確認します。

  3. このオブジェクトまたはその先祖の1つで、インターフェイスを実装するスクリプトコンポーネントを追加し IMixedRealityPointerHandler ます。 を持つオブジェクトの先祖は、 NearInteractionGrabbable ポインターイベントも受け取ることができます。

グラブコードの例

イベントがタッチまたはグラブの場合に印刷されるスクリプトを以下に示します。 関連する Imixedrealitypointer handler インターフェイス関数では、を介してイベントをトリガーするポインターの型を確認でき MixedRealityPointerEventData ます。 ポインターが SpherePointer の場合、相互作用はグラブです。

public class PrintPointerEvents : MonoBehaviour, IMixedRealityPointerHandler
{
    public void OnPointerDown(MixedRealityPointerEventData eventData)
    {
        if (eventData.Pointer is SpherePointer)
        {
            Debug.Log($"Grab start from {eventData.Pointer.PointerName}");
        }
        if (eventData.Pointer is PokePointer)
        {
            Debug.Log($"Touch start from {eventData.Pointer.PointerName}");
        }
    }

    public void OnPointerClicked(MixedRealityPointerEventData eventData) {}
    public void OnPointerDragged(MixedRealityPointerEventData eventData) {}
    public void OnPointerUp(MixedRealityPointerEventData eventData) {}
}

タッチ操作の追加

UnityUI 要素にタッチ操作を追加するプロセスは、バニラ3D のユーザーオブジェクトの場合とは異なります。 Unity ui コンポーネントを有効にするには、 UNITY ui の次のセクションに進んでください。

ただし、どちら の種類の UX 要素でも、 mrtk ポインタープロファイルpokepointerが登録されていることを確認してください。

既定の mrtk プロファイルと既定の HoloLens 2 プロファイルには、既に pokepointer が含まれています。 Mrtk 構成プロファイルを選択し、[入力 > ポインター > ポインターのオプション] に移動することで、pokepointer が作成されることを確認できます。 既定 PokePointer (Assets/MRTK/SDK/Features/UX/Prefabs/ポインター) prefab は、コントローラーの種類 が "合成" で一覧表示されます。 カスタム prefab は、クラスが実装されている限り利用でき PokePointer ます。

からかうポインタープロファイルの例

3D のお持ちオブジェクト

3d オブジェクトにタッチ操作を追加する方法は2つあります。3d オブジェクトの touchable 平面を1つだけにする必要があるかどうか、または collider 全体に基づいて touchable する必要があるかどうかによって異なります。 最初の方法は、通常、BoxColliders を使用するオブジェクトです。ここでは、collider の1つの面だけがタッチイベントに反応するようにする必要があります。 もう1つは、collider に基づいて任意の方向から touchable する必要のあるオブジェクトです。

ワン顔タッチ

これは、1つの顔だけを touchable する必要がある状況を実現するのに役立ちます。 このオプションは、game オブジェクトに BoxCollider があることを前提としています。 これを BoxCollider 以外のオブジェクトと共に使用することもできます。その場合は、' Bounds ' プロパティと ' Local Center ' プロパティを手動で設定して touchable 平面を構成します (つまり、境界は0以外の値に設定する必要があります)。

  1. Touchable する必要がある設定オブジェクトで、BoxCollider と a [ NearInteractionTouchable ] (xref: Toolkit MixedReality を追加します。NearInteractionTouchable) コンポーネント。

    1. [] (Xref: Toolkit MixedReality を使用する場合に タッチ するよう にイベント を設定します。 IMixedRealityTouchHandlerIMixedRealityTouchHandler) インターフェイスをコンポーネントスクリプトに入力します。

    2. [境界の修正センターの修正] をクリックします。

    NearInteractionTouchable セットアップ

  2. そのオブジェクトまたはその先祖の1つで、 IMixedRealityTouchHandler efi. [ NearInteractionTouchable ] (Xref: Toolkit MixedReality を持つオブジェクトの任意の先祖。NearInteractionTouchable) もポインターイベントを受け取ることができます。

注意

NearInteractionTouchable のボタンが選択されているエディターのシーンビューで、白いアウトラインの正方形と矢印を確認します。 矢印は、touchable の "front" を指しています。 Collidable は、その方向からのみ touchable されます。 すべての方向から collider touchable を作成するには、 任意の collider タッチに関するセクションを参照してください。 NearInteractionTouchable ギズモ

任意の collider タッチ

これは、ゲームオブジェクトを collider の面全体に沿って touchable する必要がある状況を実現するのに役立ちます。 たとえば、これを使用して、SphereCollider を持つオブジェクトのタッチ操作を有効にすることができます。この場合、collider 全体を touchable にする必要があります。

  1. Touchable する必要がある設定オブジェクトで、collider と [ NearInteractionTouchableVolume ] (xref: Toolkit MixedReality を追加します。NearInteractionTouchableVolume) コンポーネント。

    1. [] (Xref: Toolkit MixedReality を使用する場合に タッチ するよう にイベント を設定します。 IMixedRealityTouchHandlerIMixedRealityTouchHandler) インターフェイスをコンポーネントスクリプトに入力します。
  2. そのオブジェクトまたはその先祖の1つで、 IMixedRealityTouchHandler efi. [ NearInteractionTouchable ] (Xref: Toolkit MixedReality を持つオブジェクトの任意の先祖。NearInteractionTouchable) もポインターイベントを受け取ることができます。

Unity UI

  1. シーンに Unityui キャンバス があることを確認します。

  2. Touchable にする必要がある設定オブジェクトで、コンポーネントを追加し NearInteractionTouchableUnityUI ます。

    1. 次のコンポーネントスクリプトでインターフェイスを使用している場合は、が タッチ するよう にイベント を設定 IMixedRealityTouchHandler します。
  3. そのオブジェクトまたはその先祖の1つで、インターフェイスを実装するスクリプトコンポーネントを追加し IMixedRealityTouchHandler ます。 を持つオブジェクトの先祖は、 NearInteractionTouchableUnityUI ポインターイベントも受け取ることができます。

重要

オブジェクトが、重なっている canvas オブジェクトに配置されている場合、オブジェクトが予期したとおりに動作しないことがあります。 一貫した動作を確保するために、シーン内のキャンバスオブジェクトを重ねることは避けてください。

重要

NearInteractionTouchableスクリプトコンポーネントでは、プロパティイベントを 受け取るためにポインタータッチ の2つのオプションがあります。 インターフェイスを使用する場合は ポインター受け取るイベント を設定 IMixedRealityPointerHandler し、入力イベントを応答または処理するコンポーネントスクリプトでインターフェイスを使用する場合は タッチ に設定し IMixedRealityTouchHandler ます。

タッチコードの例

次のコードは、バリアントコンポーネントを使用して接続オブジェクトにアタッチ NearInteractionTouchable し、タッチ入力イベントに応答できる、モノの動作を示しています。

public class TouchEventsExample : MonoBehaviour, IMixedRealityTouchHandler
{
    public void OnTouchStarted(HandTrackingInputEventData eventData)
    {
        string ptrName = eventData.Pointer.PointerName;
        Debug.Log($"Touch started from {ptrName}");
    }
    public void OnTouchCompleted(HandTrackingInputEventData eventData) {}
    public void OnTouchUpdated(HandTrackingInputEventData eventData) { }
}

Near 対話スクリプトの例

タッチ イベント

この例では、キューブを作成し、それを touchable にして、タッチの色を変更します。

public static void MakeChangeColorOnTouch(GameObject target)
{
    // Add and configure the touchable
    var touchable = target.AddComponent<NearInteractionTouchableVolume>();
    touchable.EventsToReceive = TouchableEventType.Pointer;

    var material = target.GetComponent<Renderer>().material;
    // Change color on pointer down and up
    var pointerHandler = target.AddComponent<PointerHandler>();
    pointerHandler.OnPointerDown.AddListener((e) => material.color = Color.green);
    pointerHandler.OnPointerUp.AddListener((e) => material.color = Color.magenta);
}

グラブイベント

次の例は、作成したオブジェクトをドラッグ可能にする方法を示しています。 Game オブジェクトに collider があることを前提としています。

public static void MakeNearDraggable(GameObject target)
{
    // Instantiate and add grabbable
    target.AddComponent<NearInteractionGrabbable>();

    // Add ability to drag by re-parenting to pointer object on pointer down
    var pointerHandler = target.AddComponent<PointerHandler>();
    pointerHandler.OnPointerDown.AddListener((e) =>
    {
        if (e.Pointer is SpherePointer)
        {
            target.transform.parent = ((SpherePointer)(e.Pointer)).transform;
        }
    });
    pointerHandler.OnPointerUp.AddListener((e) =>
    {
        if (e.Pointer is SpherePointer)
        {
            target.transform.parent = null;
        }
    });
}

便利な API

関連項目