共用方式為


網格視覺效果腳本程序設計人員指南

移至 Visual Scripting 概觀文章

限制

  • 只有 Unity 功能的子集會公開給視覺效果腳本。
  • 非簡單類型的變數和屬性 (包括對象參考) 不會自動共用。 若要深入瞭解,請參閱下面 的共用和網路 功能。

Hello World

您可以建立的最簡單視覺化文稿就是只開啟訊息框的文稿:

Hello World 範例視覺效果腳本圖形的螢幕快照

這是它在 Mesh 中的外觀:

網格瀏覽器視窗,其中包含顯示 Hello World的快顯對話框和 [確定] 按鈕

Unity 編輯器 的螢幕快照,其中已開啟 Mesh Visual Scripting Hello World 場景。

測試您的腳本

將場景上傳至 Mesh 之前,您可以使用 Mesh 模擬使用播放模式,開發及測試視覺效果腳本,即使有多個用戶端處於分割畫面模式也一樣。

編輯器 中的可視化腳本診斷

在轉換階層中選取具有腳本機器的 GameObject 時,Mesh 會在 [偵測器] 面板底部顯示 [ 網格視覺效果腳本診斷 ] 面板:

[網格視覺效果腳本診斷] 面板的螢幕快照

診斷面板會立即提供任何警告或錯誤的意見反應,這些警告或錯誤可能會使您的腳本無法在 Mesh 中正常運作。

目前限制: 未來版本的診斷面板也可讓您深入瞭解視覺效果腳本對共用變數和屬性的使用,並顯示其他診斷和警告。

上傳至Mesh

使用 Mesh 上傳程式 上傳包含可視化腳本的場景。 若要開啟上傳程式,請在 [Mesh Toolkit] 功能表上,選取 [ 環境]

注意:Mesh Uploader 會在上傳之前驗證視覺效果腳本,並在任何視覺效果腳本中有任何驗證錯誤時拒絕上傳。 詳細診斷會輸出到 主控台

共用和網路

共用和本機腳本狀態

Mesh 使用 Unity 視覺效果腳本,其設計可在不使用網路的情況下運作。 視覺效果文本會在每個客戶端上獨立執行。 不過,使用者的 Mesh 體驗是共用的;所有用戶都會遇到在所有用戶端上看起來都一樣的單一共享場景。

視覺效果腳本執行的效果是它如何變更場景的狀態。

根據預設,Mesh 會自動將一個用戶端上的視覺效果腳本所完成的場景變更複寫到所有其他用戶端。 除了場景中共用的所有專案之外,某些狀態在每個用戶端 (上都會保持獨立,換句話說,就是本機) 。

本機變更的優先順序暫時高於來自客戶端的變更。 範例:如果您持續在本機建立對象的動畫效果,則本機動畫不會受到來自其他客戶端的變更所危害。

有一些自動更新速率限制。 當用戶端仍在執行中時,用戶端不會傳送其他更新;每個往返會透過伺服器傳送一個更新。 在實際情況下,這相當於每秒大約五到六次更新。 這表示由一個用戶端所驅動的平滑動畫在其他用戶端上看起來並不平滑。 最佳做法是在本機執行平滑動畫,最好不是透過視覺效果腳本,而是透過一般 Unity 動畫系統。

