Mesh 視覺化腳本程式設計人員指南
限制
- 只有 Unity 功能的子集會公開給視覺腳本。
- 具有非簡單類型的變數和屬性(包括物件參考)不會自動共用。 請參閱 下方的 共享和網路,以深入瞭解這一點。
Hello World
您可以建立的最簡單視覺化文稿是只會開啟訊息框的文稿:
這是在 Mesh 中的外觀:
測試您的腳本
將場景上傳至 Mesh 之前,您可以開發及測試視覺腳本,即使有多個用戶端處於分割畫面模式,也能夠搭配 使用播放模式與網格模擬。
編輯器中的可視化腳本診斷
在轉換階層中選取具有腳本計算機的 GameObject 時,Mesh 會在偵測器面板底部顯示 Mesh Visual Scripting Diagnostics 面板:
診斷面板會立即提供任何警告或錯誤的意見反應,這些警告或錯誤可能會導致腳本在 Mesh 中運作良好。
目前限制: 診斷面板的未來版本也可能提供可視化腳本使用共用變數和屬性的見解,以及顯示其他診斷和警告。
上傳至Mesh
使用 Mesh 上傳器來上傳包含視覺腳本的場景。 若要開啟上傳程式,請在 [Mesh 工具組 ] 功能表上,選取 [ 環境]。
注意:Mesh 上傳器會在上傳之前驗證視覺腳本,並在任何視覺腳本中有任何驗證錯誤時拒絕上傳。 詳細的診斷會輸出至 主控台。
共用和網路
共用和本機腳本狀態
Mesh 使用 Unity Visual Scripting,其設計目的是在沒有網路的情況下運作。 視覺文本會獨立在每個用戶端上執行。 不過,共用使用者的 Mesh 體驗;所有用戶都體驗到所有用戶端上看起來相同的單一共享場景。
視覺腳本執行的效果在於它如何變更場景的狀態。
根據預設,Mesh 會自動將一個用戶端上的視覺腳本所完成的場景變更複寫至所有其他用戶端。 除了在場景中共用的所有專案之外,某些狀態在每個用戶端上仍然獨立(換句話說,本機)。
本機變更暫時優先於來自客戶端的變更。 範例:如果您在本機繼續以動畫顯示物件,則本機動畫不會因為來自其他客戶端的變更而遭到入侵。
有一些自動更新速率限制。 用戶端不會在正式發行前小眾測試版時傳送其他更新;每次往返透過伺服器傳送一次更新時,就會傳送一個更新。 在實際情況下,這相當於每秒大約五到六次更新。 這表示由一個客戶端驅動的平滑動畫在其他用戶端上看起來不會順暢。 最佳做法是在本機執行平滑動畫,理想情況下不是透過視覺腳本,而是透過一般的 Unity 動畫系統。
保證共享狀態的最終一致性(即使用戶端的狀態可能暫時不同也一樣)。
本機狀態:
- 自然本機狀態 – 音效、UI、轉譯。
- 使用者控制的本機狀態 – 以本機腳本範圍元件標示的子場景。
- 技術本機狀態 – 不屬於場景階層的物件(例如轉譯器材質、資產)。
共享狀態:
- 僅限於視覺腳本變數,以及屬於場景階層一部分的 GameObjects 和場景元件的屬性。
- 只有簡單類型的變數和屬性可以復寫:整數、浮點數、布爾值、字串、
Color
、、、/Vector2
3
4
/、Quaternion
Matrix4x4
和 。Rect
共享狀態的任何變更都會透過網路傳送。 這會增加網路流量,如果不小心使用,可能會耗用大量的頻寬。
共用和本機腳本觸發程式
所有可視化腳本流程都會開始回應事件。
- 如果事件源自單一用戶端(例如,使用者按下按鈕),則視覺腳本只會在該用戶端上執行。
- 如果事件發生在所有用戶端上,可視化腳本會在所有用戶端上執行(例如定時器事件、共用屬性變更、共用變數更新、虛擬人偶輸入觸發程式、物理本文觸控對撞器)。
新增節點以偵測是否已選取物件時,請務必選擇正確的節點。 您有兩個選項: 網格可互動本文:已在本機選取,而 網格可互動主體:已選取。 例如,假設您想要有按鈕可以按下以觸發傳送。 若要讓出席者按兩下按鈕,並只傳輸本身,請使用 [網格可互動本文:選取在本機 ] 節點。
若要讓出席者按兩下按鈕,並傳送體驗中的每個人,請使用 Mesh互動本文:已選取 的節點。 在每個案例中,節點上方的文字會告訴您預期的行為:
如果本機腳本設定共用變數,而第二個腳本會接聽此變數的變更(使用 On State Changed 觸發程式;如下所示),則會在所有用戶端上執行第二個腳本。
Mesh 提供一些特殊的腳本節點:
- 在 [間隔] 觸發程式時,會以同步方式在所有用戶端上同步觸發。
- 在 [狀態變更 ] 觸發程式時,其輸入變更時(例如,共用屬性、共用變數、局部變數)。
- [顯示對話框 ] 會顯示訊息對話方塊,其中包含可選擇性地提供按鈕作為響應選項的自定義文字。
Mesh 會做出某些取捨,以利於簡單:
- 如果多個客戶端嘗試變更相同的數據,則最後一個用戶端會獲勝(而不是使用交易型數據更新模型)。
- 為了確保數據一致性,在所有用戶端上執行的視覺腳本不得讀取和寫入共用屬性或變數。 如果發生這種情況,它會觸發運行時錯誤,並中止腳本流程的執行。
最佳作法
視覺腳本比原生 C# 程式代碼慢得多。 此外,Mesh 會使用網路和其他整合功能來增強視覺腳本,而看似低負荷的視覺腳本動作可能會導致網路流量。 若要瞭解如何從視覺腳本取得最佳效能,建議您檢視下列文章:
可視化腳本最佳做法概觀
效能的可視化腳本最佳做法
網路功能可視化腳本最佳做法
偵錯的可視化腳本最佳做法
安全性
Mesh 可保護使用者免於遭受威脅案例,例如:
- 遭入侵的場景內容,例如惡意嘗試存取敏感性本機數據。
- 遭入侵的用戶端或傳輸通道,例如,惡意嘗試讀取或寫入其他用戶端上無法存取的遠端數據。
為了達成此目的,Mesh 會在沙箱中執行視覺腳本(例如網頁瀏覽器中的 JavaScript)。
在場景啟動時,Mesh 會使用策劃的允許清單來驗證視覺腳本,以限制特定 Unity 元件的存取,以及其屬性的安全子集。
在場景運行時間,Mesh 會限制對場景特定部分的存取:
- 本機:藉由防止存取 Mesh 內部和其他敏感數據。
- 遠程:藉由檢查場景的作者是否打算修改場景的這個部分。 這是藉由靜態分析接收者端的視覺腳本來撰寫其潛在的場景寫入來完成。
範例:
- 惡意的本機視覺腳本想要提供所有虛擬人偶擷取頭。 為此,它會嘗試掃描代表虛擬人頭的 GameObjects 整個場景。 Mesh 會自動篩選掃描結果,以排除虛擬人偶系統。
- 惡意的遠端用戶端想要翻轉所有 GameObjects 倒置來清除場景。 為了達成此目的,它會傳送屬性更新,以設定場景中每個 GameObject 的垂直縮放比例。 不過,由於接收用戶端上沒有任何視覺腳本設計來執行這類動作,因此本機用戶端會忽略遠端輸入。
網格整合
目前的限制: 本節描述仍在進行中之功能的預覽。
一般而言,與其他元件整合通常是藉由變更和接聽元件屬性變更來完成。 例如:
互動:觀察「暫留」和「已選取」屬性。
物理互動:觀察觸發程式音量中的主體,或與碰撞器接觸。
虛擬人偶:讀取虛擬人偶位置、檢視旋轉和名稱板。 (尚未提供。
會話狀態:列出參與者並讀取參與者資訊。 (尚未提供。
雲端腳本:與可讀取和寫入變數和元件屬性的雲端腳本搭配運作。 (尚未提供。
某些元件提供本機動作:
- 音訊管理員
- 時間軸
- 動畫 師
- 轉譯:讀取和寫入材質和著色器屬性
物理會特別處理,因為任何給定物理物件的模擬一律由一個用戶端授權完成:其擁有者。 若要使這項工作,設定物理屬性會觸發自動擁有權傳送至套用變更的用戶端。