界限控制項 - MRTK2

界限控制項

BoundsControl 是操作行為的新元件,先前在 BoundingBox中找到。 界限控制項會在設定中進行一些改善和簡化,並新增新功能。 此元件是周框方塊的取代專案,即將淘汰。

腳本 BoundsControl.cs 提供在混合實境中轉換物件的基本功能。 周框控制項會顯示全像投影周圍的方塊,以指出它可以與其互動。 方塊角落和邊緣上的控點允許縮放、旋轉或轉譯物件。 界限控制項也會回應使用者輸入。 例如,在HoloLens 2上,界限控制項會回應手指鄰近性,提供視覺回饋來協助察覺物件的距離。 所有互動和視覺效果都可以輕鬆地自訂。

範例場景

您可以在場景中找到界限控制群組態的 BoundsControlExamples 範例。

界限控制項範例

Inspector 屬性

目標物件

此屬性會指定界限控制項操作將轉換的物件。 如果未設定物件,則會預設為擁有者物件。

啟用行為

有數個選項可啟動界限控制項介面。

  • 啟動時啟動:一旦啟動場景,系結控制項就會變成可見。
  • 依鄰近性啟動:當已表達的手接近物件時,周框控制項就會變成可見。
  • 啟用 By Pointer:當系結控制項是以手部光線指標為目標時,就會變成可見的。
  • 依鄰近性和指標啟動:當系結控制項是以手部指標或已表達的手部接近物件為目標時,就會變成可見的。
  • 手動啟用:系結控制項不會自動顯示。 您可以透過腳本手動啟用它,方法是存取 boundsControl.Active 屬性。

界限覆寫

設定物件中的方塊碰撞器以進行界限計算。

方塊邊框間距

將填補加入至用來計算控制項範圍的碰撞器界限。 這不僅會影響互動,也會影響視覺效果。

壓平軸

指出控制項是否在其中一個軸中壓平,使其成為 2 維,並不允許沿著該軸操作。 此功能可用於精簡物件,例如 slate。 如果壓平軸設定為壓平 自動 ,腳本會自動挑選最小範圍為壓平軸的座標軸。

平滑處理

平滑區段可讓您設定控制項縮放和旋轉的平滑行為。

視覺效果

您可以修改其中一個對應的視覺效果組態,來設定界限控制項的外觀。 視覺組態是連結或內嵌可編寫腳本的物件,並在 組態物件一節中更詳細地描述。

組態物件

控制項隨附一組可儲存為可編寫腳本的物件,並在不同實例或預製專案之間共用的組態物件。 設定可以共用並連結為個別可編寫腳本的資產檔案,或預製專案內的巢狀可編寫腳本資產。 進一步的組態也可以直接在實例上定義,而不連結至外部或巢狀可編寫腳本的資產。

界限控制項偵測器會藉由在屬性偵測器中顯示訊息,指出設定是共用或內嵌為目前實例的一部分。 此外,共用實例將無法直接在界限控制項屬性視窗本身進行編輯,而是必須直接修改其連結的資產,以避免共用組態發生意外變更。

目前界限控制項提供下列功能的組態物件選項:

Box 組態

方塊組態負責轉譯實心方塊,其中包含透過碰撞器大小和方塊邊框間距定義的界限。 您可以設定下列屬性:

  • Box 材質:定義在未進行互動時套用至轉譯方塊的材質。 只有在設定此材質時,才會轉譯方塊。
  • Box 擷取材質:當使用者透過近近或遠的互動來與控制項互動時,方塊的材質。
  • 壓平軸顯示縮放比例:如果其中一個座標軸壓平,則會套用至方塊顯示的刻度。

調整控制碼設定

