Rendszerek koordinálása a Unityben

Windows Mixed Reality alkalmazásokat a felhasználói élmény széles skálájában támogat, a csak tájolású és a helyhez álló alkalmazásoktól a helyiségméretű alkalmazásokon keresztül. A HoloLens olyan, világméretű alkalmazásokat építhet, amelyek segítségével a felhasználók 5 méternél több mint 5 perc alatt felfedezhetik az épület egy teljes emeletét, és azon kívül is.

A vegyes valóságú Unity-élmények kiépítése felé első lépésként meg kell értenie a koordinátarendszereket, és ki kell választania az alkalmazás által megcélzott felhasználói élményt.

Csak tájolási vagy helyméretű felhasználói élmény kiépítése

Névtér:UnityEngine.XR
Típus:XRDevice

A csak tájolású vagy helyhez kötött skálázási élményheza Unityt a Stationary tracking space type (Állomáson belüli követési tér típusa) beállításra kell állítania. A helyhez kötött követési tér beállítja a Unity világi koordinátarendszerét, hogy nyomon kövesse a hivatkozás álló keretét. A Stationary tracking módban a szerkesztőben közvetlenül a kamera alapértelmezett helye előtt elhelyezett tartalom (a továbbítás a -Z) a felhasználó előtt jelenik meg az alkalmazás elindításakor.

XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);

Névtér:UnityEngine.XR
Típus:InputTracking

Ha csak tájolást szeretne, például egy 360 fokos videómegjelenítőt (ahol a pozíció fejének frissítései tönkretennék az látszatot), beállíthatja az XR-t. Az InputTracking.disablePositionalTracking igazra vált:

InputTracking.disablePositionalTracking = true;

A helyhez hívhatjaaz XR-t, hogy a felhasználó később az origóval újabb legyen. InputTracking.Recenter metódus:

InputTracking.Recenter();

Állandó vagy helyiségméretű felhasználói élmény kiépítése

Névtér:UnityEngine.XR
Típus:XRDevice

Állandó vagy helyiségméretű felhasználói élményhez a tartalmat a padlóhoz viszonyítva kell eltennünk. A felhasználó padlóját a térbeli szakasz használatával kell meghozni, amely a felhasználónak az első futtatás során beállított alapszintű eredetét és választható helyiséghatárát jelöli.

Annak biztosításához, hogy a Unity a világ koordinátarendszerével az alapszinten üzemel, beállíthatja és tesztelheti, hogy a Unity a RoomScale követési tértípust használja-e:

if (XRDevice.SetTrackingSpaceType(TrackingSpaceType.RoomScale))
{
    // RoomScale mode was set successfully.  App can now assume that y=0 in Unity world coordinate represents the floor.
}
else
{
    // RoomScale mode was not set successfully.  App cannot make assumptions about where the floor plane is.
}
  • Ha a SetTrackingSpaceType true (igaz) értéket ad vissza, a Unity sikeresen átkapcsolta a világ koordinátarendszerét a referenciaszakasz-képkockák nyomon követéséhez.
  • Ha a SetTrackingSpaceType false (hamis) értéket ad vissza, a Unity nem tudott átválteni a szakasz referenciakeretére, valószínűleg azért, mert a felhasználó nem adott meg padlóburkolatot a környezetében. Bár a hamis visszatérési érték nem gyakori, akkor fordulhat elő, ha a fázis egy másik helyiségben van beállítva, és az eszközt áthelyezik az aktuális helyiségbe anélkül, hogy a felhasználó beállít egy új szakaszt.

Miután az alkalmazás sikeresen beállítja a RoomScale követési terület típusát, az y=0 síkra helyezett tartalom megjelenik a padlóon. A 0, 0, 0 kiindulási hely az a hely, ahol a felhasználó a helyiség beállítása során a felhasználónak volt, ahol a -Z azt az irányt jelképezték, amely felé a beállítás során szembesült.

Névtér:UnityEngine.Experimental.XR
Típus:Határ

A szkriptkódban ezután hívhatja meg a TryGetGeometry metódust a UnityEngine.Experimental.XR.Boundary típuson egy határ sokszög lehívásához, és megadhatja a TrackedArea határtípust. Ha a felhasználó definiált egy határt (a csúcsok listáját kapják vissza), akkor biztonságosan kézbesíthet egy helyiségméretű felhasználói élményt a felhasználónak, ahol végigmehet a létrehozott jeleneten.

Megjegyzés

A rendszer automatikusan rendereli a határt, amikor a felhasználó megközelíti azt. Az alkalmazásnak nem kell ezt a sokszöget használnia a határ megjelenítéséhez. Dönthet azonban úgy, hogy a jelenetobjektumokat ezzel a határvonal-sokszög használatával rendezi el, hogy a felhasználó fizikailag el tudja érni ezeket az objektumokat teleportálás nélkül:

var vertices = new List<Vector3>();
if (UnityEngine.Experimental.XR.Boundary.TryGetGeometry(vertices, Boundary.Type.TrackedArea))
{
    // Lay out your app's content within the boundary polygon, to ensure that users can reach it without teleporting.
}

