共用方式為


指標 - MRTK2

指標

本文說明如何在實務上設定和響應指標輸入。 若要進一步瞭解如何在高層級控制多個指標,請參閱 指標架構

偵測到新的控制器時,會在運行時間自動實例指標。 多個指標可以附加至控制器。 例如,使用預設指標配置檔時,Windows Mixed Reality 控制器會分別取得一行和一個參數指標,以供一般選取和遙測使用。

指標組態

指標會透過 設定為 MRTK 中輸入系統的一 MixedRealityPointerProfile部分。 這種類型的設定檔會指派給 MixedRealityInputSystemProfile MRTK 組態偵測器中的 。 指標配置檔會決定數據指標、運行時間可用的指標類型,以及這些指標彼此通訊的方式,以決定哪一個指標作用中。

  • 指標範圍 - 定義指標可以與 GameObject 互動的最大距離。

  • 指向光播圖層掩碼 - 這是 LayerMasks 的優先數位,用來判斷任何指定指標可以互動的可能 GameObject,以及嘗試互動的順序。 這可能有助於確保指標會先與其他場景物件之前的UI元素互動。 指標配置檔範例

指標選項組態

預設 MRTK 指標設定檔組態包含下列指標類別和現成的相關聯預製專案。 系統在運行時間可用的指標清單定義在指標設定檔的 [指標選項 ] 底下。 開發人員可以利用此清單來重新設定現有的指標、新增指標或刪除指標。

指標選項設定檔範例

每個指標專案是由下列一組資料所定義:

  • 控制器類型 - 指標有效的控制器集合。

    • 例如, WowePointer 負責使用手指來「戳探」物件,而且預設會標示為僅支援清楚的手部控制器類型。 指標只會在控制器變成可用時具現化,特別是 控制器類型 會定義此指標預製專案可以用來建立哪些控制器。
  • 手部 - 允許指標只針對特定手部具現化, (左/右)

注意事項

將 [指標] 專案的 [手寫 ] 屬性設定為 [無 ] 會有效地從系統停用它,作為從清單中移除該指標的替代方案。

  • 指標預製 專案 - 當符合指定控制器類型和手動的控制器開始追蹤時,將會具現化此預製項目資產。

可以有多個與控制器相關聯的指標。 例如,在 DefaultHoloLens2InputSystemProfile (Assets/MRTK/SDK/Profiles/HoloLens2/) 中,所表達的手部控制器會與 辨識器GrabPointerDefaultControllerPointer 相關聯, (也就是手部光線) 。

注意事項

MRTK 在 Assets/MRTK/SDK/Features/UX/Prefabs/Pointers 中提供一組指標預製專案。 只要在 Assets/MRTK/SDK/Features/UX/Scripts/Pointers 或實作 的任何其他腳 IMixedRealityPointer本中包含其中一個指標腳本,就可以建置新的自定義預製專案。

數據指標組態

註視游標可GazeCursorPrefab透過 編輯器 內 的 MixedRealityInputSystemProfile 屬性直接設定。 若要設定用於其他指標的數據指標,您必須變更對應 BaseControllerPointer欄位中CursorPrefab使用的預製專案。 若要以程式設計方式變更游標,請修改 BaseCursor 對應 IMixedRealityPointer 行為上的屬性。

數據指標預製項目屬性

如需數據指標行為的實作範例,請參閱 Assets/MRTK/SDK/Features/UX/Prefabs/Cursors 中的數據指標預製專案。 特別是, DefaultGazeCursor 提供強固的實作,可根據內容狀態變更游標的圖形。

默認指標類別

下列類別是可用的現成 MRTK 指標,並定義於上述的預設 MRTK 指標設定檔 中。 Assets/MRTK/SDK/Features/UX/Prefabs/Pointers 下提供的每個指標預製專案都包含其中一個附加的指標元件。

MRTK 預設指標

遠距指標

LinePointer

LinePointer 是基底指標類別,會從輸入 (的來源繪製一條線,也就是控制器) 指標方向,並支援此方向的單一光線轉換。 一般而言, 和 遙測指標等 ShellHandRayPointer 子類別會具現化並使用 (這也會繪製線條來指出遙測在) 結束的位置,而不是主要提供常見功能的此類別。

對於 Oculus、Vive 和 Windows Mixed Reality 等動作控制器,旋轉會符合控制器的旋轉。 對於像是 HoloLens 2 手等其他控制器,旋轉會符合系統提供的手部指標姿勢。

MRTK 指標線條
CurvePointer

