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 UnityCreationMode
bir 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 DoNotCreateUnityComponents
etmek ö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 LoadModelOptions
kullanarakLoadModelAsync
) 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.
Sarmalayıcı bileşenleri
Uzaktan İşleme varlıklarına eklenen bileşenler ara sunucu MonoBehavior
aracı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 GetOrCreateArrComponent
kullanı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
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin