Share via


Unity'de yerel yer işareti aktarımları

Azure Spatial Anchors'ı kullanamadığınız durumlarda, yerel yer işareti aktarımları bir HoloLens cihazının ikinci bir HoloLens cihazı tarafından içeri aktarılacak bir yer işareti dışarı aktarmasını sağlar.

Not

Yerel yer işareti aktarımları Azure Spatial Anchors'a göre daha az sağlam yer işareti geri çağırma sağlar ve iOS ve Android cihazlar bu yaklaşım tarafından desteklenmez.

SpatialPerception özelliğini ayarlama

Bir uygulamanın uzamsal tutturucuları aktarması için SpatialPerception özelliğinin etkinleştirilmesi gerekir.

SpatialPerception özelliğini etkinleştirme:

  1. Unity Düzenleyicisi'nde "Yürütücü Ayarları" bölmesini açın (Proje Ayarları > Oynatıcısını Düzenle>)
  2. "Windows Mağazası" sekmesine tıklayın
  3. "Yayımlama Ayarları"nı genişletin ve "Özellikler" listesinde "SpatialPerception" özelliğini denetleyin

Not

Unity projenizi zaten bir Visual Studio çözümüne aktardıysanız, yeni bir klasöre aktarmanız veya bu özelliği Visual Studio'daki AppxManifest'te el ile ayarlamanız gerekir.

Tutturucu Aktarımı

Ad Alanı:UnityEngine.XR.WSA.Sharing
Tür: WorldAnchorTransferBatch

Bir WorldAnchor'u aktarmak için, aktarılacak yer işareti belirlenmelidir. Bir HoloLens kullanıcısı kendi ortamını tarar ve paylaşılan deneyim için yer işareti olacak bir noktayı el ile veya program aracılığıyla seçer. Bu noktayı temsil eden veriler daha sonra seri hale getirilebilir ve deneyimde paylaşımda bulunan diğer cihazlara iletilebilir. Ardından her cihaz yer işareti verilerini seri durumdan çıkararak bu noktayı boşlukta bulmaya çalışır. Yer Işareti Aktarımı'nın çalışması için her cihaz, yer işareti tarafından temsil edilen noktanın tanımlanabilmesi için ortamda yeterince tarama yapmış olmalıdır.

Kurulum

Bu sayfadaki örnek kodun başlatılması gereken birkaç alanı vardır:

  1. GameObject rootGameObject, Unity'de üzerinde WorldAnchor Bileşeni bulunan bir GameObject'tir. Paylaşılan deneyimdeki bir kullanıcı bu GameObject'i yerleştirir ve verileri diğer kullanıcılara aktarır.
  2. WorldAnchor gameRootAnchor, rootGameObject üzerinde bulunan UnityEngine.XR.WSA.WorldAnchor'dır.
  3. byte[] importedData , her istemcinin ağ üzerinden aldığı serileştirilmiş bağlantı için bir bayt dizisidir.
public GameObject rootGameObject;
private UnityEngine.XR.WSA.WorldAnchor gameRootAnchor;

void Start ()
{
    gameRootAnchor = rootGameObject.GetComponent<UnityEngine.XR.WSA.WorldAnchor>();

    if (gameRootAnchor == null)
    {
        gameRootAnchor = rootGameObject.AddComponent<UnityEngine.XR.WSA.WorldAnchor>();
    }
}

Ihracat

Dışarı aktarmak için bir WorldAnchor'a ihtiyacımız var ve bunu alan uygulama için anlamlı olacak şekilde nasıl adlandıracağımızı bilmek istiyoruz. Paylaşılan deneyimdeki bir istemci, paylaşılan tutturucuyu dışarı aktarmak için şu adımları gerçekleştirir:

  1. WorldAnchorTransferBatch oluşturma
  2. Aktarım için WorldAnchors ekleme
  3. Dışarı aktarmayı başlatma
  4. Veriler kullanılabilir hale geldikçe OnExportDataAvailable olayını işleme
  5. OnExportComplete olayını işleme

Ne aktaracağımızı kapsüllemek için bir WorldAnchorTransferBatch oluşturuyoruz ve bunu bayt olarak dışarı aktarıyoruz:

private void ExportGameRootAnchor()
{
    WorldAnchorTransferBatch transferBatch = new WorldAnchorTransferBatch();
    transferBatch.AddWorldAnchor("gameRoot", this.gameRootAnchor);
    WorldAnchorTransferBatch.ExportAsync(transferBatch, OnExportDataAvailable, OnExportComplete);
}

Veriler kullanılabilir hale geldikçe, veri segmentleri kullanılabilir olduğunda baytları istemciye veya arabelleğe gönderin ve istediğiniz şekilde gönderin:

private void OnExportDataAvailable(byte[] data)
{
    TransferDataToClient(data);
}

Dışarı aktarma işlemi tamamlandıktan sonra verileri aktardıysak ve serileştirme başarısız olduysa istemciye verileri atlamasını söyleyin. Serileştirme başarılı olursa, istemciye tüm verilerin aktarıldığını ve içeri aktarmanın başlatabileceğini söyleyin:

private void OnExportComplete(SerializationCompletionReason completionReason)
{
    if (completionReason != SerializationCompletionReason.Succeeded)
    {
        SendExportFailedToClient();
    }
    else
    {
        SendExportSucceededToClient();
    }
}

İçeri aktarma

Gönderenden tüm baytları aldıktan sonra verileri bir WorldAnchorTransferBatch içine geri aktarabilir ve kök oyun nesnemizi aynı fiziksel konuma kilitleyebiliriz. Not: İçeri aktarma bazen geçici olarak başarısız olur ve yeniden denenmesi gerekir:

// This byte array should have been updated over the network from TransferDataToClient
private byte[] importedData;
private int retryCount = 3;

private void ImportRootGameObject()
{
    WorldAnchorTransferBatch.ImportAsync(importedData, OnImportComplete);
}

private void OnImportComplete(SerializationCompletionReason completionReason, WorldAnchorTransferBatch deserializedTransferBatch)
{
    if (completionReason != SerializationCompletionReason.Succeeded)
    {
        Debug.Log("Failed to import: " + completionReason.ToString());
        if (retryCount > 0)
        {
            retryCount--;
            WorldAnchorTransferBatch.ImportAsync(importedData, OnImportComplete);
        }
        return;
    }

    this.gameRootAnchor = deserializedTransferBatch.LockObject("gameRoot", this.rootGameObject);
}

Bir GameObject LockObject çağrısıyla kilitlendikten sonra, bunu dünyadaki aynı fiziksel konumda tutan bir WorldAnchor'a sahip olur, ancak Unity koordinat alanında diğer kullanıcılardan farklı bir konumda olabilir.