Megosztás a következőn keresztül:


Helyi horgonyátvitelek a Unityben

Olyan helyzetekben, amikor nem használhatja az Azure Spatial Anchorst, a helyi horgonyátvitelek lehetővé teszik, hogy egy HoloLens-eszköz exportáljon egy horgonyt, amelyet egy második HoloLens-eszköz importál.

Feljegyzés

A helyi horgonyátvitelek kevésbé robusztus horgonyvisszahívást biztosítanak, mint az Azure Spatial Anchors, és az iOS- és Android-eszközöket ez a megközelítés nem támogatja.

A SpatialPerception képesség beállítása

Ahhoz, hogy egy alkalmazás térbeli horgonyokat továbbíthasson, engedélyezni kell a SpatialPerception képességet.

A SpatialPerception funkció engedélyezése:

  1. A Unity-szerkesztőben nyissa meg a "Lejátszó beállításai" panelt (Project Settings > Player szerkesztése>)
  2. Kattintson a "Windows Áruház" fülre
  3. Bontsa ki a "Közzétételi beállítások" elemet, és ellenőrizze a "SpatialPerception" képességet a "Képességek" listában

Feljegyzés

Ha már exportálta a Unity-projektet egy Visual Studio-megoldásba, vagy exportálnia kell egy új mappába, vagy manuálisan kell beállítania ezt a képességet a Visual Studióban található AppxManifestben.

Horgonyátvitel

Névtér: UnityEngine.XR.WSA.Sharing
Típus: WorldAnchorTransferBatch

A WorldAnchor átadásához létre kell hozni az átadandó horgonyt. Az egyik HoloLens felhasználója megvizsgálja a környezetét, és manuálisan vagy programozott módon választ ki egy helyet a közös élmény horgonyának. Az e pontot képviselő adatok ezután szerializálhatók és továbbíthatók a felhasználói élményben osztozó többi eszköznek. Minden eszköz ezután szériamentesíti a horgonyadatokat, és megpróbálja megtalálni az adott pontot a térben. Ahhoz, hogy a horgonyátvitel működjön, minden eszköznek elegendő környezetet kell beolvasnia, hogy a horgony által képviselt pont azonosítható legyen.

Beállítás

A mintakód ezen a lapon néhány olyan mezővel rendelkezik, amelyeket inicializálni kell:

  1. A GameObject rootGameObject egy GameObject a Unityben, amelyen egy WorldAnchor-összetevő található. A megosztott felületen egy felhasználó elhelyezi ezt a GameObject-et , és exportálja az adatokat a többi felhasználónak.
  2. WorldAnchor gameRootAnchor a UnityEngine.XR.WSA.WorldAnchor, amely a rootGameObject.
  3. a byte[] importedData egy bájttömb ahhoz a szerializált horgonyhoz, amelyet minden ügyfél a hálózaton keresztül fogad.
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>();
    }
}

Exportáló

Az exportáláshoz csak egy WorldAnchorra van szükségünk, és tudni kell, hogy mi fogjuk úgy hívni, hogy értelme legyen a fogadó alkalmazásnak. A megosztott felület egyik ügyfele végrehajtja az alábbi lépéseket a megosztott horgony exportálásához:

  1. WorldAnchorTransferBatch létrehozása
  2. A WorldAnchors hozzáadása az átvitelhez
  3. Az exportálás megkezdése
  4. Az OnExportDataAvailable esemény kezelése az adatok elérhetővé válásakor
  5. Az OnExportComplete esemény kezelése

Létrehozunk egy WorldAnchorTransferBatchet , amely beágyazza az átvitt adatokat, majd bájtokba exportálja azt:

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

Amikor az adatok elérhetővé válnak, küldje el a bájtokat az ügyfélnek vagy a puffernek, mivel az adatszegmensek elérhetők, és a kívánt módon küldik el:

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

Ha az exportálás befejeződött, az adatok átvitele és a szerializálás sikertelen volt, kérje meg az ügyfelet, hogy dobja el az adatokat. Ha a szerializálás sikeres volt, mondja meg az ügyfélnek, hogy az összes adat átvitele és importálása megkezdődhet:

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

Importálás

Miután megkapta az összes bájtot a feladótól, importálhatjuk az adatokat egy WorldAnchorTransferBatchbe , és zárolhatjuk a gyökérjáték-objektumot ugyanarra a fizikai helyre. Megjegyzés: Az importálás időnként átmeneti sikertelen lesz, és újra kell próbálkozni:

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

Miután a GameObject zárolva lett a LockObject hívással, egy WorldAnchor lesz, amely a világon ugyanabban a fizikai helyzetben fogja tartani, de a Unity koordináta-területén más helyen lehet, mint a többi felhasználó.