共用方式為


與 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 容器處理模型(使用 LoadModelAsyncLoadModelOptions )的運作方式完全類似。

RemoteEntitySyncObject

建立 Unity 遊戲物件會隱含地將元件新增 RemoteEntitySyncObject 至遊戲物件。 此元件用來將實體轉換同步處理至伺服器。 根據預設 RemoteEntitySyncObject ,使用者必須明確呼叫 SyncToRemote() ,將本機 Unity 狀態同步處理至伺服器。 SyncEveryFrame啟用會自動同步處理物件。

具有 RemoteEntitySyncObject 的物件可以具現化其遠端子系,並透過 按鈕顯示在 Unity 編輯器中 Show children

RemoteEntitySyncObject

包裝函式元件

附加至遠端轉譯實體的元件 會透過 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);
}

下一步