Világméretű felhasználói élmény kiépítése

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

Az olyan valós világméretű felhasználói élmények HoloLens, amelyek lehetővé teszi, hogy a felhasználók 5 métert is túlnyúlnak, a helyiségméretű élmények esetén használtakon felüli új technikákra lesz szüksége. Az egyik legfontosabb technika, amit használni fog, hogy létrehoz egy térbeli horgonyt, amely pontosan a fizikai világban található hologramfürtök zárolását teszi lehetővé, függetlenül attól, hogy a felhasználó milyen messze barangolt, majd a későbbi munkamenetekben újra megkeresi ezeket ahologramokat.

A Unityben úgy hozhat létre térbeli horgonyt, hogy hozzáadja a WorldAnchor Unity összetevőt egy GameObjecthez.

Világhorgony hozzáadása

Egy világhorgony hozzáadásához hívja meg az AddComponent() hívást a játékobjektumon a valós világba lehorgonyzó átalakítással.

WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

Ennyi az egész! Ez a játékobjektum most már a fizikai világ jelenlegi helyéhez lesz horgonyozva – a Unity-világ koordinátái kis mértékben módosulhatnak, így biztosítva a fizikai igazítást. Az adatmegőrzés használatával újra megkeresi ezt a rögzített helyet egy későbbi alkalmazás-munkamenetben.

Világhorgony eltávolítása

Ha már nem szeretné, hogy a GameObject egy fizikai világ helyhez zárolva ás ne ezt a keretet mozgatja, egyszerűen hívja meg a Destroy (Semmisítés) hívást a World Anchor összetevőn.

Destroy(gameObject.GetComponent<WorldAnchor>());

Ha át szeretné áthelyezni a GameObjectet ebbe a keretbe, ehelyett a DestroyImmediate hívását kell hívnia.

DestroyImmediate(gameObject.GetComponent<WorldAnchor>());

World Anchored GameObject mozgatás

A GameObject objektum nem mozgatható, amíg a World Anchor rajta van. Ha át kell mozgatnia a GameObjectet ebben a keretben, a következőt kell:

  1. DestroyImmediate the World Anchor összetevő
  2. A GameObject áthelyezése
  3. Adjon hozzá egy új World Anchor összetevőt a GameObjecthez.
DestroyImmediate(gameObject.GetComponent<WorldAnchor>());
gameObject.transform.position = new Vector3(0, 0, 2);
WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

A lokálhatóság változásainak kezelése

Előfordulhat, hogy egy WorldAnchor adott időpontban nem elérhető a fizikai világban. Ha ez történik, a Unity nem frissíti a rögzített objektum átalakítását. Ez az alkalmazás futása közben is változhat. A lokálhatóság változásának sikertelensége miatt az objektum nem a megfelelő fizikai helyen jelenik meg a világon.

Értesítést kell kapni a lokálhatóság változásairól:

  1. Feliratkozás az OnTrackingChanged eseményre
  2. Az esemény kezelés

Az OnTrackingChanged esemény akkor lesz meghívva, amikor a mögöttes térbeli horgony a nem elérhető állapot és a nem elérhető állapot között vált.

anchor.OnTrackingChanged += Anchor_OnTrackingChanged;

Ezután kezelje az eseményt:

private void Anchor_OnTrackingChanged(WorldAnchor self, bool located)
{
    // This simply activates/deactivates this object and all children when tracking changes
    self.gameObject.SetActiveRecursively(located);
}

Néha a horgonyok azonnal el vannak ásva. Ebben az esetben a horgony isLocated tulajdonsága true (igaz) lesz, amikor az AddComponent() visszaadja a értéket. Ennek eredményeképpen az OnTrackingChanged esemény nem aktiválódik. Tiszta minta lehet az OnTrackingChanged kezelő hívása a kezdeti IsLocated állapottal a horgony csatolása után.

Anchor_OnTrackingChanged(anchor, anchor.isLocated);

Horgonyok megosztása eszközök között

Az Azure Spatial Anchors egy tartós felhőhorgonyt hozhat létre egy helyi WorldAnchorból, amelyet az alkalmazás ezután több HoloLens iOS- és Android-eszközön is megtalálhat. Ha egy közös térbeli horgonyt oszt meg több eszközön, minden felhasználó láthatja az adott horgonyhoz viszonyítva megjelenített tartalmat ugyanazon a fizikai helyen. Ez valós idejű megosztott élményeket tesz lehetővé.

A megosztott élmények Unityben való használatának elkezdéséhez próbálja ki az 5 perces Azure Spatial Anchors Unity rövid útmutatóit.

Ha már használatban van az Azure Spatial Anchors, létrehozhatja és megkeresheti a horgonyokat a Unityben.

Következő fejlesztési ellenőrzőpont

Ha az általunk kifektetett Unity-fejlesztési ellenőrzőpont-utat követi, akkor a legfontosabb építőelemek Mixed Reality ismerkedik. Innen folytathatja a következő építőelemre:

Vagy ugorjon a Mixed Reality képességekre és API-kra:

Bármikor visszamehet a Unity fejlesztési ellenőrzőpontjaira.

Lásd még: