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:
- A Unity-szerkesztőben nyissa meg a "Lejátszó beállításai" panelt (Project Settings > Player szerkesztése>)
- Kattintson a "Windows Áruház" fülre
- 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:
- 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.
- WorldAnchor gameRootAnchor a UnityEngine.XR.WSA.WorldAnchor, amely a rootGameObject.
- 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:
- WorldAnchorTransferBatch létrehozása
- A WorldAnchors hozzáadása az átvitelhez
- Az exportálás megkezdése
- Az OnExportDataAvailable esemény kezelése az adatok elérhetővé válásakor
- 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ó.