가까운 상호 작용은 터치와 잡기의 형태로 온다. 터치 및 잡기 이벤트는 각각 PokePointer 및 SpherePointer에 의해 포인터 이벤트로 발생합니다.
특정 GameObject에서 터치 및/또는 입력 이벤트를 수신 대기하려면 세 가지 주요 단계가 필요합니다.
- 관련 포인터가 기본 MRTK 구성 프로필에 등록되어 있는지 확인합니다.
- 원하는 GameObject에 적절한 잡기 또는 터치 스크립트 구성 요소 및
Unity Collider가 있는지 확인합니다. - 원하는 GameObject에 연결된 스크립트에서 입력 처리기 인터페이스를 구현하여 잡기 또는 터치 이벤트를 수신 대기합니다.
잡기 상호 작용 추가
MRTK 포인터 프로필에 SpherePointer가 등록되어 있는지 확인합니다.
기본 MRTK 프로필 및 기본 HoloLens 2 프로필에는 이미 SpherePointer가 포함되어 있습니다. MRTK 구성 프로필을 선택하고 입력>포인터>포인터 옵션으로 이동하여 SpherePointer가 생성될지 확인할 수 있습니다. 기본
GrabPointer프리팹(Assets/MRTK/SDK/Features/UX/Prefabs/Pointers)은 컨트롤러 유형의굴절식 손과 함께 나열되어야 합니다. 사용자 지정 프리팹은 클래스를 구현하는 한 활용할 수 있습니다SpherePointer.
기본 잡기 포인터는 기본 HoloLens 2 인터페이스와 일치하도록 잡기 지점 주변의 원뿔에 있는 주변 개체에 대해 쿼리합니다.
잡을 수 있어야 하는 GameObject에서 , 충돌기를 추가
NearInteractionGrabbable합니다.GameObject의 레이어가 잡기 가능한 레이어에 있는지 확인합니다. 기본적으로 공간 인식 및 레이캐스트 무시 를 제외한 모든 계층은 잡을 수 있습니다. GrabPointer 프리팹에서 그랩 레이어 마스크를 검사하여 어떤 레이어를 잡을 수 있는지 확인합니다.
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 요소 모두에 대해 PokePointer가 MRTK 포인터 프로필에 등록되어 있는지 확인합니다.
기본 MRTK 프로필 및 기본 HoloLens 2 프로필에는 이미 PokePointer가 포함되어 있습니다. MRTK 구성 프로필을 선택하고 입력>포인터> 옵션으로 이동하여 PokePointer가 생성될지 확인할 수있습니다. 기본값 PokePointer (Assets/MRTK/SDK/Features/UX/Prefabs/Pointers) 프리팹은 컨트롤러 유형의관절식 손으로 나열되어야 합니다. 사용자 지정 프리팹은 클래스를 구현하는 한 활용할 수 있습니다 PokePointer .
3D GameObjects
3D 개체에 단일 터치 가능 평면만 있어야 하는지 또는 전체 충돌체를 기반으로 터치할 수 있어야 하는지에 따라 3D GameObjects에 터치 상호 작용을 추가하는 두 가지 방법이 있습니다. 첫 번째 방법은 일반적으로 BoxColliders가 있는 개체에 있으며, 여기서는 충돌기의 단일 얼굴만 터치 이벤트에 반응하도록 합니다. 다른 하나는 충돌기를 기반으로 모든 방향에서 터치할 수 있어야 하는 개체에 대한 것입니다.
단일 얼굴 터치
이는 한 얼굴만 만져야 하는 상황을 가능하게 하는 데 유용합니다. 이 옵션은 게임 개체에 BoxCollider가 있다고 가정합니다. 이 속성을 BoxCollider가 아닌 개체와 함께 사용할 수 있습니다. 이 경우 'Bounds' 및 'Local Center' 속성은 터치 가능한 평면을 구성하도록 수동으로 설정됩니다(예: 경계를 0이 아닌 값으로 설정해야 합니다).
터치 가능해야 하는 GameObject에서 BoxCollider 및
NearInteractionTouchable구성 요소를 추가합니다.아래 구성 요소 스크립트에서 인터페이스를
IMixedRealityTouchHandler사용하는 경우 이벤트를 Receive to Touch로 설정합니다.경계 수정 및 센터 수정을 클릭합니다.
해당 개체 또는 상위 항목 중 하나에서 를 구현하는 스크립트 구성 요소를 추가합니다.
IMixedRealityTouchHandler인터페이스. 가 있는NearInteractionTouchable개체의 상위 항목도 포인터 이벤트를 받을 수 있습니다.
참고
NearInteractionTouchable GameObject가 선택된 편집기 장면 보기에서 흰색 윤곽선 사각형과 화살표를 확인합니다. 화살표는 터치 가능 개체의 "전면"을 가리킵니다. 충돌 가능한 은 해당 방향에서만 터치할 수 있습니다. 모든 방향에서 충돌기를 터치할 수 있도록 하려면 임의 충돌기 터치 섹션을 참조하세요.
임의 충돌기 터치
이는 전체 충돌체 얼굴을 따라 게임 개체를 터치할 수 있어야 하는 상황을 사용하도록 설정하는 데 유용합니다. 예를 들어 전체 충돌체를 터치할 수 있어야 하는 SphereCollider를 사용하는 개체에 대한 터치 조작을 사용하도록 설정하는 데 사용할 수 있습니다.
터치 가능해야 하는 GameObject에서 충돌기와
NearInteractionTouchableVolume구성 요소를 추가합니다.- 아래 구성 요소 스크립트에서 인터페이스를
IMixedRealityTouchHandler사용하는 경우 이벤트를 Receive to Touch로 설정합니다.
- 아래 구성 요소 스크립트에서 인터페이스를
해당 개체 또는 상위 항목 중 하나에서 를 구현하는 스크립트 구성 요소를 추가합니다.
IMixedRealityTouchHandler인터페이스. 가 있는NearInteractionTouchable개체의 상위 항목도 포인터 이벤트를 받을 수 있습니다.
Unity UI
장면에 UnityUI 캔버스 가 있는지 추가/확인합니다.
터치 가능해야 하는 GameObject에서
NearInteractionTouchableUnityUI구성 요소를 추가합니다.- 아래 구성 요소 스크립트에서 인터페이스를
IMixedRealityTouchHandler사용하는 경우 이벤트를 Receive to Touch로 설정합니다.
- 아래 구성 요소 스크립트에서 인터페이스를
해당 개체 또는 상위 항목 중 하나에서 인터페이스를 구현하는 스크립트 구성 요소를 추가합니다
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
NearInteractionGrabbableNearInteractionTouchableNearInteractionTouchableUnityUINearInteractionTouchableVolumeIMixedRealityTouchHandlerIMixedRealityPointerHandler