Interakcja ze składnikami i obiektami gier środowiska Unity

Usługa Azure Remote Rendering (ARR) jest zoptymalizowana pod kątem ogromnej liczby obiektów (zobacz Ograniczenia). Chociaż istnieje możliwość zarządzania dużymi i złożonymi hierarchiami na hoście, replikowanie ich wszystkich na urządzeniach o niskiej mocy jest niemożliwe.

W związku z tym po załadowaniu modelu na hoście usługa Azure Remote Rendering dubluje informacje o strukturze modelu na urządzeniu klienckim (co spowoduje powstanie ruchu sieciowego), ale nie replikuje obiektów i składników w środowisku Unity. Zamiast tego oczekuje się, że zażądasz wymaganych obiektów i składników gry Unity ręcznie, tak aby można było ograniczyć obciążenie do tego, co jest rzeczywiście potrzebne. Dzięki temu masz większą kontrolę nad wydajnością po stronie klienta.

W związku z tym integracja aparatu Unity z usługą Azure Remote Rendering oferuje dodatkowe funkcje replikacji struktury remote renderingu na żądanie.

Ładowanie modelu w a środowisku Unity

Podczas ładowania modelu uzyskujesz odwołanie do głównego obiektu załadowanego modelu. To odwołanie nie jest obiektem gry aparatu Unity, ale można przekształcić go w jeden przy użyciu metody Entity.GetOrCreateGameObject()rozszerzenia . Ta funkcja oczekuje argumentu typu UnityCreationMode. Jeśli przekażesz CreateUnityComponentselement , nowo utworzony obiekt gry aparatu Unity zostanie dodatkowo wypełniony składnikami serwera proxy dla wszystkich składników usługi Remote Rendering, które istnieją na hoście. Zaleca się jednak, aby preferować DoNotCreateUnityComponents, aby zachować minimalne obciążenie.

Ładowanie modelu za pomocą współistnienia aparatu 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);
    }
}

Ładowanie modelu z wzorcem await

async void LoadModelWithAwait(RenderingSession session)
{
    var result = await session.Connection.LoadModelFromSasAsync(new LoadModelFromSasOptions("builtin://Engine"), null);
    var gameObject = result.Root?.GetOrCreateGameObject(UnityCreationMode.DoNotCreateUnityComponents);
}

Powyższe przykłady kodu używały ścieżki ładowania modelu za pośrednictwem sygnatury dostępu współdzielonego, ponieważ został załadowany wbudowany model. Zwracanie się do modelu za pośrednictwem kontenerów obiektów blob (przy użyciu LoadModelAsync i LoadModelOptions) działa w pełni analogicznie.

RemoteEntitySyncObject

Tworzenie obiektu gry aparatu Unity niejawnie dodaje RemoteEntitySyncObject składnik do obiektu gry. Ten składnik służy do synchronizowania przekształcenia jednostki z serwerem. Domyślnie RemoteEntitySyncObject użytkownik musi jawnie wywołać SyncToRemote() metodę w celu zsynchronizowania lokalnego stanu aparatu Unity z serwerem. SyncEveryFrame Włączenie spowoduje automatyczną synchronizację obiektu.

Obiekty z obiektem RemoteEntitySyncObject mogą utworzyć wystąpienie swoich zdalnych elementów podrzędnych i wyświetlić je w edytorze Show children aparatu Unity za pomocą przycisku .

RemoteEntitySyncObject

Składniki otoki

Składniki dołączone do jednostek usługi Remote Rendering są widoczne dla aparatu Unity za pośrednictwem serwerów proxy MonoBehavior. Te serwery proxy reprezentują składnik zdalny w afeście Unity i przekazują wszystkie modyfikacje do hosta.

Aby utworzyć składniki usługi Remote Rendering serwera proxy, użyj metody GetOrCreateArrComponentrozszerzenia :

var cutplane = gameObject.GetOrCreateArrComponent<ARRCutPlaneComponent>(RemoteManagerUnity.CurrentSession);

Okresy istnienia w połączeniu

Okres istnienia zdalnej jednostki i obiektu gry Aparatu Unity jest powiązany, gdy są one powiązane przez RemoteEntitySyncObjectelement . Jeśli wywołasz UnityEngine.Object.Destroy(...) taki obiekt gry, jednostka zdalna zostanie również usunięta.

Aby zniszczyć obiekt gry Aparatu Unity, bez wpływu na jednostkę zdalną, należy najpierw wywołać Unbind() element na RemoteEntitySyncObjectobiekcie .

To samo dotyczy wszystkich składników serwera proxy. Aby zniszczyć tylko reprezentację po stronie klienta, najpierw należy wywołać Unbind() składnik proxy:

var cutplane = gameObject.GetComponent<ARRCutPlaneComponent>();
if (cutplane != null)
{
    cutplane.Unbind();
    UnityEngine.Object.Destroy(cutplane);
}

Następne kroki