即使客戶端的狀態可以暫時不同) ,仍保證 (共用狀態的最終一致性。

本機狀態:

  • 自然本機狀態 – 音效、UI、轉譯。
  • 使用者控制的本機狀態 – 標示為 [本機 腳本範圍 ] 元件的子場景。
  • 技術本機狀態 – 不屬於場景階層的物件 (例如轉譯器材質、資產) 。

共享狀態:

  • 僅限於可視化腳本變數,以及屬於場景階層之 GameObjects 和場景元件的屬性。
  • 只能復寫簡單類型的變數和屬性:整數、浮點數、布爾值、字串、Color、、4Vector2//3QuaternionMatrix4x4和 。Rect

共享狀態的任何變更會透過網路傳送。 這會增加網路流量,如果不小心使用,可能會耗用大量的頻寬。

共用和本機腳本觸發程式

所有可視化腳本流程都會啟動以回應事件。

  • 例如,如果事件源自單一用戶端 (用戶按鍵) ,則視覺效果腳本只會在該用戶端上執行。
  • 如果事件發生在所有用戶端上,視覺效果腳本會在所有用戶端上執行 (例如定時器事件、共用屬性變更、共用變數更新、虛擬人偶輸入觸發程式、物理主體觸控碰撞器) 。

新增節點以偵測是否已選取物件時,請務必選擇正確的節點。 您有兩個選擇: 網格可互動本文:已在本機選取以及選取 [網格可互動本文]。 例如,假設您想要有可按兩下以觸發遙測的按鈕。 若要讓出席者按兩下按鈕並僅自行傳輸,請使用 Mesh Interactable Body: Is Selected 本 機節點。

已在本機選取 [網格可互動主體] 節點的螢幕快照。

若要讓出席者按兩下按鈕並傳送體驗中的每個人,請使用 Mesh Interactable Body: Is Selected 節點。 在每個案例中,節點上方的文字會告訴您預期的行為:

[Mesh 可互動主體已選取] 節點的螢幕快照,這會影響所有用戶端。

如果本機腳本設定共用變數,而第二個腳本接聽此變數的變更 (使用 On State Changed 觸發程式;請參閱下) ,第二個腳本將在所有用戶端上執行。

Mesh 提供一些特殊的腳本節點:

  • 在 [間隔 ] 上,會在所有用戶端上以定期同步方式觸發。
  • On State Changed 會在其輸入變更時觸發 (例如共用屬性、共用變數、本機) 。
  • [顯示對話 框] 會顯示含有自訂文字的訊息對話框,可選擇性地提供按鈕作為響應選項。

Mesh 會做出某些取捨,以利簡化:

  • 如果有多個客戶端嘗試變更相同的數據,最後一個用戶端會優先 (,而不是使用交易型數據更新模型) 。
  • 為了確保數據一致性,在所有用戶端上執行的可視化腳本不得讀取然後寫入共用屬性或變數。 如果發生這種情況,它會觸發運行時錯誤,並中止腳本流程的執行。

最佳做法

視覺效果腳本比原生 C# 程式代碼慢得多。 此外,Mesh 會使用網路和其他整合功能來增強視覺效果腳本,而看似低負荷的視覺效果腳本動作可能會導致網路流量。 若要瞭解如何從視覺效果腳本獲得最佳效能,建議您檢視下列文章:

Visual Scripting 最佳做法概觀
效能的可視化腳本最佳做法
網路功能的可視化腳本最佳做法
可視化腳本偵錯的最佳做法

安全性

網格可保護使用者免於遭受威脅案例,例如:

  • 遭入侵的場景內容,例如惡意嘗試存取敏感性本機數據。
  • 遭入侵的用戶端或傳輸通道—例如,惡意嘗試讀取或寫入其他用戶端上無法存取的遠端數據。

為了達到此目的,Mesh 會在沙箱 (中執行可視化腳本,例如網頁瀏覽器) 中的 JavaScript。

在場景啟動時,Mesh 會使用策劃的允許清單來驗證視覺效果腳本,以限制存取特定類型的 Unity 元件及其屬性的安全子集。

在場景運行時間,Mesh 會限制場景特定部分的存取:

  • 本機:防止存取 Mesh 內部和其他敏感數據。
  • 遠程:藉由檢查場景的作者是否想要修改場景的這個部分。 這是透過靜態分析接收者端上的視覺效果腳本,以取得其可能場景寫入的方式來完成。

範例:

  • 惡意的本機視覺效果腳本想要提供所有虛擬人偶的泡泡頭。 為此,它會嘗試掃描整個場景中代表虛擬人偶頭的 GameObject。 Mesh 會自動篩選掃描結果,以排除虛擬人偶系統。
  • 惡意的遠端用戶端想要藉由翻轉所有 GameObjects 上下翻動場景來破壞場景。 為了達到此目的,它會傳送屬性更新,以設定場景中每個 GameObject 的垂直縮放比例。 不過,因為接收客戶端上沒有任何可視化腳本是設計來執行這類動作,所以本機用戶端會忽略遠端輸入。

網格整合

目前限制: 本節說明仍在運作的功能預覽。

一般而言,與其他元件的整合通常是透過變更和接聽元件屬性變更來完成。 例如:

  • 可互動:觀察「暫留」和「已選取」屬性。

  • 物理互動:觀察觸發程式磁碟區中或與碰撞器接觸的主體。

  • 虛擬人偶:讀取虛擬人偶位置、檢視旋轉和命名分色板。 (尚未提供。)

  • 會話狀態:列出參與者和讀取參與者資訊。 (尚未提供。)

  • 雲端腳本:與可讀取和寫入變數和元件屬性的雲端腳本搭配運作。 (尚未提供。)

某些元件提供本機動作:

  • 音訊管理員
  • 時間表
  • 動畫 師
  • 轉譯:讀取和寫入材質和著色器屬性

物理是特別處理的,因為任何指定物理物件的模擬一律只由一個客戶端授權完成:其擁有者。 若要讓此作業能夠運作,設定物理屬性會觸發自動將擁有權轉移至套用變更的用戶端。

後續步驟