手部功能表 — MRTK3

Hand Menu

手部功能表可讓使用者顯示常用函式的手動附加 UI。 這些通常是提供快速動作的小型 按鈕群組 。 不過,有時候顯示資訊或設定的較複雜版面配置會以手部功能表的形式提供給使用者,通常可以選擇「卸載」手部功能表,並將其錨定在世界中。

[手部] 功能表提供 [需要一般手部] 和 [使用注視啟用] 選項,以防止與其他物件互動時發生誤啟用。 建議您使用這些選項來防止不必要的啟用。

範例場景和預製專案

注意

手部功能表預製專案目前是使用非畫布控制項所建置。 它們很快就會使用 Canvas 元件 和自動設定系統重建,如 按鈕群組 檔中所述。

如果您使用範本專案, HandMenuExamples.unity 請示範手部功能表的數個常見設定,全都 HandConstraintPalmUp 使用腳本。

Hand Menu Example Scene

HandMenu1x4 和 HandMenu2x4

OnFirstHandDetected () OnLastHandLost () 事件上啟動和停用 MenuContent 物件,功能表就會變成可見且不可見。 對於具有小型 UI 的功能表,建議使用此行為,這需要短暫的互動時間。

Hand Menu Example 2x4

HandMenuLarge

這個預製專案示範需要擴充互動時間的大型或複雜 UI 範例。 針對這種類型的 UI,建議您將功能表世界鎖定在手邊上,以改善可用性,並避免手部疲勞。 此範例也支援「抓取並提取」來將功能表世界鎖定。

在此範例中,功能表會在 OnFirstHandDetected () 事件上啟動 MenuContent 物件,讓功能表變成可見且不可見。 使用 OnLastHandLost () 事件時,會啟動關閉按鈕,並觸發放置動畫。 動畫是簡單的縮放波動。 因為我們未在 OnLastHandLost () 事件上隱藏 MenuContent,因此當手部看不到時,會自動鎖定功能表。 [手部向上] 區段中的值已經過優化,讓功能表世界鎖定,而不會拖曳太多手邊的下拉。

Hand Menu Example Large 1

Palm Up configuration

本範例提供功能表底部區域的可抓取列,以及自動世界鎖定行為。 使用者可以藉由擷取此專案,明確地將功能表從手部中斷連結,並將其放在世界中。 若要達成此目的,請在 ObjectManipulator 中的 ManipulationStarted () 事件上,停用 SolverHandler.UpdateSolvers。 否則,功能表將無法中斷連結,因為 HandConstraint 規劃求解會嘗試將功能表放置在手部位置附近。 我們也使用 HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine ,讓使用者能夠將手部重新附加至手部。

Hand Menu Example Large 2

最後,關閉按鈕必須重新啟用 SolverHandler.UpdateSolvers 以還原 HandConstraint 規劃求解的功能。

Hand Menu Example Large 3

指令碼

HandConstraint 行為提供一個規劃求解,可將追蹤的物件限制為安全區域,以便讓手部限制的內容 (,例如手部 UI、功能表等) 保管庫區域會被視為與手部沒有交集的區域。 也包含 名為 HandConstraintPalmUpHandConstraint 衍生類別,以示範在手部面向使用者時啟用規劃求解追蹤物件的常見行為。

如需其他檔,請參閱每個 HandConstraint 屬性可用的工具提示。 以下會更詳細地定義一些屬性。

  • 保管庫區域:安全區域會指定要限制內容的手邊位置。 建議您將內容放在 Ulnar 端,以避免與手部重迭並改善互動品質。 保管庫區域是由手部方向投射到平面正交到相機的檢視,並針對手部周圍的周框方塊進行光線廣播來計算。 保管庫區域定義為使用 XRNode 。 建議探索每個安全區域在不同控制器類型上代表的內容。

  • 遵循手部直到面向相機使用此作用中時,規劃求解會遵循手部旋轉,直到功能表在面對相機時與注視完全對齊為止。 若要讓這項工作能夠運作,請將 中的 變更 SolverRotationBehavior 為 , LookAtTrackedObjectLookAtMainCamera 因為 GazeAlignment 求解器的角度會 HandConstraintSolver 有所不同。

Hand Menu Example Safe Zone

  • 啟用事件:目前會觸發四個 HandConstraint 啟用事件。 這些事件可用於許多不同的組合,以建立唯一 HandConstraint 的行為。

    • OnHandActivate:當手滿足 IsHandActive 方法時觸發。
    • OnHandDeactivate:不再滿足 IsHandActive方法時觸發。
    • OnFirstHandDetected:當手部追蹤狀態從無手部檢視變更為檢視的第一手時發生。
    • OnLastHandLost:當手部追蹤狀態從至少一個手檢視變更為無手部檢視時發生。
  • 規劃求解啟用/停用邏輯:目前啟用和停用 HandConstraintPalmUp 邏輯的建議是使用 SolverHandler 的值 UpdateSolver ,而不是停用/啟用物件。 這可以在範例場景中透過附加功能表的 ManipulationHandler 「OnManipulationStarted/Ended」 事件之後觸發的編輯器式勾點來查看。

    • 停止手部條件約束邏輯:嘗試將手部限制物件設定為停止 (且未執行啟用/停用邏輯) 時,請將 UpdateSolver 設定為 False,而不是停用 HandConstraintPalmUp。
      • 如果您想要啟用注視型 (,或甚至是以非注視為基礎的) 重新附加邏輯,接著接著呼叫 函 HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine() 式。 這會觸發協同程式,以繼續檢查 「 IsValidController 」 準則是否符合,並將 UpdateSolver 設定為 True,一旦 (或物件已停用) 。
    • 啟動手邊條件約束邏輯:嘗試設定手部限制物件開始再次遵循您的手部, (根據它是否符合啟用準則) ,將 SolverHandler 的 UpdateSolver 設定為 true。
  • 重新附加邏輯:目前, HandConstraintPalmUp 可以自動將目標物件重新附加至追蹤點,無論 的 UpdateSolver 是否 SolverHandler 為 True。 這是藉由在已鎖定世界 (之後呼叫 HandConstraintPalmUpStartWorldLockReattachCheckCoroutine() 函式來完成,在此情況下,會有效地將 SolverHandler 的 UpdateSolver 設定為 False) 。