CurvePointer 藉由允許沿著曲線進行多步驟光線轉換,來擴充 LinePointer 類別。 這個基底指標類別對於弧形實例很有用,例如線條一直彎曲成參數的遙測指標。

ShellHandRayPointer

從延伸LinePointerShellHandRayPointer 實作會作為 MRTK 指標設定檔的預設值。 DefaultControllerPointer 預製項目會ShellHandRayPointer實作 類別。

GGVPointer

也稱為 注視/手勢/語音 (GGV) 指標,GGVPointer 支援 HoloLens 1 樣式的外觀和點選互動,主要是透過注視和空中點選或注視和語音選取互動。 GGV 指標的位置和方向是由頭部的位置和旋轉所驅動。

TouchPointer

TouchPointer 負責使用 Unity Touch 輸入 (也就是觸控螢幕) 。 這些是「遠距互動」,因為觸碰螢幕的動作會將光線從相機投射到場景中可能遠的位置。

MousePointer

MousePointer 為螢幕提供全球光線傳播,以進行遠距互動,但滑鼠而不是觸控。

滑鼠指標

注意事項

默認無法在 MRTK 中使用滑鼠支援,但可藉由將 類型的MouseDeviceManager輸入數據提供者新增至 MRTK 輸入設定檔,並將 指派給MixedRealityMouseInputProfile數據提供者來啟用。

近指標

PokePointer

您可以使用PokePointer與支援「可觸控的近距離互動」的遊戲物件互動。 這是具有附加 NearInteractionTouchable 腳本的 GameObjects。 在 UnityUI 的案例中,此指標會尋找 NearInteractionTouchableUnityUIs。 PokePointer 會使用 SphereCast 來判斷最接近的可觸控元素,並用來為可按下按鈕之類的專案提供電源。

使用元件設定 GameObject NearInteractionTouchable 時,請務必設定 localForward 參數,以指向按鈕前方或其他應設為可觸控的物件。 也請確定可觸控物件的 界限 符合可觸控物件的界限。

實用的偵測指標屬性:

  • TouchableDistance:可觸控介面可互動的最大距離
  • 視覺效果:根據預設,用來將指尖視覺效果轉譯 (指指指上的遊戲物件) 。
  • 線條:從指尖繪製到使用中輸入介面的選擇性線條。
  • 戳點圖層掩碼 - LayerMasks 的優先順序數位,用來判斷指標可以互動的可能 GameObject,以及嘗試的互動順序。 請注意,GameObject 也必須有元件 NearInteractionTouchable ,才能與撲克指標互動。
撲克指標
SpherePointer

SpherePointer 會使用 UnityEngine.Physics.OverlapSphere 來識別最接近NearInteractionGrabbable的對象進行互動,這適用於如 ManipulationHandler的「可抓取」輸入。 PokePointer / NearInteractionTouchable與功能組類似,為了與Sphere指標互動,遊戲對象必須包含腳本元件NearInteractionGrabbable

抓取指標

實用的Sphere指標屬性:

  • 球體轉換半徑:用來查詢可擷取物件之球體的半徑。
  • 近對象邊界:Sphere 轉換半徑頂端的距離,用來查詢是否要偵測物件是否接近指標。 近端物件偵測半徑總計為圓球轉換半徑 + 接近對象邊界
  • 近端物件扇區角度:用於查詢附近物件之指標的正向座標軸周圍角度。 IsNearObject讓查詢函式像是錐形。 根據預設,這會設定為 66 度,以符合 Hololens 2 行為

已修改為僅查詢正向物件的Sphere指標

  • Near 物件平滑因數:近端對象偵測的平滑因數。 如果在 Near Object Radius 中偵測到物件,則查詢的半徑會變成 Near Object Radius * (1 + Near Object Smoothing Factor) 以降低敏感度,並讓物件更難離開偵測範圍。
  • 抓取圖層掩碼 - LayerMasks 的優先數位,用來判斷指標可以互動的可能 GameObject,以及要嘗試的互動順序。 請注意,GameObject 也必須有 NearInteractionGrabbable ,才能與SpherePointer互動。

    注意事項

    在 MRTK 提供的預設 GrabPointer 預製專案中,空間感知層已停用。 這麼做是為了降低執行圓球與空間網格重疊查詢的效能影響。 您可以修改 GrabPointer 預製項目來啟用此功能。

  • 忽略不在FOV中的碰撞器 - 是否要忽略可能接近指標,但實際上不在視覺FOV中的碰撞器。 這可以防止意外抓取,而且當您可能靠近可抓取專案但看不到手部光線時,可以開啟手部光線。 基於效能考慮, Visual FOV 是透過錐形而非一般範圍來定義。 此圓錐形的中心和方向與相機的圓錐形相同,半徑等於半顯示高度 (或垂直 FOV) 。