這個屬性選單允許修改界限控制項尺規的行為和視覺效果。

  • 控點材質:套用至控點的材質。
  • 控點抓取材質:套用至抓取控點的材質。
  • 處理預製專案:調整控制碼的選擇性預製專案。 如果未設定 MRTK,則會使用 Cube 做為預設值。
  • 控制碼大小:縮放控制碼的大小。
  • 碰撞器填補:要新增至控制碼碰撞器的填補。
  • 操作時繪製 tether:當使用中時,會從互動點到目前的手部或指標位置繪製多條線。
  • 控制碼忽略碰撞器:如果在這裡連結碰撞器,控制碼將會忽略與此碰撞器的任何衝突。
  • 控制碼平板預製物件:當控制項壓平時,要用於控制碼的預製專案。
  • 顯示縮放控點:控制控制碼的可見度。
  • 調整行為:可以設定為統一或非統一調整。

旋轉控點設定

此組態會定義旋轉控制碼行為。

  • 控點材質:套用至控點的材質。
  • 控點抓取材質:套用至抓取控點的材質。
  • 控制碼預製專案:控制碼的選擇性預製專案。 如果未設定 MRTK,則會使用球體作為預設值。
  • 控制碼大小:控制碼的大小。
  • 碰撞器填補:要新增至控制碼碰撞器的填補。
  • 操作時繪製 tether:當使用中時,會從互動點到目前的手部或指標位置繪製多條線。
  • 控制碼忽略碰撞器:如果在這裡連結碰撞器,控制碼將會忽略與此碰撞器的任何衝突。
  • 控制碼預製項碰撞器類型:要與所建立控制碼搭配使用的碰撞器類型。
  • 顯示 X 的控制碼:控制 X 軸控點的可見度。
  • 顯示 Y 的控制碼:控制 Y 軸控點的可見度。
  • 顯示 Z 的控制碼:控制 Z 軸控點的可見度。

翻譯控制碼設定

允許啟用及設定界限控制項的翻譯控點。 請注意,預設會停用翻譯控制碼。

  • 控點材質:套用至控點的材質。
  • 控點抓取材質:套用至抓取控點的材質。
  • 控制碼預製專案:控制碼的選擇性預製專案。 如果未設定 MRTK,則會使用球體作為預設值。
  • 控制碼大小:控制碼的大小。
  • 碰撞器填補:要新增至控制碼碰撞器的填補。
  • 操作時繪製 tether:使用中時,會從互動點到目前的手部或指標位置繪製條形線。
  • 控制碼會忽略碰撞器:如果在此連結碰撞器,控制碼將會忽略與此碰撞器的任何衝突。
  • 處理預製專案碰撞器類型:要與所建立控制碼搭配使用的碰撞器類型。
  • 顯示 X 的控制碼:控制 X 軸控點的可見度。
  • 顯示 Y 的控制碼:控制 Y 軸控點的可見度。
  • 顯示 Z 的控制碼:控制 Z 軸控點的可見度。

連結組態會啟用界限控制項的線框功能。 您可以設定下列屬性:

  • 線框材質:套用至線框網格的材質。
  • 線框邊緣半徑:線框的粗細。
  • 線框圖形:線框的圖形可以透過三次方或圓錐形。
  • 顯示線框:控制線框的可見度。

鄰近效果設定

根據手部的距離顯示和隱藏具有動畫的控點。 它有雙步驟縮放動畫。 預設值會設定為HoloLens 2樣式行為。

界限控制項鄰近性
  • 鄰近效果作用中:啟用以鄰近為基礎的控制碼啟用
  • 物件中近接:第 1 個步驟縮放的距離
  • 物件近近:第 2 個步驟縮放的距離
  • 遠距刻度:當手部超出界限的範圍時,控制碼資產的預設縮放值 (由「處理中近接」所定義的上方距離。使用 0 預設隱藏控制碼)
  • 中小數位數:當手部位於界限控制項互動的範圍內時,控點資產的縮放值 (由 「控制碼近接鄰近性」所定義的上方距離。使用 1 顯示一般大小)
  • 關閉小數位數:當手部位於上方所定義的抓取互動範圍內時,控點資產的縮放值 (由「處理鄰近性」所定義的距離。使用 1.x 顯示較大的大小)
  • 遠距成長率:當手從中移至遠近距離時,會調整鄰近縮放物件的比例。
  • 中成長率:當手從中移至接近鄰近性時,縮放比例的鄰近性物件會縮放比例。
  • 關閉成長率:當手部從靠近物件中心移動時,將鄰近縮放物件縮放比例評分。

