Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 CreateUnityComponents
element , 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 .
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 GetOrCreateArrComponent
rozszerzenia :
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 RemoteEntitySyncObject
element . 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 RemoteEntitySyncObject
obiekcie .
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);
}