圓球指標

遙測指標

  • TeleportPointer 會在採取動作時引發遙測要求 (也就是) 按下遙測按鈕以移動使用者。
  • ParabolicTeleportPointer 在採取動作時,將會引發遙測要求 (也就是使用參數線光線) 按下遙測按鈕,以便移動使用者。
指標參數

混合實境平臺的指標支援

下表詳細說明通常用於 MRTK 中常見平臺的指標類型。 注意:您可以將不同的指標類型新增至這些平臺。 例如,您可以將撲克指標或Sphere指標新增至VR。 此外,具有遊戲板的VR裝置可以使用GV指標。

指標 OpenVR Windows Mixed Reality HoloLens 1 HoloLens 2
ShellHandRayPointer 有效 有效 有效
TeleportPointer 有效 有效
GGVPointer 有效
SpherePointer 有效
PokePointer 有效

透過程式代碼的指標互動

指標事件介面

實作下列一或多個介面並指派給具有 的 GameObject Collider 的 MonoBehaviours,將會收到相關聯介面所定義的指標互動事件。

事件 描述 處理器
變更焦點之前/ 變更焦點 在遊戲物件失去焦點和每次指標變更焦點時取得焦點時引發。 IMixedRealityFocusChangedHandler
焦點輸入/結束 當第一個指標進入遊戲物件時,以及最後一個指標離開焦點時,在失去焦點的對象上引發。 IMixedRealityFocusHandler
向下/拖曳/向上/按下指標 引發以報表指標按下、拖曳和放開。 IMixedRealityPointerHandler
觸控已啟動/ 已更新 / 已完成 由觸控感知指標引發,例如 PokePointer 報告觸控活動。 IMixedRealityTouchHandler

注意事項

IMixedRealityFocusChangedHandlerIMixedRealityFocusHandler 應該在引發它們的對象中處理。 您可以全域接收焦點事件,但與其他輸入事件不同,全域事件處理程式不會根據焦點來封鎖接收事件 (全域處理程式和焦點) 中的對應物件都會接收事件。

指令中的指標輸入事件

MRTK 輸入系統會以與一般輸入事件類似的方式來辨識和處理指標 輸入事件。 差別在於指標輸入事件只會由引發輸入事件的指標,以及任何全域輸入處理程式來處理焦點中的 GameObject。 一般輸入事件是由所有作用中指標的焦點 GameObject 所處理。

  1. MRTK 輸入系統會辨識已發生的輸入事件
  2. MRTK 輸入系統會將輸入事件的相關介面函式引發至所有已註冊的全域輸入處理程式
  3. 輸入系統會決定引發事件之指標的焦點是哪個 GameObject
    1. 輸入系統會利用 Unity 的事件系統 來引發焦點 GameObject 上所有相符元件的相關介面函式
    2. 如果輸入事件在任何時間點標 示為已使用,進程將會結束,而且不會再有 GameObjects 收到回呼。
      • 範例:將會搜尋實作 介面 IMixedRealityFocusHandler 的元件,以尋找 GameObject 取得或失去焦點
      • 注意:如果目前 GameObject 上找不到符合所需介面的元件,Unity 事件系統就會反升以搜尋父代 GameObject。
  4. 如果未註冊全域輸入處理程式,且找不到具有相符元件/介面的 GameObject,則輸入系統會呼叫每個已註冊後援的輸入處理程式

範例

以下是在指標取得或離開焦點或指標選取物件時,變更附加轉譯器色彩的範例腳本。

public class ColorTap : MonoBehaviour, IMixedRealityFocusHandler, IMixedRealityPointerHandler
{
    private Color color_IdleState = Color.cyan;
    private Color color_OnHover = Color.white;
    private Color color_OnSelect = Color.blue;
    private Material material;

    private void Awake()
    {
        material = GetComponent<Renderer>().material;
    }

    void IMixedRealityFocusHandler.OnFocusEnter(FocusEventData eventData)
    {
        material.color = color_OnHover;
    }

    void IMixedRealityFocusHandler.OnFocusExit(FocusEventData eventData)
    {
        material.color = color_IdleState;
    }

    void IMixedRealityPointerHandler.OnPointerDown(
         MixedRealityPointerEventData eventData) { }