條件約束系統

界限控制項支援使用 條件約束管理員 來限制或修改使用界限控制項控制碼時的轉譯、旋轉或調整行為。

屬性偵測器會在下拉式清單中顯示附加至相同遊戲物件的所有可用條件約束管理員,並提供捲動並醒目提示選取的條件約束管理員的選項。

界限控制列件約束

事件

界限控制項提供下列事件。 此範例會使用這些事件來播放音訊意見反應。

  • 輪替已啟動:旋轉開始時引發。
  • 旋轉停止:旋轉停止時引發。
  • Scale Started:調整開始時引發。
  • 已停止調整:調整停止時引發。
  • 翻譯已啟動:在翻譯開始時引發。
  • 翻譯已停止:翻譯停止時引發。
界限控制項事件

彈性 (實驗性)

透過界限控制項操作物件時,可以使用彈性。 請注意, 彈性系統 仍在實驗性狀態。 若要啟用彈性,請連結現有的彈性管理員元件,或透過 Add Elastics Manager 按鈕建立並連結新的彈性管理員。

界限控制項彈性

處理樣式

根據預設,當您只指派腳本時 BoundsControl.cs ,它會顯示 HoloLens 第 1 代樣式的控制碼。 若要使用HoloLens 2樣式控點,您必須指派適當的控制碼預製專案和材質。

界限控制項控點樣式 2

以下是HoloLens 2樣式界限控制項控點的預製專案、材質和縮放值。 您可以在場景中找到此範例 BoundsControlExamples

界限控制項 HandleStyles

