處理例外狀況
在大多數情況下,WLT 可以悄悄地偵測並修正追蹤錯誤,而不需要應用程式介入。
但有些例外狀況會導致應用程式可能想要調整的錯誤。
遺失追蹤是這類條件的範例。
追蹤可能會因為任何原因而隨時遺失。 感測器可能覆蓋、光源可能不足,或相機周圍可能沒有任何可見特徵可供追蹤。
本檔其他地方包含有關概念層級上這些特殊條件的更完整討論,包括旨在緩和它們的 WLT 功能。
在這裡,我們將深入探討應用程式開發人員如何(選擇性地)利用這些功能,在這些例外狀況期間自定義應用程序的行為。
AttachmentPoints
如這裡更完整討論,附件點是WLT與應用程式之間的合約,用於通知發生例外狀況的通知,以及應用程式可能用來回應的適當數據。
調整器元件
這類應用程式回應的實作會以「調整器」元件的形式提供。 其中的主要部分是 AdjusterFixed 元件。
AdjusterFixed 可以依目前方式使用,但瞭解其用途可能具有指示性,特別是對於想要進一步自定義行為的開發人員而言。
請務必辨識調整器元件提供兩個角色:
- 他們會管理基礎 AttachmentPoint。
- 它們提供應用程式回應例外狀況的實作。
AttachmentPoint 管理
檢查 Start()
和 OnDestroy()
成員會擷取大部分的 AttachmentPoint 管理。
在 上 Start()
,會建立基礎 AttachmentPoint,為 AdjusterFixed 的成員函式提供回呼(請參閱下方)。
在 中 OnDestroy()
,這些回呼聯機會遭到切斷,而 AttachmentPoint 已釋出。
條件處理回呼
這兩個回呼會在這些例外狀況期間實作應用程式所需的行為。
處理追蹤狀態
在 HandleStateAdjust()
中,AdjusterFixed 元件會停用目前未追蹤的片段中包含的物件。
protected virtual void HandleAdjustState(AttachmentPointStateType state)
{
bool visible = state == AttachmentPointStateType.Normal;
if (visible != gameObject.activeSelf)
{
gameObject.SetActive(visible);
}
}
雖然這個簡單的行為非常適合許多應用程式,但很容易想像當它不夠的情況。
- 對象應該隱藏,但不應該停用(應該繼續更新)。
- 慣用隱藏物件的替代方法(例如將物件移到遠裁剪平面之外)。
- 它不應該隱藏物件,而是應該以不同的材質轉譯(例如X光材質)。
- 應該轉譯替代物件,而不是隱藏物件。
- 等。
幸運的是,應用程式開發人員可以自由實作上述任何行為,或只受限於想像的其他行為。
指定自定義行為最簡單的方式是實作衍生自 AdjusterFixed 的自定義元件。 接著可以繼承 AttachmentPoint 管理,並覆寫處理程式以建立自定義行為。
處理重新置放
如概念檔所述,WLT 系統可以藉由將物件重新定位在凍結空間中,來決定對象在實體世界中的最佳位置。 它會透過 AttachmentPoint 機制通知應用程式該情況。
當然,應用程式可以忽略這類調整。 不過,AdjusterFixed (和 AdjusterMoving) 元件所提供的行為是立即套用該重新定位轉換。
protected virtual void HandleAdjustLocation(Pose adjustment)
{
Pose pose = gameObject.transform.GetGlobalPose();
pose = adjustment.Multiply(pose);
gameObject.transform.SetGlobalPose(pose);
}
這幾乎一律是應用程式想要的。 問題可能會問及為何有人想要覆寫 AdjusterFixed 的 HandlePositionAdjust()
函式。
當然,答案是,除了更正位置之外,應用程式可能還想要執行其他動作。 暫時性材質效果可能有助於通知用戶已進行變更。 重新定位可能會分散在幾秒鐘內。 或者,如果重新定位過於激烈,應用程式可能會偏好捨棄物件,而不是移動物件。
AdjusterFixed 與 AdjusterMoving
仔細查看 AdjusterMoving 元件會顯示它與它衍生自的 AdjusterFixed 元件幾乎完全相同。
兩者之間的差異在於 AdjusterMoving 假設其目標在環境周圍不斷移動。 因此,每個更新都會通知 WLT 系統其新的 Pose。
AdjusterMoving 的成本主要來自新增 Update() 函式,而不是函式內完成的工作。 不過,對於「大部分」固定的物件,而且不常從腳本移動,使用 AdjusterFixed 元件,並在每次移動對象之後呼叫 AdjusterFixed.UpdatePosition() 會比較有利。
自定義行為,但前提是您想要
同樣地,這裡的模式有望在整個世界鎖定工具中保持一致。 WLT 提供簡單但通常有用的基準行為。 希望此實作能夠:
- 滿足應用程式的需求。
- 提供基準實作,讓您增強。
- 提供範例實作,您可以從中執行。