    void IMixedRealityPointerHandler.OnPointerDragged(
         MixedRealityPointerEventData eventData) { }

    void IMixedRealityPointerHandler.OnPointerClicked(MixedRealityPointerEventData eventData)
    {
        material.color = color_OnSelect;
    }
}

查詢指標

您可以透過迴圈查看可用的輸入來源, (即可用的控制器和輸入) 來探索連結至它們的指標,來收集目前使用中的所有指標。

var pointers = new HashSet<IMixedRealityPointer>();

// Find all valid pointers
foreach (var inputSource in CoreServices.InputSystem.DetectedInputSources)
{
    foreach (var pointer in inputSource.Pointers)
    {
        if (pointer.IsInteractionEnabled && !pointers.Contains(pointer))
        {
            pointers.Add(pointer);
        }
    }
}

主要指標

開發人員可以訂閱 FocusProviders PrimaryPointerChanged 事件,以在焦點中的主要指標變更時收到通知。 這非常適合用來識別使用者目前是否正透過注視、手部光線或其他輸入來源與場景互動。

private void OnEnable()
{
    var focusProvider = CoreServices.InputSystem?.FocusProvider;
    focusProvider?.SubscribeToPrimaryPointerChanged(OnPrimaryPointerChanged, true);
}

private void OnPrimaryPointerChanged(IMixedRealityPointer oldPointer, IMixedRealityPointer newPointer)
{
    ...
}

private void OnDisable()
{
    var focusProvider = CoreServices.InputSystem?.FocusProvider;
    focusProvider?.UnsubscribeFromPrimaryPointerChanged(OnPrimaryPointerChanged);

    // This flushes out the current primary pointer
    OnPrimaryPointerChanged(null, null);
}

PrimaryPointerExample (Assets/MRTK/Examples/Demos/Input/Scene/PrimaryPointer) 場景會示範如何使用 PrimaryPointerChangedHandler 事件的 來回應新的主要指標。

主要指標範例

指標結果

指標 Result 屬性包含場景查詢的目前結果,用來判斷具有焦點的物件。 對於光線投射指標,如同預設為運動控制器建立的指標、注視輸入和手部光線,它會包含光播點擊的位置和正常狀況。

private void IMixedRealityPointerHandler.OnPointerClicked(MixedRealityPointerEventData eventData)
{
    var result = eventData.Pointer.Result;
    var spawnPosition = result.Details.Point;
    var spawnRotation = Quaternion.LookRotation(result.Details.Normal);
    Instantiate(MyPrefab, spawnPosition, spawnRotation);
}

場景 PointerResultExample (Assets/MRTK/Examples/Demos/Input/Scene/PointerResult/PointerResultExample.unity) 示範如何使用指標 Result 在點擊位置繁衍物件。

指標結果

停用指標

例如,若要啟用和停用指標 (,若要停用手部光線) ,請透過 PointerUtils設定PointerBehavior指定指標類型的 。

// Disable the hand rays
PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOff);

// Disable hand rays for the right hand only
PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOff, Handedness.Right);

// Disable the gaze pointer
PointerUtils.SetGazePointerBehavior(PointerBehavior.AlwaysOff);

// Set the behavior to match HoloLens 1
// Note, if on HoloLens 2, you must configure your pointer profile to make the GGV pointer show up for articulated hands.
public void SetHoloLens1()
{
    PointerUtils.SetPokePointerBehavior(PointerBehavior.AlwaysOff, Handedness.Any);
    PointerUtils.SetGrabPointerBehavior(PointerBehavior.AlwaysOff, Handedness.Any);
    PointerUtils.SetRayPointerBehavior(PointerBehavior.AlwaysOff, Handedness.Any);
    PointerUtils.SetGGVBehavior(PointerBehavior.Default);
}

如需更多範例,請參閱 PointerUtilsTurnPointersOnOff

透過編輯器的指標互動

針對 所處理的 IMixedRealityPointerHandler指標事件,MRTK 提供元件形式的 PointerHandler 進一步便利性,可讓指標事件直接透過 Unity 事件處理。

指標處理程式

指標範圍

遠距指標的設定會限制光播和與場景中其他物件互動的程度。 根據預設,此值會設定為10公尺。 此值已選擇與 HoloLens 殼層的行為保持一致。

您可以藉由更新 DefaultControllerPointer 預製元件的 ShellHandRayPointer 欄位來變更:

指標範圍 - 這會控制指標將與其互動的最大距離。

默認指標範圍 - 這會控制指標未與任何項目互動時,所呈現的指標光線/線條長度。

另請參閱