다음을 통해 공유


근사한 상호 작용을 추가하는 방법 - MRTK2

가까운 상호 작용은 터치와 잡기의 형태로 온다. 터치 및 잡기 이벤트는 각각 PokePointerSpherePointer에 의해 포인터 이벤트로 발생합니다.

특정 GameObject에서 터치 및/또는 입력 이벤트를 수신 대기하려면 세 가지 주요 단계가 필요합니다.

  1. 관련 포인터가 기본 MRTK 구성 프로필에 등록되어 있는지 확인합니다.
  2. 원하는 GameObject에 적절한 잡기 또는 터치 스크립트 구성 요소 및 Unity Collider가 있는지 확인합니다.
  3. 원하는 GameObject에 연결된 스크립트에서 입력 처리기 인터페이스를 구현하여 잡기 또는 터치 이벤트를 수신 대기합니다.

잡기 상호 작용 추가

  1. MRTK 포인터 프로필SpherePointer가 등록되어 있는지 확인합니다.

    기본 MRTK 프로필 및 기본 HoloLens 2 프로필에는 이미 SpherePointer가 포함되어 있습니다. MRTK 구성 프로필을 선택하고 입력>포인터>포인터 옵션으로 이동하여 SpherePointer가 생성될지 확인할 수 있습니다. 기본 GrabPointer 프리팹(Assets/MRTK/SDK/Features/UX/Prefabs/Pointers)은 컨트롤러 유형의굴절식 손과 함께 나열되어야 합니다. 사용자 지정 프리팹은 클래스를 구현하는 한 활용할 수 있습니다 SpherePointer .

    포인터 프로필 가져오기 예제

    기본 잡기 포인터는 기본 HoloLens 2 인터페이스와 일치하도록 잡기 지점 주변의 원뿔에 있는 주변 개체에 대해 쿼리합니다.

    원뿔형 잡아 포인터

  2. 잡을 수 있어야 하는 GameObject에서 , 충돌기를 추가 NearInteractionGrabbable합니다.

    GameObject의 레이어가 잡기 가능한 레이어에 있는지 확인합니다. 기본적으로 공간 인식레이캐스트 무시 를 제외한 모든 계층은 잡을 수 있습니다. GrabPointer 프리팹에서 그랩 레이어 마스크를 검사하여 어떤 레이어를 잡을 수 있는지 확인합니다.

  3. GameObject 또는 상위 항목 중 하나에서 인터페이스를 구현하는 스크립트 구성 요소를 추가합니다 IMixedRealityPointerHandler . 가 있는 NearInteractionGrabbable 개체의 상위 항목도 포인터 이벤트를 받을 수 있습니다.

Grab 코드 예제

다음은 이벤트가 터치 또는 잡기인 경우 인쇄되는 스크립트입니다. 관련 IMixedRealityPointerHandler 인터페이스 함수에서 을 통해 MixedRealityPointerEventData해당 이벤트를 트리거하는 포인터 유형을 확인할 수 있습니다. 포인터가 SpherePointer인 경우 상호 작용은 grab입니다.

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 GameObjects와 다릅니다. Unity UI 구성 요소를 사용하도록 설정하려면 다음 섹션인 Unity UI로 건너뛸 수 있습니다.

하지만 두 가지 유형의 UX 요소 모두에 대해 PokePointerMRTK 포인터 프로필에 등록되어 있는지 확인합니다.

기본 MRTK 프로필 및 기본 HoloLens 2 프로필에는 이미 PokePointer가 포함되어 있습니다. MRTK 구성 프로필을 선택하고 입력>포인터> 옵션으로 이동하여 PokePointer가 생성될지 확인할 수있습니다. 기본값 PokePointer (Assets/MRTK/SDK/Features/UX/Prefabs/Pointers) 프리팹은 컨트롤러 유형의관절식 손으로 나열되어야 합니다. 사용자 지정 프리팹은 클래스를 구현하는 한 활용할 수 있습니다 PokePointer .

Poke 포인터 프로필 예제

3D GameObjects

3D 개체에 단일 터치 가능 평면만 있어야 하는지 또는 전체 충돌체를 기반으로 터치할 수 있어야 하는지에 따라 3D GameObjects에 터치 상호 작용을 추가하는 두 가지 방법이 있습니다. 첫 번째 방법은 일반적으로 BoxColliders가 있는 개체에 있으며, 여기서는 충돌기의 단일 얼굴만 터치 이벤트에 반응하도록 합니다. 다른 하나는 충돌기를 기반으로 모든 방향에서 터치할 수 있어야 하는 개체에 대한 것입니다.

단일 얼굴 터치