處理HoloLens 2樣式) (設定

  • 控制碼材質:BoundingBoxHandleWhite.mat
  • 控點抓取材質:BoundingBoxHandleBlueGrabbed.mat
  • 調整控制碼預製專案:MRTK_BoundingBox_ScaleHandle.prefab
  • 調整控制碼 Slate 預製物件:MRTK_BoundingBox_ScaleHandle_Slate.prefab
  • 調整控制碼大小:0.016 (1.6cm)
  • 縮放控制碼碰撞器填補:0.016 (讓抓取碰撞器稍微大於控制碼視覺效果)
  • 旋轉控制碼預製物件:MRTK_BoundingBox_RotateHandle.prefab
  • 旋轉控點大小:0.016
  • 旋轉控制碼碰撞器填補:0.016 (讓可抓取碰撞器稍微大於控制碼視覺效果)

使用物件操作工具轉換變更

界限控制項可以與 搭配 ObjectManipulator.cs 使用,以允許特定類型的操作 (例如,在不使用控制碼的情況下移動物件) 。 操作處理常式同時支援一個和雙手互動。 手部追蹤 可用來與物件互動。

界限控制項物件操作工具

為了讓界限控制邊緣在使用 遠距互動移動時 ObjectManipulator 的行為相同,建議分別連接其On Manipulation Started / On Manipulation 已結束BoundsControl.HighlightWires / BoundsControl.UnhighlightWires 的事件,如上述螢幕擷取畫面所示。

如何使用 Unity Inspector 新增和設定界限控制項

  1. 將 Box Collider 新增至物件
  2. 將腳本指派 BoundsControl 給物件
  3. 設定選項,例如「啟用」方法 (請參閱下方的 偵測器屬性 一節)
  4. (選擇性) 指派HoloLens 2樣式界限控制項的預製專案和材質 (請參閱下方)

注意

使用偵測器中的 [目標物件系結覆寫 ] 欄位,以指派具有多個子元件之 物件中的特定物件和碰撞器。

界限控制項

如何在程式碼中新增和設定界限控制項

  1. 具現化 Cube GameObject

    GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
    
  2. 使用 AddComponent <> () 將腳本指派 BoundsControl 給具有碰撞器的物件

    private BoundsControl boundsControl;
    boundsControl = cube.AddComponent<BoundsControl>();
    
  3. 直接在控制項上或透過其中一個可編寫腳本的組態來設定選項, (請參閱下方的偵測器屬性和組態一節)

    // Change activation method
    boundsControl.BoundsControlActivation = BoundsControlActivationType.ActivateByProximityAndPointer;
    // Make the scale handles large
    boundsControl.ScaleHandlesConfig.HandleSize = 0.1f;
    // Hide rotation handles for x axis
    boundsControl.RotationHandlesConfig.ShowRotationHandleForX = false;
    
  4. (選擇性) 指派HoloLens 2樣式界限控制項的預製專案和材質。 這仍然需要透過偵測器指派,因為應該動態載入材質和預製專案。

注意

不建議使用 Unity 的 「資源」資料夾或 Shader.Find 來動態載入著色器,因為執行時間可能會遺漏著色器排列。

BoxDisplayConfiguration boxConfiguration = boundsControl.BoxDisplayConfig;
boxConfiguration.BoxMaterial = [Assign BoundingBox.mat]
boxConfiguration.BoxGrabbedMaterial = [Assign BoundingBoxGrabbed.mat]
ScaleHandlesConfiguration scaleHandleConfiguration = boundsControl.ScaleHandlesConfig;
scaleHandleConfiguration.HandleMaterial = [Assign BoundingBoxHandleWhite.mat]
scaleHandleConfiguration.HandleGrabbedMaterial = [Assign BoundingBoxHandleBlueGrabbed.mat]
scaleHandleConfiguration.HandlePrefab = [Assign MRTK_BoundingBox_ScaleHandle.prefab]
scaleHandleConfiguration.HandleSlatePrefab = [Assign MRTK_BoundingBox_ScaleHandle_Slate.prefab]
scaleHandleConfiguration.HandleSize = 0.016f;
scaleHandleConfiguration.ColliderPadding = 0.016f;
RotationHandlesConfiguration rotationHandleConfiguration = boundsControl.RotationHandlesConfig;
rotationHandleConfiguration.HandleMaterial = [Assign BoundingBoxHandleWhite.mat]
rotationHandleConfiguration.HandleGrabbedMaterial = [Assign BoundingBoxHandleBlueGrabbed.mat]
rotationHandleConfiguration.HandlePrefab = [Assign MRTK_BoundingBox_RotateHandle.prefab]
rotationHandleConfiguration.HandleSize = 0.016f;
rotationHandleConfiguration.ColliderPadding = 0.016f;

範例:使用 MinMaxScaleConstraint 設定最小、最大界限控制項小數位數

若要設定最小和最大小數位數,請將 附加 MinMaxScaleConstraint 至控制項。 當界限控制項自動附加並啟用條件約束管理員時,MinMaxScaleConstraint 會在附加並設定後自動套用至轉換變更。

您也可以使用 MinMaxScaleConstraint 來設定 的 ObjectManipulator 最小和最大小數位數。

GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
bcontrol = cube.AddComponent<BoundsControl>();
// Important: BoundsControl creates a constraint manager on start if one does not exist.
// There's no need to manually attach a constraint manager.
MinMaxScaleConstraint scaleConstraint = bcontrol.gameObject.AddComponent<MinMaxScaleConstraint>();
scaleConstraint.ScaleMinimum = 1f;
scaleConstraint.ScaleMaximum = 2f;

範例:在遊戲物件周圍新增界限控制項

若要在 物件周圍新增界限控制項,只要將元件新增 BoundsControl 至物件即可:

private void PutABoundsControlAroundIt(GameObject target)
{
   target.AddComponent<BoundsControl>();
}

從周框方塊移轉

使用 周框方 塊的現有預製專案和實例可以透過屬於 MRTK 工具套件的 移轉視窗 升級至新的界限控制項。

若要升級周框方塊的個別實例,元件的屬性偵測器內也有移轉選項。

界限控制項 Migrate

另請參閱