與 Unity 遊戲物件和元件互動
Azure 遠端轉譯 (ARR) 已針對大量物件進行優化(請參閱 限制 )。 雖然可以在主機上管理大型且複雜的階層,但無法在低功率裝置上複寫 Unity 中的所有階層。
因此,當模型載入主機上時,Azure 遠端轉譯會鏡像用戶端裝置上模型結構的相關資訊(這會產生網路流量),但不會複寫 Unity 中的物件和元件。 相反地,它預期您會手動要求所需的 Unity 遊戲物件和元件,因此您可以將額外負荷限制為實際需要的內容。 如此一來,您就更能控制用戶端效能。
因此,Azure 遠端轉譯的 Unity 整合隨附額外的功能,可視需要複寫遠端轉譯結構。
在 Unity 中載入模型
載入模型時,您會取得已載入模型根物件的參考。 此參考不是 Unity 遊戲物件,但您可以使用擴充方法 Entity.GetOrCreateGameObject()
將其轉換成一個 。 該函式預期類型為 的 UnityCreationMode
引數。 如果您傳遞 CreateUnityComponents
,則新建立的 Unity 遊戲物件會另外填入主機上所有遠端轉譯元件的 Proxy 元件。 不過,建議使用 DoNotCreateUnityComponents
,以將額外負荷降至最低。
使用 Unity 協同程式載入模型
IEnumerator LoadModelWithCoroutine(RenderingSession session)
{
float currentProgress = 0.0f;
var task = session.Connection.LoadModelFromSasAsync(new LoadModelFromSasOptions("builtin://Engine"),
(float progress) =>
{
currentProgress = progress;
});
while (!task.IsCompleted && !task.IsFaulted)
{
int percentage = (int)(currentProgress * 100.0f);
yield return null;
}
if (!task.IsFaulted)
{
var gameObject = task.Result.Root?.GetOrCreateGameObject(UnityCreationMode.DoNotCreateUnityComponents);
}
}
使用 await 模式載入模型
async void LoadModelWithAwait(RenderingSession session)
{
var result = await session.Connection.LoadModelFromSasAsync(new LoadModelFromSasOptions("builtin://Engine"), null);
var gameObject = result.Root?.GetOrCreateGameObject(UnityCreationMode.DoNotCreateUnityComponents);
}
上述程式碼範例會透過 SAS 使用模型載入路徑,因為已載入內建模型。 透過 Blob 容器處理模型(使用 LoadModelAsync
和 LoadModelOptions
)的運作方式完全類似。
RemoteEntitySyncObject
建立 Unity 遊戲物件會隱含地將元件新增 RemoteEntitySyncObject
至遊戲物件。 此元件用來將實體轉換同步處理至伺服器。 根據預設 RemoteEntitySyncObject
,使用者必須明確呼叫 SyncToRemote()
,將本機 Unity 狀態同步處理至伺服器。 SyncEveryFrame
啟用會自動同步處理物件。
具有 RemoteEntitySyncObject
的物件可以具現化其遠端子系,並透過 按鈕顯示在 Unity 編輯器中 Show children 。
包裝函式元件
附加至遠端轉譯實體的元件 會透過 Proxy MonoBehavior
向 Unity 公開。 這些 Proxy 代表 Unity 中的遠端元件,並將所有修改轉送至主機。
若要建立 proxy 遠端轉譯 元件,請使用擴充方法 GetOrCreateArrComponent
:
var cutplane = gameObject.GetOrCreateArrComponent<ARRCutPlaneComponent>(RemoteManagerUnity.CurrentSession);
結合存留期
遠端 實體 和 Unity 遊戲物件的存留期會在系結至 RemoteEntitySyncObject
時結合。 如果您使用這類遊戲物件呼叫 UnityEngine.Object.Destroy(...)
,也會移除遠端實體。
若要終結 Unity 遊戲物件,而不會影響遠端實體,您必須先在 上 RemoteEntitySyncObject
呼叫 Unbind()
。
所有 Proxy 元件也是如此。 若要只終結用戶端標記法,您必須先在 Proxy 元件上呼叫 Unbind()
:
var cutplane = gameObject.GetComponent<ARRCutPlaneComponent>();
if (cutplane != null)
{
cutplane.Unbind();
UnityEngine.Object.Destroy(cutplane);
}