Condividi tramite


Interagire con gli oggetti e i componenti di gioco Unity

Azure Rendering remoto (ARR) è ottimizzato per un numero elevato di oggetti (vedere Limitazioni). Anche se è possibile gestire gerarchie di grandi dimensioni e complesse nell'host, replicarle tutte in Unity su dispositivi a basso consumo non è fattibile.

Pertanto, quando un modello viene caricato nell'host, Azure Rendering remoto rispecchia le informazioni sulla struttura del modello nel dispositivo client (che incorrerà in traffico di rete), ma non replica gli oggetti e i componenti in Unity. Si prevede invece di richiedere manualmente gli oggetti e i componenti del gioco Unity necessari, in modo da limitare il sovraccarico a ciò che è effettivamente necessario. In questo modo si ha maggiore controllo sulle prestazioni lato client.

Di conseguenza, l'integrazione di Unity di Azure Rendering remoto include funzionalità aggiuntive per replicare la struttura Rendering remoto su richiesta.

Caricare un modello in Unity

Quando si carica un modello, si ottiene un riferimento all'oggetto radice del modello caricato. Questo riferimento non è un oggetto gioco Unity, ma è possibile trasformarlo in un oggetto usando il metodo Entity.GetOrCreateGameObject()di estensione . Tale funzione prevede un argomento di tipo UnityCreationMode. Se si passa CreateUnityComponents, l'oggetto gioco Unity appena creato verrà popolato con componenti proxy per tutti i componenti Rendering remoto presenti nell'host. È tuttavia consigliabile preferire DoNotCreateUnityComponents, per mantenere il sovraccarico minimo.

Caricare il modello con coroutine 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);
    }
}

Caricare il modello con modello await

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

Gli esempi di codice precedenti hanno usato il percorso di caricamento del modello tramite firma di accesso condiviso perché viene caricato il modello predefinito. L'indirizzamento del modello tramite contenitori BLOB (usando LoadModelAsync e LoadModelOptions) funziona in modo completamente analogo.

RemoteEntitySyncObject

La creazione di un oggetto gioco Unity aggiunge in modo implicito un RemoteEntitySyncObject componente all'oggetto gioco. Questo componente viene usato per sincronizzare la trasformazione dell'entità nel server. Per impostazione predefinita RemoteEntitySyncObject , l'utente deve chiamare SyncToRemote() in modo esplicito per sincronizzare lo stato di Unity locale con il server. L'abilitazione SyncEveryFrame sincronizza automaticamente l'oggetto.

Gli oggetti con un RemoteEntitySyncObject oggetto possono avere un'istanza remota degli elementi figlio e visualizzati nell'editor di Unity tramite il Show children pulsante .

RemoteEntitySyncObject

Componenti wrapper

I componenti collegati alle Rendering remoto entità vengono esposti a Unity tramite proxy MonoBehaviors. Questi proxy rappresentano il componente remoto in Unity e inoltrano tutte le modifiche all'host.

Per creare componenti Rendering remoto proxy, usare il metodo GetOrCreateArrComponentdi estensione :

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

Durata dell'accoppiamento

La durata di un'entità remota e di un oggetto gioco Unity è associata mentre sono associate tramite un oggetto RemoteEntitySyncObject. Se chiami UnityEngine.Object.Destroy(...) con un oggetto di gioco di questo tipo, l'entità remota verrà rimossa anche.

Per eliminare definitivamente l'oggetto gioco Unity, senza influire sull'entità remota, è prima necessario chiamare Unbind() su RemoteEntitySyncObject.

Lo stesso vale per tutti i componenti proxy. Per eliminare definitivamente solo la rappresentazione lato client, è prima necessario chiamare Unbind() sul componente proxy:

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

Passaggi successivi