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 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);
}