Unity oyun nesneleri ve bileşenleriyle etkileşim kurma

Azure Uzaktan İşleme (ARR), çok sayıda nesne için iyileştirilmiştir (bkz . Sınırlamalar). Konakta büyük ve karmaşık hiyerarşileri yönetmek mümkün olsa da, bunların tümünü düşük güçlü cihazlarda Unity'de çoğaltmak mümkün değildir.

Bu nedenle, bir model konağa yüklendiğinde, Azure Uzaktan İşleme istemci cihazdaki model yapısı hakkındaki bilgileri yansıtır (ağ trafiğine neden olur), ancak Unity'deki nesneleri ve bileşenleri çoğaltmaz. Bunun yerine, gerekli Unity oyun nesnelerini ve bileşenlerini el ile istemenizi bekler, böylece ek yükü gerçekten gerekli olanla sınırlayabilirsiniz. Bu şekilde istemci tarafı performansı üzerinde daha fazla denetime sahip olursunuz.

Sonuç olarak, Azure Uzaktan İşleme'nin Unity tümleştirmesi, uzaktan işleme yapısını isteğe bağlı olarak çoğaltmak için ek işlevlerle birlikte gelir.

Unity'de model yükleme

Bir modeli yüklediğinizde, yüklenen modelin kök nesnesine başvuru alırsınız. Bu başvuru bir Unity oyun nesnesi değildir, ancak uzantı yöntemini Entity.GetOrCreateGameObject()kullanarak bunu bir nesneye dönüştürebilirsiniz. Bu işlev türünde UnityCreationModebir bağımsız değişken bekler. geçerseniz CreateUnityComponents, yeni oluşturulan Unity oyun nesnesi ayrıca konakta bulunan tüm Uzaktan İşleme bileşenleri için ara sunucu bileşenleriyle doldurulur. Ancak, ek yükü en az düzeyde tutmak için tercih DoNotCreateUnityComponentsetmek önerilir.

Unity eş yordamlarıyla modeli yükleme

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

Await deseni ile yük modeli

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

Yukarıdaki kod örnekleri, yerleşik model yüklendiğinden SAS aracılığıyla model yükleme yolunu kullandı. Modeli blob kapsayıcıları aracılığıyla ele almak (ve LoadModelOptionskullanarakLoadModelAsync) tam olarak benzer şekilde çalışır.

RemoteEntitySyncObject

Unity oyun nesnesi oluşturmak, oyun nesnesine örtük olarak bir RemoteEntitySyncObject bileşen ekler. Bu bileşen, varlık dönüşümünü sunucuya eşitlemek için kullanılır. Varsayılan olarak RemoteEntitySyncObject , kullanıcının yerel Unity durumunu sunucuyla eşitlemek için açıkça çağırmasını SyncToRemote() gerektirir. Etkinleştirildiğinde SyncEveryFrame nesne otomatik olarak eşitlenir.

ile RemoteEntitySyncObject nesneler, uzak alt öğelerinin örneği oluşturulabilir ve düğme aracılığıyla Unity düzenleyicisinde Show children gösterilebilir.

RemoteEntitySyncObject

Sarmalayıcı bileşenleri

Uzaktan İşleme varlıklarına eklenen bileşenler ara sunucu MonoBehavioraracılığıyla Unity'ye sunulur. Bu proxy'ler Unity'deki uzak bileşeni temsil eder ve tüm değişiklikleri konağa iletir.

Ara sunucu Uzaktan İşleme bileşenleri oluşturmak için uzantı yöntemini GetOrCreateArrComponentkullanın:

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

Birleştirilmiş yaşam süreleri

Uzak bir varlığın ve Unity oyun nesnesinin ömrü, üzerinden bağlandıkları sırada bağlanır RemoteEntitySyncObject. Böyle bir oyun nesnesiyle çağırırsanız UnityEngine.Object.Destroy(...) uzak varlık da kaldırılır.

Unity oyun nesnesini, uzak varlığı etkilemeden yok etmek için önce üzerinde RemoteEntitySyncObjectçağrısı Unbind() yapmanız gerekir.

Aynı durum tüm ara sunucu bileşenleri için de geçerlidir. Yalnızca istemci tarafı gösterimini yok etmek için, önce ara sunucu bileşeninde çağrısı Unbind() yapmanız gerekir:

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

Sonraki adımlar