界限控制項 — MRTK2

Bounds control

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

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

範例場景

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

Bounds control Example

Inspector 屬性

目標物件

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

啟用行為

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

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

界限覆寫

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

方塊邊框間距

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

扁平化座標軸

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

平滑處理

平滑區段允許設定控制項縮放和旋轉的平滑行為。

視覺效果

您可以藉由修改其中一個對應的視覺效果組態來設定界限控制項的外觀。 視覺組態是連結或內嵌的可編寫腳本的物件,而且會在 組態物件一節中詳細說明。

組態物件

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

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

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

Box 組態

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

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

調整控制碼組態

這個屬性隱藏式選單允許修改界限控制項小數位數控點的行為和視覺效果。

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

旋轉控點設定

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

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

翻譯控制碼組態

允許啟用和設定界限控制項的轉譯控制碼。 請注意,每個預設會停用翻譯控制碼。

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

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

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

鄰近效果組態

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

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

條件約束系統

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

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

Bounds control Constraints

事件

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

  • 旋轉開始:旋轉開始時引發。
  • 旋轉停止:旋轉停止時引發。
  • 調整已啟動:調整開始時引發。
  • 調整已停止:調整停止時引發。
  • 翻譯已啟動:在翻譯開始時引發。
  • 翻譯已停止:翻譯停止時引發。
Bounds control Events

彈性 (實驗性)

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

Bounds control Elastics

處理樣式

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

Bounds Control Handle Styles 2

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

Bounds control HandleStyles

處理HoloLens 2樣式) 的 (設定

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

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

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

Bounds control Object Manipulator

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

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

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

注意

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

Bounds Control

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

  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 的 'Resources' 資料夾或 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 工具套件的 移轉視窗 升級至新的界限控制項。

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

Bounds control Migrate

另請參閱