이는 한 얼굴만 만져야 하는 상황을 가능하게 하는 데 유용합니다. 이 옵션은 게임 개체에 BoxCollider가 있다고 가정합니다. 이 속성을 BoxCollider가 아닌 개체와 함께 사용할 수 있습니다. 이 경우 'Bounds' 및 'Local Center' 속성은 터치 가능한 평면을 구성하도록 수동으로 설정됩니다(예: 경계를 0이 아닌 값으로 설정해야 합니다).

  1. 터치 가능해야 하는 GameObject에서 BoxCollider 및 NearInteractionTouchable 구성 요소를 추가합니다.

    1. 아래 구성 요소 스크립트에서 인터페이스를 IMixedRealityTouchHandler 사용하는 경우 이벤트를 Receive to Touch로 설정합니다.

    2. 경계 수정센터 수정을 클릭합니다.

    NearInteractionTouchable 설정

  2. 해당 개체 또는 상위 항목 중 하나에서 를 구현하는 스크립트 구성 요소를 추가합니다. IMixedRealityTouchHandler 인터페이스. 가 있는 NearInteractionTouchable 개체의 상위 항목도 포인터 이벤트를 받을 수 있습니다.

참고

NearInteractionTouchable GameObject가 선택된 편집기 장면 보기에서 흰색 윤곽선 사각형과 화살표를 확인합니다. 화살표는 터치 가능 개체의 "전면"을 가리킵니다. 충돌 가능한 은 해당 방향에서만 터치할 수 있습니다. 모든 방향에서 충돌기를 터치할 수 있도록 하려면 임의 충돌기 터치 섹션을 참조하세요. NearInteractionTouchable Gizmos

임의 충돌기 터치

이는 전체 충돌체 얼굴을 따라 게임 개체를 터치할 수 있어야 하는 상황을 사용하도록 설정하는 데 유용합니다. 예를 들어 전체 충돌체를 터치할 수 있어야 하는 SphereCollider를 사용하는 개체에 대한 터치 조작을 사용하도록 설정하는 데 사용할 수 있습니다.

  1. 터치 가능해야 하는 GameObject에서 충돌기와 NearInteractionTouchableVolume 구성 요소를 추가합니다.

    1. 아래 구성 요소 스크립트에서 인터페이스를 IMixedRealityTouchHandler 사용하는 경우 이벤트를 Receive to Touch로 설정합니다.
  2. 해당 개체 또는 상위 항목 중 하나에서 를 구현하는 스크립트 구성 요소를 추가합니다. IMixedRealityTouchHandler 인터페이스. 가 있는 NearInteractionTouchable 개체의 상위 항목도 포인터 이벤트를 받을 수 있습니다.

Unity UI

  1. 장면에 UnityUI 캔버스 가 있는지 추가/확인합니다.

  2. 터치 가능해야 하는 GameObject에서 NearInteractionTouchableUnityUI 구성 요소를 추가합니다.

    1. 아래 구성 요소 스크립트에서 인터페이스를 IMixedRealityTouchHandler 사용하는 경우 이벤트를 Receive to Touch로 설정합니다.
  3. 해당 개체 또는 상위 항목 중 하나에서 인터페이스를 구현하는 스크립트 구성 요소를 추가합니다 IMixedRealityTouchHandler . 를 가진 NearInteractionTouchableUnityUI 개체의 상위 항목도 포인터 이벤트를 받을 수 있습니다.

중요

개체가 겹치는 캔버스 개체에 있는 경우 개체가 예상대로 동작하지 않을 수 있습니다. 일관된 동작을 보장하려면 장면에서 캔버스 개체와 겹치지 않습니다.

중요

스크립트 구성 요소에서 NearInteractionTouchable이벤트 수신 속성에는 포인터터치라는 두 가지 옵션이 있습니다. 인터페이스 사용하는 IMixedRealityPointerHandler 경우 이벤트를 수신 대상 포인터로 설정하고 입력 이벤트를 응답/처리하는 구성 요소 스크립트에서 인터페이스를 사용하는 IMixedRealityTouchHandler 경우 Touch로 설정합니다.

터치 코드 예제

아래 코드에서는 변형 구성 요소를 사용하여 GameObject에 연결하고 터치 입력 이벤트에 응답할 수 있는 NearInteractionTouchable MonoBehaviour를 보여 줍니다.

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) { }
}

근거리 상호 작용 스크립트 예제

터치 이벤트

이 예제에서는 큐브를 만들고, 터치할 수 있게 하고, 터치할 때 색을 변경합니다.

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);
}

이벤트 잡기

아래 예제에서는 GameObject를 끌 수 있도록 하는 방법을 보여 주세요. 게임 개체에 충돌체가 있다고 가정합니다.

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

참고 항목