Rendszerek koordinálása a Unityben
Windows Mixed Reality számos felületi skálán támogatja az alkalmazásokat, a csak tájolású és a helyalapú alkalmazásoktól kezdve egészen a helyiségméretező alkalmazásokig. A HoloLensen továbbhaladhat, és olyan világszintű alkalmazásokat hozhat létre, amelyek segítségével a felhasználók 5 métert meghaladó sétát tehetnek egy épület teljes emeletén és azon túl.
A Unityben a vegyes valósági élmény kialakításának első lépése a koordinátarendszerek megismerése és az alkalmazás által megcélzott élményskálázás kiválasztása.
Csak tájolású vagy ülő léptékű élmény létrehozása
Névtér:UnityEngine.XR
Típus:XRDevice
A csak tájolású vagy ülő léptékű élmény létrehozásához a Unityt a Helyhez kötött nyomkövetési hely típusára kell állítania. A helyhez kötött nyomkövetési tér beállítja a Unity világkoordináta-rendszerét a helyhez kötött referenciakeret nyomon követésére. A Rögzített nyomkövetési módban a szerkesztőben, közvetlenül a kamera alapértelmezett helye előtt elhelyezett tartalom (előre -Z) megjelenik a felhasználó előtt az alkalmazás indításakor.
XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);
Névtér:UnityEngine.XR
Típus:InputTracking
Ha csak a tájolást szeretné lehetővé tenni , például egy 360 fokos videómegjelenítőt (ahol a pozíciófej frissítése tönkretené az illúziót), beállíthatja az XR-t. InputTracking.disablePositionalTracking értéke igaz:
InputTracking.disablePositionalTracking = true;
Ha ülő szintű élményt szeretne, hogy a felhasználó később újabb helyet adjon az ülő forrásnak, meghívhatja az XR-t. InputTracking.Recenter metódus:
InputTracking.Recenter();
Álló vagy helyiségméretű élmény létrehozása
Névtér:UnityEngine.XR
Típus:XRDevice
Álló vagyhelyiségméretű élményhez a tartalmat a padlóhoz képest kell elhelyeznie. Az első futtatáskor beállított, a felhasználó által definiált padlószintű forrást és opcionális helyiséghatárt jelképező térbeli szakaszt használva a felhasználó padlószintjét kell megadnia.
Annak biztosítása érdekében, hogy a Unity a világszintű koordinátarendszerrel működjön, beállíthatja és tesztelheti, hogy a Unity a RoomScale nyomkövetési helytí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 igaz értéket ad vissza, a Unity sikeresen átváltotta a világkoordináta-rendszerét a referenciaszakasz-keret nyomon követésére.
- Ha a SetTrackingSpaceType hamis értéket ad vissza, a Unity nem tudott átváltani a referencia fáziskeretére, valószínűleg azért, mert a felhasználó nem állított be padlót a környezetében. Bár a hamis visszatérési érték nem gyakori, előfordulhat, hogy a fázis egy másik helyiségben van beállítva, és az eszköz az aktuális helyiségbe kerül anélkül, hogy a felhasználó új szakaszt állítana be.
Ha az alkalmazás sikeresen beállítja a Helyiségskálázás követési terület típusát, az y=0 síkon elhelyezett tartalom megjelenik a padlón. A 0, 0, 0 kezdőpont az a hely lesz, ahol a felhasználó a helyiség beállításakor állt, a -Z pedig azt az előremutató irányt jelöli, amellyel a beállítás során szembesültek.
Namespace:UnityEngine.Experimental.XR
Típus:Határ
A szkriptkódban ezután meghívhatja a TryGetGeometry metódust a UnityEngine.Experimental.XR.Boundary típuson, hogy lekérjen egy határ sokszöget, megadva a TrackedArea határtípusát. Ha a felhasználó meghatároz egy határt (a csúcspontok listájának visszaadása után), nyugodtan biztosíthatja a helyiségméretű élményt a felhasználónak, ahol körbejárhatják a létrehozott jelenetet.
Megjegyzés
A rendszer automatikusan megjeleníti a határt, amikor a felhasználó megközelíti. Az alkalmazásnak nem kell ezt a sokszöget használnia a határ megjelenítéséhez. Azonban dönthet úgy, hogy a jelenetobjektumokat ezzel a határ sokszögdel helyezi el, hogy a felhasználó fizikailag elérhesse 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ágszintű élmény létrehozása
Névtér:UnityEngine.XR.WSA
Típus:WorldAnchor
A HoloLens valódi világszintű élményeihez , amelyek lehetővé teszik, hogy a felhasználók 5 méternél tovább vándorolnak, új technikákra lesz szüksége a helyiségméretű élményekhez használt módszereken túl. Az egyik fő technika, amelyet használni fog, egy térbeli horgony létrehozása a hologramok fürtjének pontosan a fizikai világban való zárolásához, függetlenül attól, hogy a felhasználó milyen messzire kóborolt, majd a későbbi munkamenetekben újra megtalálja ezeket a hologramokat.
A Unityben úgy hozhat létre térbeli horgonyt, hogy hozzáadja a WorldAnchor Unity összetevőt egy GameObject elemhez.
Világhorgony hozzáadása
Világhorgony hozzáadásához hívja meg az AddComponent<WorldAnchor>() elemet a játékobjektumon azzal az átalakítással, amelyet a valós világban szeretne rögzíteni.
WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();
Ennyi az egész! Ez a játékobjektum most a fizikai világ aktuális helyére lesz rögzítve - láthatja, hogy a Unity világkoordinátái az idő múlásával kissé módosulnak, hogy biztosítsák a fizikai igazítást. Az állandóság használatával keresse meg újra 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ágbeli helyre legyen zárolva, és nem kívánja áthelyezni ezt a keretet, akkor egyszerűen meghívhatja a Destroy-et a World Anchor összetevőn.
Destroy(gameObject.GetComponent<WorldAnchor>());
Ha át szeretné helyezni a GameObject ezt a keretet, akkor inkább a DestroyImmediate-ot kell meghívnia.
DestroyImmediate(gameObject.GetComponent<WorldAnchor>());
Világhorgonyzott GameObject áthelyezése
A GameObject-eket nem lehet áthelyezni, amíg a World Anchor rajta van. Ha át kell helyeznie a GameObject ezt a keretet, a következőket kell elvégeznie:
- DestroyImmediate a World Anchor összetevő
- A GameObject áthelyezése
- 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>();
Locatability-változások kezelése
Előfordulhat, hogy a WorldAnchor egy adott időpontban nem található meg 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 helymeghatározó változás kezelésének elmulasztása miatt az objektum nem jelenik meg a megfelelő fizikai helyen a világon.
Ha értesítést szeretne kapni a helyváltozásokról:
- Feliratkozás az OnTrackingChanged eseményre
- Az esemény kezelése
Az OnTrackingChanged esemény akkor lesz meghívva, ha a mögöttes térbeli horgony egy olyan állapot között változik, hogy a hely nem található.
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 találhatók. Ebben az esetben ez a horgony lokált tulajdonsága igaz értékre lesz állítva, amikor az AddComponent<WorldAnchor>() visszaadja. Ennek eredményeképpen az OnTrackingChanged esemény nem aktiválódik. Egy tiszta minta az OnTrackingChanged kezelő meghívása a kezdeti IsLocated állapottal egy horgony csatolása után.
Anchor_OnTrackingChanged(anchor, anchor.isLocated);
Horgonyok megosztása az eszközök között
Az Azure Spatial Anchors használatával tartós felhőhorgonyt hozhat létre egy helyi WorldAnchorból, amelyet az alkalmazás több HoloLens- iOS- és Android-eszközön is megtalálhat. Ha közös térbeli horgonyt oszt meg több eszközön, minden felhasználó ugyanazon a fizikai helyen láthatja a horgonyhoz képest renderelt tartalmat. Ez valós idejű megosztott élményt tesz lehetővé.
Ha meg szeretné kezdeni a megosztott élmények kiépítését a Unityben, próbálja ki az 5 perces Azure Spatial Anchors Unity rövid útmutatót.
Az Azure Spatial Anchors használata után létrehozhat és megkereshet horgonyokat a Unityben.
Következő fejlesztési ellenőrzőpont
Ha a Unity fejlesztési ellenőrzőpont-útját követi, akkor a Mixed Reality alapvető építőelemeinek felfedezésére készül. Innen továbbléphet a következő építőelemre:
Vagy ugorjon Mixed Reality platform képességeire és API-ira:
Bármikor visszatérhet a Unity fejlesztési ellenőrzőpontjaihoz .