Interagir com objetos e componentes de jogos do Unity

A renderização remota Azure (ARR) está otimizada para um grande número de objetos (ver Limitações). Embora seja possível gerir hierarquias grandes e complexas no hospedeiro, replicá-las todas em Unidade em dispositivos de baixa potência é inviável.

Assim, quando um modelo é carregado no hospedeiro, a Renderização Remota Azure espelha a informação sobre a estrutura do modelo no dispositivo cliente (que incorrerá no tráfego da rede), mas não replica os objetos e componentes em Unidade. Em vez disso, espera que solicites os objetos e componentes necessários do jogo Da Unidade manualmente, de modo a que possas limitar a sobrecarga ao que é realmente necessário. Desta forma, tens mais controlo sobre o desempenho do lado do cliente.

Consequentemente, a integração de Unidade da Renderização Remota Azure vem com funcionalidade adicional para replicar a estrutura de renderização remota a pedido.

Carregue um modelo na Unidade

Quando carrega um modelo, obtém-se uma referência ao objeto de raiz do modelo carregado. Esta referência não é um objeto de jogo unidade, mas pode transformá-lo em um usando o método de extensão Entity.GetOrCreateGameObject() . Esta função espera um argumento do UnityCreationMode tipo. Se CreateUnityComponents passares, o objeto de jogo Unity recém-criado será adicionalmente preenchido com componentes proxy para todos os componentes de Renderização Remota que existam no hospedeiro. Recomenda-se, no entanto, que se DoNotCreateUnityComponents mantenha o mínimo.

Modelo de carga com coroutinas de unidade

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

Modelo de carga com padrão de espera

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

As amostras de código acima utilizaram o caminho de carregamento do modelo via SAS porque o modelo incorporado está carregado. Dirigir-se ao modelo através de recipientes blob (utilizando LoadModelAsync e ) funciona de forma totalmente LoadModelOptions análoga.

Entidade RemotaSyncObject

Criar um objeto de jogo Unidade adiciona implicitamente um RemoteEntitySyncObject componente ao objeto do jogo. Este componente é utilizado para sincronizar a entidade que se transforma no servidor. Por RemoteEntitySyncObject predefinição, o utilizador chama explicitamente SyncToRemote() para sincronizar o estado de Unidade local para o servidor. A ativação SyncEveryFrame sincronizará o objeto automaticamente.

Os objetos com uma RemoteEntitySyncObject lata podem ter os seus filhos remotos instantâneos e mostrados no editor da Unidade através do Show children botão.

Entidade RemotaSyncObject

Componentes de invólucro

Os componentes ligados às entidades de renderização remota estão expostos à Unidade através de procuração MonoBehavior s. Estes proxies representam o componente remoto em Unidade, e encaminham todas as modificações para o hospedeiro.

Para criar componentes de renderização remota proxy, utilize o método de GetOrCreateArrComponent extensão:

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

Vidas acopladas

A vida útil de uma entidade remota e de um objeto de jogo da Unidade é acoplada enquanto estão ligadas através de um RemoteEntitySyncObject . Se ligar UnityEngine.Object.Destroy(...) com um objeto de jogo, a entidade remota também será removida.

Para destruir o objeto do jogo Unidade, sem afetar a entidade remota, primeiro tens de recorrer Unbind() ao RemoteEntitySyncObject .

O mesmo se aplica a todos os componentes de procuração. Para destruir apenas a representação do lado do cliente, você precisa ligar para Unbind() o componente proxy primeiro:

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

Passos seguintes