Kıdemli Yazılım Mühendisi
Unity ve Android XR'ı kullanarak 3D deneyimleri gerçek dünyada nasıl sabitleyeceğinizi ve kalıcı hale getireceğinizi öğrenin. Bu oturumda, Spatial Entities çerçevesi, Cloud Anchors ve Geospatial API'ler ele alınacak. Fiziksel yerleşimleri hatırlayan ve oturumlar arasında çok kullanıcılı mekansal verileri senkronize eden bağlama duyarlı uygulamaların nasıl oluşturulacağı gösterilecek.
Mekansal varlıkların mimarisini inceleyecek, dijital varlıkları fiziksel nesnelere, yüzeylere ve coğrafi konumlara nasıl sabitleyeceğimizi öğreneceğiz. Bu oturumda, alanları haritalandırma, oturumlar arasında içerikleri kalıcı hale getirme ve paylaşılan, konuma duyarlı AR/XR deneyimleri oluşturma gibi pratik Unity iş akışlarını öğreneceksiniz.
TrySaveAnchorAsync ile bunları kalıcı hale getirebilir ve serileştirilmiş GUID'leri kullanarak yeniden yükleyebilirsiniz.Transkript
İşte böyle.
Herkese merhaba.
Bu, Unity ile Android XR'da Üç Boyutlu İçerik Tasarlama kursudur.
Adım Jennifer Stanton.
Unity'de kıdemli yazılım mühendisi olarak çalışıyorum.
XR Özellikleri ekibinde çalışıyorum. Özellikle AR Foundation ve artırılmış ile karma gerçekliği Unity'ye getiren ilgili paketler üzerinde çalışıyorum.
Ben Google'ın XR Oyun Motorları Ekibi'nden Levana Chen.
Ekiplerimiz, gelişmiş XR işlevleri ve sorunsuz oyun motoru entegrasyonları sunan eklentiler ve paketler sağlamaya odaklandı.
Sizden duyduğumuz en büyük zorluklardan biri, aynı kod tabanıyla birden fazla XR platformunu desteklemenin çok fazla iş gerektirmesi.
AR Foundation, Unity'nin üst düzey genişletilmiş gerçeklik API katmanıdır.
Kodları baştan yazmak veya birden fazla kod tabanını yönetmek zorunda kalmadan birden fazla XR platformunu hedefleyebilirsiniz. Ayrıca, tüm platformlardaki AR özellikleri için tek bir komut dosyası API'si kullanabilirsiniz.
Bu sayede siz uygulamanızı, oyununuzu veya deneyiminizi oluşturmaya odaklanırken Unity, platform ayrıntılarını sizin için halleder.
AR Foundation bunu OpenXR uzantıları aracılığıyla yapar.
Bunlar, Khronos Group tarafından tanımlanan bir dizi açık, endüstri standardı API'dir.
OpenXR da uzamsal varlıklar oluşturdu.
Dijital içeriğin fiziksel dünyayı temsil etmesi ve onunla etkileşim kurması için bir çerçevedir.
Mekansal varlıklar, gerçek dünyadaki öğeleri dijital nesneler olarak temsil etmek için birleşik bir model sunar.
XR deneyimleri oluşturma yolculuğunuza başlayabilmeniz için AR Foundation ile ilgili en son bilgileri sizinle paylaşmaktan heyecan duyuyorum.
Ardından, dijital içeriğinizin gerçek dünyayla etkileşime girebilmesi için AR Foundation'ın özelliklerini inceleyeceğim.
Ardından, paketler ve diğer bağımlılıklar dahil olmak üzere proje kurulumunu inceleyeceğim. Böylece bunu projelerinizde uygulayabilirsiniz.
Ardından, Android XR'a özgü bazı özelliklerden bahsederek sunumu tamamlayacağım.
AR Foundation'ın gerçek dünyayı dijital olarak temsil etme yöntemlerinden biri düzlemlerdir.
Bunlar fiziksel ortamdaki zemin, duvar, tavan, hatta masa ve koltuk gibi düz yüzeylerdir.
Mesh'ler, fiziksel dünyanın geometrisini temsil eden 3D yapılardır.
Ayrıca gerçek dünyayla etkileşim kurmanın bir yolu olan ışın dökümleri de var.
Bunlar, bir ışının dijital içerikle nerede kesiştiğini belirler.
Bunu bir lazer işaretçi olarak düşünebilirsiniz. Lazer işaretçinin nereye tutulduğuyla ilgili bilgi alırsınız.
Ayrıca, uzaydaki bir noktayı sabitlemeye ve yerini değiştirmeye yardımcı olan bağlantı noktalarımız da var.
Sunumun ilerleyen bölümlerinde çıpalar hakkında daha ayrıntılı bilgi vereceğim.
Bu dört özellik, AR Foundation özellikleri olarak kabul edilir.
Bu slaytta bahsedilmeyen birkaç özellik daha vardır.
Özellikle düzlemler ve sabitleyiciler, ARTrackable sınıfını genişlettikleri ve yöneticileri çalışma zamanındaki güncellemeleri izlediği için izlenebilir olarak kabul edilir.
Şimdi uçaklara geçelim.
Düzlemler için düz yüzeylerin anlık olarak tanımlanmasını sağlayan ARPlane bileşenimiz var.
Sorgulayabileceğiniz semantik etiketleri vardır. Böylece düzleminizin zemin, masa, duvar vb. olup olmadığını anlayabilirsiniz.
Düzlemlerin dinamik sınırları da vardır. Bu nedenle, kullanıcı gerçek dünyada hareket ettikçe ve yüzeylerin daha fazlasını görebildikçe düzlem sınırları gerçek zamanlı olarak dinamik bir şekilde genişler, birleşir ve hassaslaşır.
Fizik işlemlerini gerçekleştirmek için düzleme bir ağ çarpıştırıcı da ekleyebiliriz.
Burada düzlem algılama örneğini görebilirsiniz.
Bu, Android XR cihazda çalışan AR Foundation örnekleri ışın dökümü sahnesidir.
Gerçek zamanlı, dinamik, 2D çokgenleri algılar.
Proje kurulum kılavuzumuzu takip ederek veya örneklerimizden ya da şablonlarımızdan birini kullanarak bu işleve sahip bir uygulama oluşturabilirsiniz.
Sırada mesh'ler var.
Ağlar, ortamın 3D ağlarını sağlayan bir AR özelliğidir.
Oluşturulan bu mesh'lere bir mesh collider ekleyebiliriz. Bu sayede dijital içeriğiniz gerçek dünyadaki nesnelerle etkileşime girebilir.
Meshes allow for convincing object occlusion.
Böylece sanal bir nesne, fiziksel bir nesnenin arkasında görünebilir.
Dijital nesneniz uzayda hareket edebiliyorsa gerçek dünyadaki nesnelerden kaçınan bir yol bulmak için aynı geometriyi kullanabilirsiniz.
Sırada ışın dökümü var.
Işın dökümü, karmaşık matematik işlemleriyle uğraşmanıza gerek kalmadan kesişimleri aramak için sanal ışınları 3D sahnenize yansıtır.
Yansıtılan ışın, ortamınızdaki birden fazla 3D nesneyle kesişebilir.
Işın dökümünü yalnızca belirli dijital içerik türlerine isabet edecek şekilde yapılandırabilirsiniz.
Örneğin, düzlemlere çarpmayacak ve yalnızca ağlarla kesişecek şekilde yapılandırabilirsiniz.
Şimdi ilgili paketlere göz atalım.
Bu paketlerin tümü, birbirleriyle iletişim kurmak ve eksiksiz bir XR deneyimi oluşturmak için birlikte çalışır.
Daha önce de belirtildiği gibi AR Foundation, düzlemler ve sabitleyiciler gibi özellikleri yönetir.
OpenXR eklentisi, çeşitli XR platformlarındaki yerel API'leri işler. Bu nedenle, cihazınız OpenXR kullanıyorsa bu paketi kullanmanız gerekir.
OpenXR eklentisi, özellikle Spatial Entities uzantılarına erişmek için isteğe bağlı olarak OpenXR Spatial Entities paketiyle eşlenebilir. Bu konuya daha sonra değineceğiz.
Özellikle XR kulaklıkları ve kablolu XR gözlükleri gibi Android XR cihazları hedefleyeceğinizi biliyorsanız Unity OpenXR Android XR paketi gerekir.
Tüm bunlar eklenti kalıbını izlediğinden kodunuz üzerindeki etki minimum düzeyde kalır.
Bazı özellikler tüm AR Foundation paketlerinde kullanılamayabilir.
Örneğin, bu tabloya bakarsanız ağ oluşturma özelliğinin şu anda Unity OpenXR Spatial Entities paketinde kullanılamadığını görürsünüz.
XR Plug-in Management, projenizde hangi OpenXR özelliklerinin seçildiğini yönetmenize olanak tanır.
Unity düzenleyicisindeyseniz Düzenle, Proje Ayarları'na gidin. XR Eklenti Yönetimi, sol kenar çubuğunda yer alır.
Burada OpenXR özelliklerini ve özellik gruplarını bulabilirsiniz. Böylece, derlemenize dahil etmek istediğiniz özellikleri ve özellik gruplarını seçebilir ve seçimlerini kaldırabilirsiniz.
Örneğin, bu ekran görüntüsünde Android XR OpenXR paketiyle birlikte gelen tüm özellikleri görüyoruz.
Dilerseniz bunları uzamsal varlıklarla bir arada kullanabilirsiniz.
Package Manager penceresi bu şekilde.
Tipik bir XR projesi kurulumunda görebileceğiniz bazı paketleri vurguladım.
Gördüğünüz gibi, daha önce bahsettiğimiz AR Foundation var.
OpenXR eklentimiz de var.
Android XR paketi bizde.
Ayrıca diğer platformlardan da bazılarını vurguladım çünkü kesinlikle birden fazla platformda derlenen bir proje oluşturabilirsiniz.
Sağ altta da başka paketler var.
OpenXR cihazlarla çalışan Composition Layers, XR ile ilgili her şey için çok kullanışlı olan Core Utils ve girişlerinizi almak için oldukça önemli olan XR Hands ve XR Interaction Toolkit.
Sırada proje doğrulaması var.
Bu da XR Plug-in Management'ın bir parçasıdır.
Proje doğrulama, projenizde yinelenen özelliklerin yanı sıra projenizi çalıştırmak için düzeltmeniz gereken diğer sorunları da tespit edebilir.
Ancak bu ekran görüntüsünde yinelenen özellikleri vurguladım.
Yani burada temel olarak, aynı özelliklerden ikisinin (örneğin, burada bağlantı noktaları, belki düzlemler ve ışınlar var)
Kullanıcı, birden fazla paketten bu özelliklerin kopyalarını dahil etmeyi seçti ve kullanıcıdan birini veya diğerini seçmesi isteniyor.
Bu da bizi yerel sabit noktalara ve kalıcılığa getiriyor.
Sabitler, AR oturumunun izleme durumundaki değişikliklerden bağımsız olarak dijital içeriğin ortamda istenen konumlarda kalmasını sağlar.
Artırılmış gerçeklik platformları, tutturucuların pozlarını zaman içinde otomatik olarak güncelleyerek tutarlı bir konumda kalmalarını sağlar. Tutturucular, tutturucunuzdan uzaklaşıp tekrar ona doğru yürüdüğünüzde içeriğinizin yerinde kalmasını sağlamanın en iyi yoludur.
Peki kullanıcı uygulamasını kapatıp daha sonra yeniden başlattığında ve ayrı bir oturumda uygulamaya geri döndüğünde ne olur?
Kalıcı sabitleyiciler, bir AR oturumunda sabitleyicileri kaydetmenize ve sonraki oturumlarda yüklemenize olanak tanır.
Uygulama yaşam döngüleri ve cihaz yeniden başlatma işlemlerinden etkilenmezler.
Burada, AR Foundation Samples projesindeki kalıcı ankraj örneğimiz gösterilmektedir.
Örnek sahnede, ilgili platformda desteklenen tüm işlevleri (ör. sabitleyicileri kaydetme ve yükleme) içeren bir menü bulunur.
Bu da bizi kalıcı bağlantı noktalarının yaşam döngüsüne getiriyor.
Öncelikle yerel olarak bir sabitleyici oluşturursunuz. Bu sabitleyici henüz hiçbir yere kaydedilmez, kalıcı depolama alanına kaydedilmez, yalnızca yerel bir sabitleyicidir.
Ardından depolama alanına kaydedersiniz.
Ardından uygulamayı yeniden başlatabilir ve depolama alanından yükleyebilirsiniz.
Android XR dahil olmak üzere bazı platformlar, sabitleyicilerin silinmesini veya kalıcı olmaktan çıkarılmasını da destekler.
Spatial Entities sağlayıcısı, kaydedilen tüm sabitleyicilerin otomatik olarak yüklenmesini destekler. Böylece her sabitleyiciyi kimliğine göre manuel olarak istemeniz gerekmez.
XR Plug-in Management ayarlarında, Spatial Entities: Anchors özelliğinde Automatically Load Saved Anchors seçeneğini belirleyebilirsiniz.
Bir sabiti kaydetmek için yalnızca birkaç satır kod gerekir.
Öncelikle Unity düzenleyicisinde, XR Origin oyun nesnenize AR Anchor Manager bileşenini ekleyerek sahnenizin hazır olduğundan emin olun.
Yönetici, çalışma zamanındaki izlenen sabit noktalarla sahneyi güncel tutar.
Şimdi koda geçelim.
Sabit nokta eklemek için TryAddAnchorAsync yöntemini çağırıp sabit noktanızı yerleştirmek istediğiniz konumu iletmeniz yeterlidir.
async void CreateAnchorAsync(ARAnchorManager manager, Pose pose) {
var result = await manager.TryAddAnchorAsync(pose);
if (result.status.IsError()) {
// handle error
return;
}
var anchor = result.value;
}Sırada sabit reklamları kaldırma var.
void RemoveAnchor(ARAnchorManager manager, ARAnchor anchor) {
var result = manager.TryRemoveAnchor(anchor.trackableId);
if (result.status.IsError()) {
// handle error
return;
}
}
void DestroyAnchorComponent(ARAnchor anchor) {
Destroy(anchor);
}Benzer şekilde, bu da neredeyse tek bir kod satırından ibarettir.
TryRemoveAnchor yöntemini çağırıp sabitin izlenebilir kimliğini iletirsiniz.
Sabit nokta oluşturulduğunda izlenebilir bir kimlik atanmıştır.
Ardından TrySaveAnchorAsync geliyor.
async void SaveAnchorAsync(ARAnchorManager manager, ARAnchor anchor) {
var result = await manager.TrySaveAnchorAsync(anchor);
if (result.status.IsError()) {
// handle error
return;
}
// Save this value, then return it as an input parameter
SerializableGuid guid = result.value;
}Giriş olarak bir AR sabitleyici iletirsiniz.
Bu işlev, kalıcı depolama alanındaki sabitleyiciyi tanımlayan bir SerializableGuid döndürür.
Daha sonra, sabitleyiciyi yüklerken GUID'yi kullanabilirsiniz.
Şimdi de yükleme bağlantı noktalarına bakalım.
async void LoadAnchorAsync(ARAnchorManager manager, SerializableGuid guid) {
var result = await manager.TryLoadAnchorAsync(guid);
if (result.status.IsError()) {
// handle error
return;
}
ARAnchor anchor = result.value;
}Burada çağrılacak işlev TryLoadAnchorAsync olup daha önce serileştirilmiş GUID'yi iletirsiniz.
Sonuç olarak bir AR sabitleyici döndürür.
Hepsi bu kadar.
Bu işlevler, hem yerel hem de kalıcı sabitleyicileri kolayca yönetmenize olanak tanır.
Bu nedenle, çoğu AR platformunda sabitleyici takibi oldukça pahalı bir işlemdir.
Bağlantı noktalarıyla çalışırken aşağıdaki en iyi uygulamaları göz önünde bulundurun: Birbirine çok yakın birden fazla bağlantı noktası oluşturmaktan kaçının, başka bir bağlantı noktası oluşturmak yerine yakındaki bir bağlantı noktasını kullanıp kullanamayacağınızı değerlendirin, artık kullanmadığınız bağlantı noktalarını kaldırın ve son olarak, bir bağlantı noktası için istenen pozun hesaplanmasına yardımcı olacak başka bir AR özelliğini etkinleştirirseniz bağlantı noktası başarıyla oluşturulduktan sonra bu özelliği devre dışı bırakıp bırakamayacağınızı değerlendirin.
Şimdi sözü Levana'ya bırakıyorum.
Teşekkürler Jennifer.
Şimdi de Google'ın Unity'deki Android XR yolculuğuna katkısından bahsedelim.
Jennifer'ın bahsettiği Unity OpenXR eklentilerinin yanı sıra Google, Android XR platformunda kullanılabilen ek özellikler içeren Unity için Android XR SDK'sını da sunuyor.
Bu SDK'da birçok özellik ve paket bulunuyor. Bu konuşmada Unity için Android XR Uzantısı paketine odaklanacağız.
Dolayısıyla, OpenXR Android XR ve OpenXR Spatial Entities'e benzer şekilde, Unity için Android XR Uzantısı paketi aslında bir OpenXR sağlayıcısıdır.
Bu paketin mimarisi şu şekildedir ve paralel veya bağımsız olarak çalışabilirler.
Bu nedenle, diğer tüm OpenXR sağlayıcıları gibi Google'ın paketi de doğrudan standart OpenXR arayüzü üzerine oluşturulmuştur.
Burada, diğer tüm sağlayıcılarla karşılaştırma yaparak bir dizi özellik gösteriyoruz.
Böylece, birini diğerine ne zaman ve neden tercih edeceğiniz konusunda karar verebilirsiniz.
Bu tabloda gösterilen izlenebilir ve uzamsal varlık işaretçisi hakkında bir sorunuz olabilir.
Şimdi bir ek bilgi verelim: Daha önce Android XR'da uygulama ve deneyim geliştirenler için bu özellikleri, yalnızca Android XR'da çalışan izlenebilir uzantılar aracılığıyla sunduk.
Daha sonra Jennifer'ın da belirttiği gibi, OpenXR açık grubu olarak çalışıp sağ taraftaki Spatial Entities Extension'ı yayınladık ve tutarlı, platformlar arası bir deneyim sunduk.
Şu anda, izlenebilir uzantıyı Spatial Entities çerçevesi lehine kullanımdan kaldırıyoruz.
İkincisi hem çok daha yüksek performanslı hem de platformlar arası destek sunuyor.
Ardından, uzamsal varlıklara daha yakından bakalım.
Jennifer'ın bahsettiği düzlemler, ışın dökümü ve sabitleyicilerin yanı sıra bu özellik, standart 2D barkodları algılayıp kodunu çözebilen ve 3D uzaydaki konumlarını izleyebilen işaretçiler gibi uzamsal varlık sağlayıcılar tarafından da desteklenir. Ayrıca, bilinen 2D grafikleri tanıyıp 3D uzayda izleyebilen görüntüleri de destekler.
Sınırlayıcı kutu ise klavye, dizüstü bilgisayar veya fare gibi fiziksel nesneleri tanımlar ve sınırlayıcı kutularını 3D pozda izler.
Bir sonraki örnekte, Google'ın uzantılar paketi tarafından sağlanan sınırlayıcı kutu özelliğini yapılandıracağız.
Bu görünüm, tüm OpenXR özellikleri için hemen hemen aynıdır.
Bu nedenle, önce Android XR platformuna geçmeniz, ardından OpenXR sağlayıcısını etkinleştirmeniz ve geliştirmek istediğiniz OpenXR özelliğini seçmeniz gerekir. Örneğin, burada uzamsal varlık sınırlayıcı kutu özelliği gösterilmiştir. Ardından proje doğrulama sorunlarını düzeltmeniz gerekir.
Bu sayede, belirli bir özelliğin gerektirdiği tüm bağımlılıkları bulabilir ve ardından birden fazla özelliğin aynı alt sisteme katkıda bulunmasından kaynaklanan çakışmaları çözebilirsiniz.
Bazen, örneğin burada sabitleyici, düzlem veya sınırlayıcı kutu kullanmak istiyorsanız genellikle yalnızca bir özellik seçmeniz gerekir.
Son olarak, örnek sahneyi veya test sahnenizi oluşturabilirsiniz.
Çalışma zamanında izlenebilir nesneye erişmek için AR sınırlayıcı kutu yöneticisi bileşenini ekleyebilirsiniz. Bu bileşen, AR Anchor Manager'a benzer. Ardından, AR Foundation arayüzünü kullanarak nesneye erişebilirsiniz.
Alternatif olarak, başlangıç için uzantı paketimiz tarafından sağlanan uzamsal varlık örneğini şablon olarak da içe aktarabilirsiniz.
Android XR'da AR Foundation özelliğini kullanırken karşılaşacağınız en büyük fark budur.
Uygulamanızın, kullanıcınızın çevresini anlamaya yardımcı olması için genellikle çevredeki hassas verilere erişmesi gerekir.
Android XR, kullanıcıyı korumak için sistemi, yani izinlerin arkasındaki veri erişimini kısıtlar.
Kamera veya konum erişimi gibi normal Android izin çağrılarına aşina olabilirsiniz.
Buradaki en iyi uygulama, yönetici bileşenini başlangıçta devre dışı bırakmaktır. Bunu sağ tarafta gördüğünüz gibi düzenleyiciden veya Awake etkinliği gibi komut dosyasından yapabilirsiniz.
void Awake() {
planeManager = GetComponent<ARPlaneManager>();
planeManager.enabled = false;
boundingBoxManager = GetComponent<ARBoundingBoxManager>();
boundingBoxManager.enabled = false;
permissionUtil = GetComponent<AndroidXRPermissionUtil>();
}
void OnEnable() {
StartCoroutine(WaitForPermissions());
}Gerekli tüm izinleri verdikten sonra, buradaki WaitForPermissions yardımcısının yaptığı gibi yöneticiyi komut dosyasından etkinleştirebilirsiniz.
IEnumerator WaitForPermissions() {
planeManager.enabled = false;
boundingBoxManager.enabled = false;
yield return new WaitUntil(() =>
permissionUtil.AllPermissionGranted());
// Enable after granted permissions and
// restart subsystems.
planeManager.enabled = true;
boundingBoxManager.enabled = true;
// Save permission status.
permissionGranted = true;
}Böylece, yetersiz izin nedeniyle alt sistem başlatma hatası oluşmasını önleyebilirsiniz.
Bu, buradaki özel bir özelliktir.
Jennifer'ın AR Foundation'ı kullanarak sabitleyici hakkında bilgi verdiği gibi, Android XR'da sabitleyici özelliğini genişletmek için paketimiz, paylaşılabilir sabitleyiciler adlı yeni bir özellik de sunuyor.
Bu özellik, AR Foundation sabitleme özelliğinin şu anda desteklediği özellikleri kopyalar ve coğrafi sabitleme gibi bazı ek işlevler de sunar.
Tahmin edebileceğiniz gibi, sabitleyici sanal ve fiziksel dünyayı birbirine bağlayan gerçek köprüdür.
Jennifer bize bunları oluşturma, kaydetme ve yükleme işlemlerini gösterdi ancak tüm bunlar kullanıcınızın Living Room'u gibi yerel bir alanda gerçekleşti.
Peki ya dünyanın geri kalanı?
Bunu birbirimizle nasıl paylaşabiliriz?
Geospatial API tam da bu noktada devreye giriyor.
En sevdiğiniz kitapçı veya büyük bir parktaki buluşma noktası gibi gerçek dünyadaki bir konuma dayalı coğrafi sabitleme oluşturmanıza olanak tanır.
Geospatial API, VPS (sanal konumlandırma sistemi) aracılığıyla size doğru bir coğrafi konum izleyici sunabilir. GPS gibi çalışan bu sistem, çok daha doğru izleme sonuçları sağlamak için dış mekan Street View verilerini kullanır.
ARCore'un coğrafi özelliğini daha önce kullandıysanız bu görünüme aşina olabilirsiniz.
Bu nedenle, Android XR'da Geospatial API'ye erişmek için önce Google Cloud platformunda barındırılan arka uca bağlanmamız gerekir.
Coğrafi arka uç, Google Cloud'daki ARCore hizmeti tarafından desteklendiğinden Google Cloud projenizi ARCore API erişimiyle yapılandırmak için aynı adımı uygulayabilirsiniz.
Tüm bunlar, uzantı paketimiz tarafından sağlanan Android XR Google Cloud özelliğinin kullanılmasını sağlar.
Geospatial API'yi etkinleştirip Google Cloud projesinden API anahtarını aldıktan sonra bu özelliği etkinleştirebilir ve kimlik doğrulamayı OpenXR ayarlar menüsünden yapılandırabilirsiniz. Alternatif olarak, TrySetAuthenticationAsync adlı komut dosyası API'si aracılığıyla manuel olarak da yapılandırabilirsiniz.
async Task TrySetAuthentication() {
googleCloudFeature =
OpenXRSettings.Instance
.GetFeature<XRGoogleCloudFeature>();
var result = await googleCloudFeature
.TrySetAuthenticationAsync(
strategy, credential);
if (result.IsSuccess()) {
// Ready to use for geospatial tracker.
} else if (result.IsUnsupported()) {
// Google Cloud feature is not supported
} else if (result.IsKeylessError()) {
// Confirm if keyless has been set up properly.
} else {
// Handling other common OpenXR errors.
}
}Android XR platformunun şu anda yalnızca API anahtarı kimlik doğrulamasını desteklediğini, ancak gelecekte daha fazla kimlik bilgisi desteği sunulacağını unutmayın.
Kimlik doğrulama işlemini tamamladıktan sonra coğrafi özelliklere erişmek için coğrafi yöneticiyi kullanabilirsiniz.
Entegrasyondan önce VPS kapsamı hakkında Google Haritalar'ı kontrol etmeniz önemle tavsiye edilir.
Bu nedenle, özelliği kullanırken ağ erişiminizin de olması gerekir.
XR Geospatial Manager, AR Foundation tarafından sağlanan AR Session bileşenine benzer şekilde çalışır.
Bu nedenle, sistem desteğini ve coğrafi takip cihazının izleme durumunu belirtmek için statik bir durum özelliğiyle birlikte gelir.
Durum değişikliği etkinliğini aşağıdaki gibi bir geri çağırma işleviyle kaydedebilirsiniz.
void OnGeospatialStateChanged(XRGeospatialStateChangedEventArgs eventArgs) {
bool isInitFailed = eventArgs.CurrState == XRGeospatialState.InitializationFailed;
if (isInitFailed && XRGeospatialManager.InitializationResult.IsCloudAuthError()) {
// Handle cloud authentication issues.
} else if (isInitFailed) {
// Check XRGeospatialManager.InitializationResult for other common OpenXR errors.
} else {
// Iterate runtime state change, and handle accordingly.
}
}
private void OnEnable() {
XRGeospatialManager.OnStateChanged += OnGeospatialStateChanged;
}Coğrafi durum çalışır hale geldikten sonra bu yönetici örneğini aşağıdaki tüm işlevler için kullanabilirsiniz.
Öncelikle, verilen GPS konumuyla VPS kullanılabilirliğini kontrol etmek için Unity'nin location API'sini kullanarak GPS değerini alır ve ardından VPS kullanılabilirliğini kontrol ederiz.
async Task CheckVPSAvailability(CancellationToken token) {
var location = Input.location.lastData;
try {
var result = await geospatialManager.TryCheckVPSAvailabilityAsync(
location.latitude, location.longitude);
token.ThrowIfCancellationRequested();
if (result.status.nativeStatusCode == (int)XrResultAndroid.GeospatialCoordinateInvalid) {
// Invalid coordinates, try with another location.
} else if (result.status.IsError()) {
// Handle common OpenXR error: result.status.ToOpenXRStatus()
} else if (result.value == XRVPSAvailability.Available) {
// You may use this pose to attach geospatial anchors.
var currentGeospatialPose = new XRGeospatialPose(location);
}
}
}Dolayısıyla, VPS desteğini harita üzerinden kontrol etmek istemiyorsanız bu yöntem, harita üzerinden kontrol etmenin yerini alır. Ancak gerçek GPS durumunu kontrol etmek için dışarı çıkmanız gerekir.
Ardından, TryLocate kullanarak Unity pozu ile coğrafi poz arasında dönüşüm yapabilirsiniz.
// Geospatial Pose -> Unity Pose
var geospatialPose =
new XRGeospatialPose(Input.location.lastData);
if (geospatialManager.TryLocate(
geospatialPose, out XRPoseResult result)) {
if (result.IsPositionValid ||
result.IsPositionTracked) {
transform.position = result.Pose.position;
}
if (result.IsRotationValid ||
result.IsRotationTracked) {
transform.rotation = result.Pose.rotation;
}
}// Unity Pose -> Geospatial Pose
Pose pose = new Pose(
transform.position, transform.rotation);
if (geospatialManager.TryLocate(
pose, out XRGeospatialPoseResult result)) {
if (result.IsPositionValid ||
result.IsRotationValid) {
// You may use for anchor attachment.
}
}Ardından, VPS kontrolünden veya poz dönüşümünden elde edilen sonucu kullanarak uzamsal yer işaretini belirli bir coğrafi poza veya arazi ya da çatı gibi bilinen bir yüzey türüne ekleyebilirsiniz.
async void PlaceAnchor(XRGeospatialPose pose) {
try {
Result<ARShareableAnchor> anchorResult;
XRGeospatialSurfaceType typeToPlace = /* Choose your target type */;
if (typeToPlace == XRGeospatialSurfaceType.Default) {
anchorResult = geospatialManager.TryAttachGeospatialAnchor(pose);
} else {
pose.Altitude = 0;
anchorResult = await geospatialManager.TryAttachSurfaceAnchorAsync(typeToPlace, pose);
}
if (anchorResult.status.IsSuccess()) {
// ARShareableAnchorManager will track the anchor and update it.
} else {
// Handle OpenXR failures.
}
}
}Tüm bunları bir araya getirdiğinizde, gerçek dünyayı ön plana çıkaran, gerçekten büyüleyici bir uzamsal deneyim oluşturabilirsiniz.
Bu nedenle, kitlemizi gerçek dünyadaki hedef yere yönlendirmek için buraya bir ok yerleştiriyoruz.
Anladım.
Dolayısıyla, Unity geliştiricilerine sunduğumuz tek paket Android XR SDK değil.
Google'ın Unity için Android XR SDK'sı artık Android XR Interaction Framework ve Android XR Audio paketini de içeriyor.
Android XR SDK'yı daha fazla özellik desteğiyle genişletmek ve daha fazla Spatial Entity eklemek için sabırsızlanıyoruz.
Oturumun sonuna yaklaşıyoruz.
Unity'nin yol haritasını internetten takip ederek gelecekte neler olacağını görebilirsiniz.
Unity'nin yeni nesli Unity 7'nin önümüzdeki yılın başlarında kullanıma sunulacağını unutmayın.
Bu sırada bu araçları deneyebilir ve Karma Gerçeklik şablonunu kullanarak bir proje oluşturabilir veya GitHub'daki AR Foundation örnek projesine göz atabilirsiniz.
Ayrıca Spatial Entity ve Unity paketi desteğimiz hakkında daha fazla bilgi edinmek için Android geliştirici sitesindeki sayfayı ziyaret edebilirsiniz.
Hepinize teşekkür ederim.
Android XR'da AR Foundation ve Spatial Entity ile neler geliştirebileceğinizi görmek için sabırsızlanıyoruz.
async void CreateAnchorAsync(ARAnchorManager manager, Pose pose) {
var result = await manager.TryAddAnchorAsync(pose);
if (result.status.IsError()) {
// handle error
return;
}
var anchor = result.value;
}void RemoveAnchor(ARAnchorManager manager, ARAnchor anchor) {
var result = manager.TryRemoveAnchor(anchor.trackableId);
if (result.status.IsError()) {
// handle error
return;
}
}
void DestroyAnchorComponent(ARAnchor anchor) {
Destroy(anchor);
}async void SaveAnchorAsync(ARAnchorManager manager, ARAnchor anchor) {
var result = await manager.TrySaveAnchorAsync(anchor);
if (result.status.IsError()) {
// handle error
return;
}
// Save this value, then return it as an input parameter
SerializableGuid guid = result.value;
}async void LoadAnchorAsync(ARAnchorManager manager, SerializableGuid guid) {
var result = await manager.TryLoadAnchorAsync(guid);
if (result.status.IsError()) {
// handle error
return;
}
ARAnchor anchor = result.value;
}void Awake() {
planeManager = GetComponent<ARPlaneManager>();
planeManager.enabled = false;
boundingBoxManager = GetComponent<ARBoundingBoxManager>();
boundingBoxManager.enabled = false;
permissionUtil = GetComponent<AndroidXRPermissionUtil>();
}
void OnEnable() {
StartCoroutine(WaitForPermissions());
}IEnumerator WaitForPermissions() {
planeManager.enabled = false;
boundingBoxManager.enabled = false;
yield return new WaitUntil(() =>
permissionUtil.AllPermissionGranted());
// Enable after granted permissions and
// restart subsystems.
planeManager.enabled = true;
boundingBoxManager.enabled = true;
// Save permission status.
permissionGranted = true;
}async Task TrySetAuthentication() {
googleCloudFeature =
OpenXRSettings.Instance
.GetFeature<XRGoogleCloudFeature>();
var result = await googleCloudFeature
.TrySetAuthenticationAsync(
strategy, credential);
if (result.IsSuccess()) {
// Ready to use for geospatial tracker.
} else if (result.IsUnsupported()) {
// Google Cloud feature is not supported
} else if (result.IsKeylessError()) {
// Confirm if keyless has been set up properly.
} else {
// Handling other common OpenXR errors.
}
}void OnGeospatialStateChanged(XRGeospatialStateChangedEventArgs eventArgs) {
bool isInitFailed = eventArgs.CurrState == XRGeospatialState.InitializationFailed;
if (isInitFailed && XRGeospatialManager.InitializationResult.IsCloudAuthError()) {
// Handle cloud authentication issues.
} else if (isInitFailed) {
// Check XRGeospatialManager.InitializationResult for other common OpenXR errors.
} else {
// Iterate runtime state change, and handle accordingly.
}
}
private void OnEnable() {
XRGeospatialManager.OnStateChanged += OnGeospatialStateChanged;
}async Task CheckVPSAvailability(CancellationToken token) {
var location = Input.location.lastData;
try {
var result = await geospatialManager.TryCheckVPSAvailabilityAsync(
location.latitude, location.longitude);
token.ThrowIfCancellationRequested();
if (result.status.nativeStatusCode == (int)XrResultAndroid.GeospatialCoordinateInvalid) {
// Invalid coordinates, try with another location.
} else if (result.status.IsError()) {
// Handle common OpenXR error: result.status.ToOpenXRStatus()
} else if (result.value == XRVPSAvailability.Available) {
// You may use this pose to attach geospatial anchors.
var currentGeospatialPose = new XRGeospatialPose(location);
}
}
}// Geospatial Pose -> Unity Pose
var geospatialPose =
new XRGeospatialPose(Input.location.lastData);
if (geospatialManager.TryLocate(
geospatialPose, out XRPoseResult result)) {
if (result.IsPositionValid ||
result.IsPositionTracked) {
transform.position = result.Pose.position;
}
if (result.IsRotationValid ||
result.IsRotationTracked) {
transform.rotation = result.Pose.rotation;
}
}// Unity Pose -> Geospatial Pose
Pose pose = new Pose(
transform.position, transform.rotation);
if (geospatialManager.TryLocate(
pose, out XRGeospatialPoseResult result)) {
if (result.IsPositionValid ||
result.IsRotationValid) {
// You may use for anchor attachment.
}
}async void PlaceAnchor(XRGeospatialPose pose) {
try {
Result<ARShareableAnchor> anchorResult;
XRGeospatialSurfaceType typeToPlace = /* Choose your target type */;
if (typeToPlace == XRGeospatialSurfaceType.Default) {
anchorResult = geospatialManager.TryAttachGeospatialAnchor(pose);
} else {
pose.Altitude = 0;
anchorResult = await geospatialManager.TryAttachSurfaceAnchorAsync(typeToPlace, pose);
}
if (anchorResult.status.IsSuccess()) {
// ARShareableAnchorManager will track the anchor and update it.
} else {
// Handle OpenXR failures.
}
}
}