다음을 통해 공유


손 메뉴 - MRTK3

손 메뉴

손 메뉴를 사용하면 사용자가 자주 사용하는 함수에 대해 손으로 연결된 UI를 가져올 수 있습니다. 일반적으로 빠른 작업을 제공하는 작은 단추 그룹 입니다. 그러나 정보 또는 설정을 표시하기 위한 더 복잡한 레이아웃이 손 메뉴로 사용자에게 제공되는 경우가 많으며, 종종 손에서 메뉴를 "분리"하고 세계에 고정하는 옵션이 있습니다.

손 메뉴에는 다른 개체와 상호 작용하는 동안 잘못된 활성화를 방지하기 위해 '플랫 핸드 필요' 및 '응시 활성화 사용' 옵션이 제공됩니다. 원치 않는 활성화를 방지하려면 이러한 옵션을 사용하는 것이 좋습니다.

장면 및 프리팹 예제

템플릿 프로젝트를 사용하는 경우 스크립트 HandMenuExamples.unity 를 사용하여 손 메뉴에 대한 몇 가지 일반적인 구성을 HandConstraintPalmUp 보여 줍니다.

손 메뉴 예제 장면

HandMenuLarge

이 프리팹은 상호 작용 시간이 연장되어야 하는 크거나 복잡한 UI의 예를 보여 줍니다. 이러한 유형의 UI의 경우 손 놓기 메뉴를 월드 잠금하여 유용성을 개선하고 팔 피로를 피하는 것이 좋습니다. 이 예제에서는 메뉴의 월드 잠금을 위한 '잡기 및 끌어오기'도 지원합니다.

이 예제에서는 OnFirstHandDetected() 이벤트에서 MenuContent 개체를 활성화하여 메뉴가 표시되고 보이지 않게 됩니다. OnLastHandLost() 이벤트를 사용하면 닫기 단추가 활성화되고 배치 애니메이션이 트리거됩니다. 애니메이션은 간단한 크기 조정 변동입니다. OnLastHandLost() 이벤트에서 MenuContent를 숨기지 않았기 때문에 손이 보이지 않을 때 메뉴가 자동으로 월드로 잠깁니다. Palm Up 섹션의 값은 손 놓기를 너무 많이 아래로 끌지 않고 메뉴를 월드 잠금 상태로 만들도록 최적화되었습니다.

손 메뉴 예제 큰 1

Palm Up 구성

이 예제에서는 메뉴의 아래쪽 영역에 있는 잡기 가능한 막대와 자동 월드 잠금 동작을 제공합니다. 사용자는 손에서 메뉴를 명시적으로 분리하고 이를 잡고 월드에 배치할 수 있습니다. 이를 위해 ObjectManipulator의 ManipulationStarted() 이벤트에서 SolverHandler.UpdateSolvers를 사용하지 않도록 설정합니다. 그렇지 않으면 HandConstraint 솔버가 손 위치 근처에 메뉴를 배치하려고 하기 때문에 메뉴를 분리할 수 없습니다. 또한 HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine 을 사용하여 사용자가 손을 들어 메뉴를 손에 다시 연결할 수 있도록 합니다.

손 메뉴 예제 큰 2

마지막으로 닫기 단추는 HandConstraint 솔버의 기능을 복원하기 위해 SolverHandler.UpdateSolvers 를 다시 활성화해야 합니다.

손 메뉴 예제 큰 3

스크립트

HandConstraint 동작은 추적된 개체를 손 제한 콘텐츠(예: 손 UI, 메뉴 등)에 안전한 지역으로 제한하는 솔버를 제공합니다. 안전한 지역은 손과 교차하지 않는 영역으로 간주됩니다. 손바닥이 사용자를 향하고 있을 때 솔버 추적 개체를 활성화하는 일반적인 동작을 보여 주기 위해 HandConstraintPalmUp이라는 HandConstraint의 파생 클래스도 포함됩니다.

추가 설명서는 각 HandConstraint 속성에 사용할 수 있는 도구 설명을 참조하세요. 몇 가지 속성은 아래에 자세히 정의되어 있습니다.

  • 안전 영역: 안전 영역은 콘텐츠를 제한할 위치를 지정합니다. 손과 겹치지 않도록 콘텐츠를 Ulnar 쪽에 배치하고 상호 작용 품질을 개선하는 것이 좋습니다. 안전 영역은 카메라 보기에 평면 직교로 프로젝션된 손의 방향과 손 주위의 경계 상자에 대한 광선 캐스팅에 의해 계산됩니다. 안전 영역은 에서 작동 XRNode하도록 정의됩니다. 각 안전 영역이 서로 다른 컨트롤러 유형에서 무엇을 나타내는지 살펴보는 것이 좋습니다.

  • 카메라를 향할 때까지 손 따르기 이 활성 상태이면 솔버가 카메라를 향할 때 메뉴가 응시에 충분히 맞춰질 때까지 손 회전을 따릅니다. 이 작업을 수행하려면 솔버의 HandConstraintSolver각도가 SolverRotationBehavior 다르므로 GazeAlignment 의 를 에서 LookAtTrackedObjectLookAtMainCamera 로 변경합니다.

손 메뉴 예제 안전 영역

  • 활성화 이벤트: 현재 는 HandConstraint 4개의 활성화 이벤트를 트리거합니다. 이러한 이벤트는 다양한 조합으로 사용하여 고유한 HandConstraint 동작을 만들 수 있습니다.

    • OnHandActivate: 손이 IsHandActive 메서드를 충족할 때 트리거됩니다.
    • OnHandDeactivate: IsHandActive 메서드가 더 이상 충족되지 않을 때 트리거됩니다.
    • OnFirstHandDetected: 손 추적 상태가 보기에 없는 손에서 보기의 첫 번째 손으로 변경될 때 발생합니다.
    • OnLastHandLost: 손 추적 상태가 보기에서 하나 이상의 손에서 보기에 없는 손으로 변경되는 경우에 발생합니다.
  • 해 찾기 활성화/비활성화 논리: 현재는 개체를 사용하지 않도록 설정/활성화하는 HandConstraintPalmUp 대신 의 UpdateSolver 값을 사용하여 SolverHandler논리를 활성화하고 비활성화하는 것이 좋습니다. 연결된 메뉴의 ManipulationHandler "OnManipulationStarted/Ended" 이벤트 후에 트리거되는 편집기 기반 후크를 통해 예제 장면에서 볼 수 있습니다.

    • 손 제약 조건 논리 중지: 핸드 제한 개체를 중지(활성화/비활성화 논리를 실행하지 않음)로 설정하려고 할 때 HandConstraintPalmUp을 사용하지 않도록 설정하는 대신 UpdateSolver를 False로 설정합니다.
      • 응시 기반(또는 응시 기반이 아닌) 다시 연결 논리를 사용하도록 설정하려면 함수를 HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine() 호출합니다. 이렇게 하면 "IsValidController" 조건이 충족되면 계속 검사 코루틴이 트리거되고 UpdateSolver가 True이면(또는 개체가 사용하지 않도록 설정되면) UpdateSolver가 True로 설정됩니다.
    • 손 제약 조건 논리 시작: 손 제한 개체가 활성화 조건을 충족하는지 여부에 따라 손 뒤를 다시 따르도록 설정하려고 할 때 SolverHandler의 UpdateSolver를 true로 설정합니다.
  • 논리 다시 연결: 현재 는 HandConstraintPalmUpUpdateSolver 가 True인지 여부에 SolverHandler관계없이 대상 개체를 추적된 지점에 자동으로 다시 연결할 수 있습니다. 이 작업은 월드 잠금이 적용된 후 의 StartWorldLockReattachCheckCoroutine() 함수를 호출HandConstraintPalmUp하여 수행됩니다(이 경우 SolverHandler의 UpdateSolver를 False로 효과적으로 설정함).