MR Bemenet 213: Mozgásvezérlők

Megjegyzés

A Mixed Reality Academy oktatóanyagait a HoloLens (1. generációs) és Mixed Reality modern headsetek szem előtt tartásával tervezték. Ezért fontosnak tartjuk, hogy ezeket az oktatóanyagokat helyben hagyjuk azoknak a fejlesztőknek, akik továbbra is útmutatást keresnek az ilyen eszközök fejlesztéséhez. Ezek az oktatóanyagok nem frissülnek az HoloLens 2 legújabb eszközkészleteivel vagy interakcióival. A támogatott eszközökön továbbra is működni fognak. A HoloLens 2 új oktatóanyag-sorozatot tett közzé.

A mozgásvezérlők a vegyes valóság világában újabb szintet adnak az interaktivitáshoz. A mozgásvezérlőkkel természetesebb módon, a valós fizikai interakciókhoz hasonlóan közvetlenül is kommunikálhatunk az objektumokkal, ami növeli az alkalmazás élményének elmerülését és örömét.

Az MR Input 213-ban egy egyszerű térbeli festési felület létrehozásával vizsgáljuk meg a mozgásvezérlő bemeneti eseményeit. Ezzel az alkalmazással a felhasználók háromdimenziós térbe festhetnek különböző ecsetekkel és színekkel.

Az oktatóanyagban tárgyalt témakörök

MixedReality213 Topic1 MixedReality213 Topic2 MixedReality213 Témakör3
Vezérlő vizualizációja Vezérlő bemeneti eseményei Egyéni vezérlő és felhasználói felület
Ismerje meg, hogyan renderelhet mozgásvezérlő modelleket a Unity játékmódban és futtatókörnyezetben. A gombesemények és alkalmazásuk különböző típusainak megismerése. Megtudhatja, hogyan fedheti át a felhasználói felület elemeit a vezérlő fölé, vagy hogyan szabhatja testre teljesen.

Eszköztámogatás

Tanfolyam HoloLens Modern headsetek
MR Bemenet 213: Mozgásvezérlők ✔️

Előkészületek

Előfeltételek

A modern headsetek telepítési ellenőrzőlistája ezen az oldalon található.

Projektfájlok

  • Töltse le a projekthez szükséges fájlokat, és csomagolja ki a fájlokat az asztalra.

Megjegyzés

Ha a letöltés előtt szeretné áttekinteni a forráskódot, az elérhető a GitHubon.

Unity-beállítás

Célkitűzések

  • A Unity optimalizálása Windows Mixed Reality fejlesztéshez
  • Kamera beállítása Mixed Reality
  • A környezet beállítása

Utasítások

  • Indítsa el a Unityt.

  • Válassza a Megnyitás lehetőséget.

  • Lépjen az asztalra, és keresse meg a korábban nem archivált MixedReality213-master mappát.

  • Kattintson a Mappa kiválasztása lehetőségre.

  • Miután a Unity befejezte a projektfájlok betöltését, láthatja a Unity-szerkesztőt.

  • A Unityben válassza a Fájl > buildelési beállításai lehetőséget.

    MR213_BuildSettings

  • Válassza a Univerzális Windows-platform lehetőséget a Platform listában, majd kattintson a Platformváltás gombra.

  • Céleszköz beállítása bármely eszközre

  • Buildtípus beállítása D3D értékre

  • Az SDK beállítása a Legújabban telepített értékre

  • Unity C#-projektek ellenőrzése

    • Ez lehetővé teszi a Szkriptfájlok módosítását a Visual Studio-projektben a Unity-projekt újraépítése nélkül.
  • Kattintson a Lejátszó beállításai elemre.

  • Az Inspector panelen görgessen le a képernyő aljára

  • Az XR-beállítások területen ellenőrizze, hogy a Virtuális valóság támogatott-e

  • A Virtual Reality SDK-k területen válassza a Windows Mixed Reality

    MR213_XRSettings

  • Zárja be a Build Settings (Buildbeállítások ) ablakot.

Projektstruktúra

Ez az oktatóanyag Mixed Reality Toolkit – Unity eszközt használ. A kiadásokat ezen a lapon találja.

ProjectStructure

A referencia befejezett jelenetei

  • Két befejezett Unity-jelenetet talál a Jelenetek mappában.
    • MixedReality213: Befejezett jelenet egyetlen ecsettel
    • MixedReality213Advanced: Befejezett jelenet a speciális tervezéshez több ecsettel

Új jelenet beállítása az oktatóanyaghoz

  • A Unityben kattintson az Új jelenet fájlba >

  • Fő kamera és irányjelző fény törlése

  • A Projekt panelen keresse meg és húzza az alábbi előtagokat a Hierarchia panelre:

    • Assets/HoloToolkit/Input/Prefabs/MixedRealityCamera
    • Eszközök/AppPrefabs/Environment

    Kamera és környezet

  • A Mixed Reality Toolkitben két kameraelőtag található:

    • MixedRealityCamera.prefab: Csak kamera
    • MixedRealityCameraParent.prefab: Kamera + Teleportáció + Határ
    • Ebben az oktatóanyagban a MixedRealityCamera teleportálási funkció nélküli használatát fogjuk használni. Emiatt egyszerű environment prefab-t adtunk hozzá, amely egy alapszintű padlót tartalmaz, hogy a felhasználó földeltnek érezze magát.
    • A MixedRealityCameraParenttel való teleportálással kapcsolatos további információkért lásd: Speciális tervezés – Teleportáció és mozgáskorlátozás

Skybox beállítása

  • Kattintson az Ablakvilágítási >> beállítások elemre

  • Kattintson a Skybox Anyag mező jobb oldalán lévő körre

  • Írja be a "szürke" szót, és válassza a SkyboxGray (Assets/AppPrefabs/Support/Materials/SkyboxGray.mat) lehetőséget.

    A skybox beállítása

  • A Skybox jelölőnégyzet bejelölésével megtekintheti a hozzárendelt szürke színátmenetes skyboxot

    A skybox kapcsolója

  • A MixedRealityCamera, a Environment és a szürke skybox jelenet így fog kinézni.

    MixedReality213 környezet

  • Kattintson a Fájl > mentési jelenet másként parancsra

  • Mentse a jelenetet a Jelenetek mappába bármilyen névvel

1. fejezet – Vezérlővizualizáció

Célkitűzések

  • Ismerje meg, hogyan renderelhet mozgásvezérlő modelleket a Unity játékmódban és futásidőben.

Windows Mixed Reality animált vezérlőmodellt biztosít a vezérlővizualizációhoz. Az alkalmazásban többféleképpen is megjelenítheti a vezérlők vizualizációját:

  • Alapértelmezett – Alapértelmezett vezérlő használata módosítás nélkül
  • Hibrid – Alapértelmezett vezérlő használata, de egyes elemeinek testreszabása vagy felhasználói felületi összetevők felülírása
  • Csere – Saját, testre szabott 3D modell használata a vezérlőhöz

Ebben a fejezetben megismerkedünk a vezérlő testreszabási példáival.

Utasítások

  • A Projekt panelen írja be a MotionControllers kifejezést a keresőmezőbe. Az Eszközök/HoloToolkit/Input/Prefabs/ területen is megtalálhatja.
  • Húzza a MotionControllers előlapját a Hierarchia panelre.
  • Kattintson a MotionControllers előfabjára a Hierarchia panelen.

MotionControllers prefab

A MotionControllers prefab rendelkezik Egy MotionControllerVisualizer szkripttel, amely az alternatív vezérlőmodellek tárolóhelyeit biztosítja. Ha saját egyéni térhatású modelleket rendel hozzá, például egy kezet vagy egy kardot, és bejelöli a "Mindig alternatív bal/jobb modell használata" jelölőnégyzetet, akkor az alapértelmezett modell helyett azokat fogja látni. Ezt a 4. fejezetben található pontot fogjuk használni a vezérlőmodell ecsettel történő cseréjéhez.

MR213_ControllerVisualizer

Utasítások

  • Az Inspector panelen kattintson duplán a MotionControllerVisualizer szkriptre a kód Visual Studióban való megtekintéséhez

MotionControllerVisualizer szkript

A MotionControllerVisualizer és a MotionControllerInfo osztályok biztosítják a hozzáférést & módosíthatják az alapértelmezett vezérlőmodelleket. A MotionControllerVisualizer feliratkozik a Unity InteractionSourceDetected eseményére, és automatikusan példányosítja a vezérlőmodelleket, amikor azok megtalálhatók.

protected override void Awake()
{
    ...
    InteractionManager.InteractionSourceDetected += InteractionManager_InteractionSourceDetected;
    InteractionManager.InteractionSourceLost += InteractionManager_InteractionSourceLost;
    ...
}

A vezérlőmodellek a glTF specifikációjának megfelelően vannak kézbesítve. Ezt a formátumot úgy hozták létre, hogy közös formátumot biztosítson, miközben javítja a 3D-eszközök átvitele és kicsomagolása mögötti folyamatot. Ebben az esetben le kell kérnünk és be kell töltenünk a vezérlőmodelleket futtatókörnyezetben, mivel azt szeretnénk, hogy a felhasználói élmény a lehető leggördülékenyebbé legyen, és nem garantált, hogy a mozgásvezérlők melyik verzióját használja a felhasználó. Ez a kurzus a Mixed Reality Eszközkészleten keresztül a Khronos-csoport UnityGLTF projektjének egy verzióját használja.

A vezérlő kézbesítése után a szkriptek a MotionControllerInfo segítségével megkereshetik az egyes vezérlőelemek átalakítóit, hogy megfelelően pozicionálhassák magukat.

Egy későbbi fejezetben megtanuljuk, hogyan használhatja ezeket a szkripteket a felhasználói felület elemeinek a vezérlőkhöz való csatolásához.

Egyes szkriptekben #if! UNITY_EDITOR vagy UNITY_WSA. Ezek a kódblokkok csak az UWP-futtatókörnyezetben futnak, amikor windowsos üzembe helyezést végez. Ennek az az oka, hogy a Unity-szerkesztő és az UWP-alkalmazás futtatókörnyezete által használt API-k halmaza eltérő.

  • Mentse a jelenetet, és kattintson a lejátszás gombra.

A jelenetet mozgásvezérlőkkel láthatja a headsetben. Részletes animációkat láthat a gombkattintásokhoz, a hüvelykujj mozgásához és az érintőpad érintéses kiemeléséhez.

MR213_Controller vizualizáció alapértelmezett

2. fejezet – Felhasználói felületi elemek csatolása a vezérlőhöz

Célkitűzések

  • A mozgásvezérlők elemeinek megismerése
  • Megtudhatja, hogyan csatolhat objektumokat a vezérlők adott részeihez

Ebben a fejezetben megtudhatja, hogyan adhat hozzá felhasználói felületi elemeket a vezérlőhöz, amelyeket a felhasználó bármikor könnyen elérhet és kezelhet. Azt is megtudhatja, hogyan adhat hozzá egy egyszerű színválasztó felhasználói felületet az érintőpad bemenetével.

Utasítások

  • A Projekt panelen keressen rá a MotionControllerInfo szkriptre.
  • A keresési eredményben kattintson duplán a MotionControllerInfo szkriptre a kód Visual Studióban való megtekintéséhez.

MotionControllerInfo szkript

Az első lépés annak a vezérlőnek a kiválasztása, amelyhez a felhasználói felületet csatolni szeretné. Ezeket az elemeket a ControllerElementEnum a MotionControllerInfo.cs fájlban definiálja.

MR213 MotionControllerElements

  • Kezdőlap
  • Menü
  • Megérteni
  • Hüvelykujj
  • Kiválasztás
  • Touchpad
  • Mutató póz – ez az elem a vezérlő csúcsát jelöli, amely előrefelé mutat.

Utasítások

  • A Projekt panelen keressen rá az AttachToController szkriptre.
  • A keresési eredményben kattintson duplán az AttachToController szkriptre a kód Visual Studióban való megtekintéséhez.

AttachToController-szkript

Az AttachToController szkripttel egyszerűen csatolhat objektumokat egy adott vezérlőkkezességhez és elemhez.

Az AttachElementToController()-ben,

  • A kézhasználat ellenőrzése a MotionControllerInfo.Handedness használatával
  • A vezérlő adott elemének lekérése a MotionControllerInfo.TryGetElement() használatával
  • Miután lekérte az elem átalakítóját a vezérlőmodellből, helyezze alá az objektumot, és állítsa az objektum helyi pozícióját & forgatást nullára.
public MotionControllerInfo.ControllerElementEnum Element { get { return element; } }

private void AttachElementToController(MotionControllerInfo newController)
{
     if (!IsAttached && newController.Handedness == handedness)
     {
          if (!newController.TryGetElement(element, out elementTransform))
          {
               Debug.LogError("Unable to find element of type " + element + " under controller " + newController.ControllerParent.name + "; not attaching.");
               return;
          }

          controller = newController;

          SetChildrenActive(true);

          // Parent ourselves under the element and set our offsets
          transform.parent = elementTransform;
          transform.localPosition = positionOffset;
          transform.localEulerAngles = rotationOffset;
          if (setScaleOnAttach)
          {
               transform.localScale = scale;
          }

          // Announce that we're attached
          OnAttachToController();
          IsAttached = true;
     }
}

Az AttachToController szkript használatának legegyszerűbb módja az öröklődés, ahogy a ColorPickerWheel esetében is tettük. Egyszerűen felülbírálja az OnAttachToController és az OnDetachFromController függvényt a beállítás/lebontás végrehajtásához, amikor a vezérlő észleli vagy leválasztja a kapcsolatot.

Utasítások

  • A Projekt panelen írja be a ColorPickerWheel keresőmezőbe. Az Eszközök/AppPrefabs/ területen is megtalálhatja.
  • Húzza a ColorPickerWheel előfabját a Hierarchia panelre.
  • Kattintson a ColorPickerWheel előfabjára a Hierarchia panelen.
  • Az Inspector panelen kattintson duplán a ColorPickerWheel Script elemre a kód Visual Studióban való megtekintéséhez.

ColorPickerWheel előfab

ColorPickerWheel szkript

Mivel a ColorPickerWheel örökli az AttachToControllert, az Inspectorpanelen a Kézitás és elem látható. A felhasználói felületet a bal oldali vezérlő Touchpad eleméhez csatoljuk.

ColorPickerWheel szkript

A ColorPickerWheel felülbírálja az OnAttachToControllert és az OnDetachFromControllert , hogy feliratkozzon a bemeneti eseményre, amelyet a következő fejezetben fog használni az érintőpárnával történő színkiválasztáshoz.

public class ColorPickerWheel : AttachToController, IPointerTarget
{
    protected override void OnAttachToController()
    {
        // Subscribe to input now that we're parented under the controller
        InteractionManager.InteractionSourceUpdated += InteractionSourceUpdated;
    }

    protected override void OnDetachFromController()
    {
        Visible = false;

        // Unsubscribe from input now that we've detached from the controller
        InteractionManager.InteractionSourceUpdated -= InteractionSourceUpdated;
    }
    ...
}
  • Mentse a jelenetet, és kattintson a lejátszás gombra.

Alternatív módszer objektumok vezérlőkhöz való csatolásához

Javasoljuk, hogy a szkriptek örökölje az AttachToControllert , és felülbírálják az OnAttachToControllert. Ez azonban nem mindig lehetséges. Egy másik lehetőség az, hogy önálló összetevőként használja. Ez akkor lehet hasznos, ha meglévő előfabokat szeretne egy vezérlőhöz csatolni a szkriptek újrabontása nélkül. Egyszerűen várja meg az osztályt, hogy az IsAttached értéke igaz legyen, mielőtt bármilyen beállítást végrehajt. Ennek legegyszerűbb módja a "Start" coroutine használata.

private IEnumerator Start() {
    AttachToController attach = gameObject.GetComponent<AttachToController>();

    while (!attach.IsAttached) {
        yield return null;
    }

    // Perform setup here
}

3. fejezet – Érintőpad bemenet használata

Célkitűzések

  • Megtudhatja, hogyan szerezhet be érintőpárnával bevitt adateseményeket
  • Megtudhatja, hogyan használhatja az érintőpárnák tengelyének pozícióadatait az alkalmazásélményhez

Utasítások

  • A Hierarchia panelen kattintson a ColorPickerWheel elemre.
  • Az Inspector panel Animator területén kattintson duplán a ColorPickerWheelController elemre.
  • Ekkor megnyílik az Animator lap

Felhasználói felület megjelenítése/elrejtése a Unity Animáció vezérlőjével

A ColorPickerWheel felhasználói felület animációval való megjelenítéséhez és elrejtéséhez a Unity animációs rendszerét használjuk. A ColorPickerWheelVisible tulajdonságának beállítása igaz vagy hamis eseményindítókra Animációs eseményindítók megjelenítése és elrejtése . A Megjelenítés és elrejtés paraméterek a ColorPickerWheelController animációs vezérlőben vannak definiálva.

Unity Animation Controller

Utasítások

  • A Hierarchia panelen válassza a ColorPickerWheel prefab lehetőséget
  • Az Inspector panelen kattintson duplán a ColorPickerWheel szkriptre a kód Visual Studióban való megtekintéséhez

ColorPickerWheel szkript

A ColorPickerWheel feliratkozik a Unity InteractionSourceUpdated eseményére az érintőpadesemények figyeléséhez.

Az InteractionSourceUpdated()-ban a szkript először ellenőrzi, hogy a következő:

  • valójában egy érintőpadesemény (obj.state).touchpadTouched)
  • a bal oldali vezérlőből (obj.state.source) származik.kézitás)

Ha mindkettő igaz, az érintőpárna pozíciója (obj.state).touchpadPosition) a selectorPosition elemhez van rendelve.

private void InteractionSourceUpdated(InteractionSourceUpdatedEventArgs obj)
{
    if (obj.state.source.handedness == handedness && obj.state.touchpadTouched)
    {
        Visible = true;
        selectorPosition = obj.state.touchpadPosition;
    }
}

Az Update()-ben a látható tulajdonság alapján aktiválja az animációs eseményindítók megjelenítése és elrejtése a színválasztó animátor összetevőjében

if (visible != visibleLastFrame)
{
    if (visible)
    {
        animator.SetTrigger("Show");
    }
    else
    {
        animator.SetTrigger("Hide");
    }
}

Az Update()-ben a selectorPosition a színkerék hálóütköztetőjéhez ad egy sugarat, amely UV-pozíciót ad vissza. Ez a pozíció ezután a színkerék anyagmintája képpontkoordináta- és színértékének megkeresésére használható. Ez az érték más szkriptek számára is elérhető a SelectedColor tulajdonságon keresztül.

Színválasztó kerék raycasting

...
    // Clamp selector position to a radius of 1
    Vector3 localPosition = new Vector3(selectorPosition.x * inputScale, 0.15f, selectorPosition.y * inputScale);
    if (localPosition.magnitude > 1)
    {
        localPosition = localPosition.normalized;
    }
    selectorTransform.localPosition = localPosition;

    // Raycast the wheel mesh and get its UV coordinates
    Vector3 raycastStart = selectorTransform.position + selectorTransform.up * 0.15f;
    RaycastHit hit;
    Debug.DrawLine(raycastStart, raycastStart - (selectorTransform.up * 0.25f));

    if (Physics.Raycast(raycastStart, -selectorTransform.up, out hit, 0.25f, 1 << colorWheelObject.layer, QueryTriggerInteraction.Ignore))
    {
        // Get pixel from the color wheel texture using UV coordinates
        Vector2 uv = hit.textureCoord;
        int pixelX = Mathf.FloorToInt(colorWheelTexture.width * uv.x);
        int pixelY = Mathf.FloorToInt(colorWheelTexture.height * uv.y);
        selectedColor = colorWheelTexture.GetPixel(pixelX, pixelY);
        selectedColor.a = 1f;
    }
    // Set the selector's color and blend it with white to make it visible on top of the wheel
    selectorRenderer.material.color = Color.Lerp (selectedColor, Color.white, 0.5f);
}

4. fejezet – Vezérlőmodell felülírása

Célkitűzések

  • Megtudhatja, hogyan bírálhatja felül a vezérlőmodellt egy egyéni 3D modellel.

MR213_BrushToolOverride

Utasítások

  • Kattintson a Hierarchia panel MotionControllers elemére.
  • Kattintson az Alternatív jobb oldali vezérlő mező jobb oldalán lévő körre.
  • Írja be a "BrushController" kifejezést, és válassza ki az előfabot az eredményből. Az Eszközök/AppPrefabs/BrushController területen található.
  • Ellenőrizze , hogy mindig használ-e alternatív jobb modellt

MR213_BrushToolOverrideSlot

A BrushController-előfabnak nem kell szerepelnie a Hierarchia panelen. A gyermekösszetevők megtekintéséhez azonban:

  • A Projekt panelen írja be a BrushController kifejezést, és húzza a BrushController előfabját a Hierarchia panelre.

MR213_BrushTool_Prefab2

A Tipp összetevőt a BrushControllerben találja. Az átalakítást a rajzvonalak elindításához/leállításához fogjuk használni.

  • Törölje a BrushControllert a Hierarchia panelről.
  • Mentse a jelenetet, és kattintson a lejátszás gombra. Láthatja, hogy az ecsetmodell lecserélte a jobb oldali mozgásvezérlőt.

5. fejezet – Festés select bemenettel

Célkitűzések

  • Megtudhatja, hogyan indíthat el és állíthat le vonalrajzot a Kiválasztás gombesemény használatával

Utasítások

  • Keresse meg a BrushController előfabját a Projekt panelen.
  • Az Inspector panelen kattintson duplán a BrushController-szkript elemre a kód Visual Studióban való megtekintéséhez

BrushController-szkript

A BrushController feliratkozik az InteractionManager InteractionSourcePressed és InteractionSourceReleased eseményeire. Az InteractionSourcePressed esemény aktiválásakor az ecset Rajz tulajdonsága igaz értékre van állítva; Az InteractionSourceReleased esemény aktiválásakor az ecset Rajz tulajdonsága hamis értékre van állítva.

private void InteractionSourcePressed(InteractionSourcePressedEventArgs obj)
{
    if (obj.state.source.handedness == InteractionSourceHandedness.Right && obj.pressType == InteractionSourcePressType.Select)
    {
        Draw = true;
    }
}

private void InteractionSourceReleased(InteractionSourceReleasedEventArgs obj)
{
    if (obj.state.source.handedness == InteractionSourceHandedness.Right && obj.pressType == InteractionSourcePressType.Select)
    {
        Draw = false;
    }
}

Míg a Draw értéke igaz, az ecset pontokat hoz létre egy példányosított Unity LineRendererben. Az előfabra mutató hivatkozás az ecset Stroke Prefab mezőjében található.

private IEnumerator DrawOverTime()
{
    // Get the position of the tip
    Vector3 lastPointPosition = tip.position;

    ...

    // Create a new brush stroke
    GameObject newStroke = Instantiate(strokePrefab);
    LineRenderer line = newStroke.GetComponent<LineRenderer>();
    newStroke.transform.position = startPosition;
    line.SetPosition(0, tip.position);
    float initialWidth = line.widthMultiplier;

    // Generate points in an instantiated Unity LineRenderer
    while (draw)
    {
        // Move the last point to the draw point position
        line.SetPosition(line.positionCount - 1, tip.position);
        line.material.color = colorPicker.SelectedColor;
        brushRenderer.material.color = colorPicker.SelectedColor;
        lastPointAddedTime = Time.unscaledTime;
        // Adjust the width between 1x and 2x width based on strength of trigger pull
        line.widthMultiplier = Mathf.Lerp(initialWidth, initialWidth * 2, width);

        if (Vector3.Distance(lastPointPosition, tip.position) > minPositionDelta || Time.unscaledTime > lastPointAddedTime + maxTimeDelta)
        {
            // Spawn a new point
            lastPointAddedTime = Time.unscaledTime;
            lastPointPosition = tip.position;
            line.positionCount += 1;
            line.SetPosition(line.positionCount - 1, lastPointPosition);
        }
        yield return null;
    }
}

A színválasztó kerék felhasználói felületéről kiválasztott szín használatához a BrushControllernek hivatkoznia kell a ColorPickerWheel objektumra. Mivel a BrushController-előfab a futtatókörnyezetben helyettesítő vezérlőként van példányosítva, a jelenetben lévő objektumokra mutató hivatkozásokat futásidőben kell beállítani. Ebben az esetben a GameObject.FindObjectOfType parancsot használjuk a ColorPickerWheel megkereséséhez:

private void OnEnable()
{
    // Locate the ColorPickerWheel
    colorPicker = FindObjectOfType<ColorPickerWheel>();

    // Assign currently selected color to the brush’s material color
    brushRenderer.material.color = colorPicker.SelectedColor;
    ...
}
  • Mentse a jelenetet, és kattintson a lejátszás gombra. A vonalakat és a festéket a jobb oldali vezérlő kiválasztás gombjára kattintva rajzolhatja meg.

6. fejezet – Objektum ívása select bemenettel

Célkitűzések

  • Megtudhatja, hogyan használhatja a Select and Grasp gomb bemeneti eseményeit
  • Megtudhatja, hogyan példányosíthat objektumokat

Utasítások

  • A Projekt panelen írja be az ObjectSpawner kifejezést a keresőmezőbe. Az Eszközök/AppPrefabs/ területen is megtalálhatja

  • Húzza az ObjectSpawner előfabját a Hierarchia panelre.

  • Kattintson az ObjectSpawner elemre a Hierarchia panelen.

  • Az ObjectSpawner egy Color Source (Színforrás) nevű mezővel rendelkezik.

  • A Hierarchia panelen húzza a ColorPickerWheel hivatkozást ebbe a mezőbe.

    Objektum ívófelügyelője

  • Kattintson az ObjectSpawner előfabjára a Hierarchia panelen.

  • Az Inspector panelen kattintson duplán az ObjectSpawner Script elemre a kód Visual Studióban való megtekintéséhez.

ObjectSpawner-szkript

Az ObjectSpawner egy primitív háló (kocka, gömb, henger) másolatait példányosítja a térbe. Az InteractionSourcePressed észlelésekor ellenőrzi a kézképességet, és hogy interactionSourcePressType.Grasp vagy InteractionSourcePressType.Select eseményről van-e szó.

Egy Grasp-esemény esetében növeli az aktuális hálótípus (gömb, kocka, henger) indexét.

private void InteractionSourcePressed(InteractionSourcePressedEventArgs obj)
{
    // Check handedness, see if it is left controller
    if (obj.state.source.handedness == handedness)
    {
        switch (obj.pressType)
        {
            // If it is Select button event, spawn object
            case InteractionSourcePressType.Select:
                if (state == StateEnum.Idle)
                {
                    // We've pressed the grasp - enter spawning state
                    state = StateEnum.Spawning;
                    SpawnObject();
                }
                break;

            // If it is Grasp button event
            case InteractionSourcePressType.Grasp:

                // Increment the index of current mesh type (sphere, cube, cylinder)
                meshIndex++;
                if (meshIndex >= NumAvailableMeshes)
                {
                    meshIndex = 0;
                }
                break;

            default:
                break;
        }
    }
}

Select esemény esetén a SpawnObject()-ben egy új objektum példányosítva, szülő nélkül és a világra kerül.

private void SpawnObject()
{
    // Instantiate the spawned object
    GameObject newObject = Instantiate(displayObject.gameObject, spawnParent);
    // Detach the newly spawned object
    newObject.transform.parent = null;
    // Reset the scale transform to 1
    scaleParent.localScale = Vector3.one;
    // Set its material color so its material gets instantiated
    newObject.GetComponent<Renderer>().material.color = colorSource.SelectedColor;
}

Az ObjectSpawner a ColorPickerWheel használatával állítja be a megjelenítési objektum anyagának színét. Az ívott objektumok ennek az anyagnak egy példányát kapják, így megőrzik a színüket.

  • Mentse a jelenetet, és kattintson a lejátszás gombra.

A Select (Kijelölés) gombbal módosíthatja az objektumokat a Fogd meg gombot, és ívajon objektumokat.

Alkalmazás létrehozása és üzembe helyezése Mixed Reality Portalon

  • A Unityben válassza a Fájl > buildelési beállításai lehetőséget.
  • Kattintson a Nyitott jelenetek hozzáadása elemre az aktuális jelenet buildben való hozzáadásához.
  • Kattintson a Build (Build) gombra.
  • Hozzon létre egy "App" nevű új mappát .
  • Kattintson egyetlen kattintással az Alkalmazás mappára.
  • Kattintson a Mappa kiválasztása lehetőségre.
  • Amikor a Unity elkészült, megjelenik egy Fájlkezelő ablak.
  • Nyissa meg az Alkalmazás mappát.
  • Kattintson duplán a YourSceneName.sln Visual Studio Solution fájlra.
  • A Visual Studio felső eszköztárának használatával módosítsa a célértéket Hibakeresésről Kiadásra , ARM-ről X64-esre.
  • Kattintson az Eszköz gomb melletti legördülő nyílra, és válassza a Helyi gép lehetőséget.
  • Kattintson a Hibakeresés –> Start Hibakeresés nélkül parancsra a menüben, vagy nyomja le a Ctrl + F5 billentyűkombinációt.

Az alkalmazás most már Mixed Reality Portalon lett létrehozva és telepítve. A start menüben újra elindíthatja Mixed Reality Portálon.

Speciális tervezés – Ecseteszközök radiális elrendezéssel

MixedReality213 Fő

Ebben a fejezetben megtudhatja, hogyan cserélheti le az alapértelmezett mozgásvezérlő modellt egy egyéni ecseteszköz-gyűjteményre. Referenciaként megtalálhatja a MixedReality213 Befejezett jelenetet a Jelenetek mappában.

Utasítások

  • A Projekt panelen írja be a BrushSelector kifejezést a keresőmezőbe. Az Eszközök/AppPrefabs/ területen is megtalálhatja

  • Húzza a BrushSelector előfabját a Hierarchia panelre.

  • A szervezet számára hozzon létre egy üres GameObject-et Ecsetek néven

  • A Projekt panelről a Következő előfabsok húzása ecsetekbe

    • Eszközök/AppPrefabs/BrushFat
    • Eszközök/AppPrefabs/BrushThin
    • Eszközök/AppPrefabs/Radír
    • Eszközök/AppPrefabs/MarkerFat
    • Eszközök/AppPrefabs/MarkerThin
    • Eszközök/AppPrefabs/Pencil

    Ecsetek

  • Kattintson a Hierarchia panel MotionControllers prefab elemére.

  • Az Inspector (Vizsgáló) panelen törölje a jelölést a Mindig használjon alternatív jobb modellt jelölőnégyzetből a Motion Controller Visualizeren

  • A Hierarchia panelen kattintson az Ecsetkijelölő elemre

  • A BrushSelector egy ColorPicker nevű mezőt tartalmaz

  • A Hierarchia panelről húzza a ColorPickerWheel mezőt az Inspector panel ColorPicker mezőjébe.

    ColorPickerWheel hozzárendelése ecsetválasztóhoz

  • A Hierarchia panel BrushSelector prefab területén válassza ki a Menü objektumot.

  • Az Inspector panel LineObjectCollection összetevője alatt nyissa meg az Objects tömb legördülő listát. 6 üres tárolóhelyet fog látni.

  • A Hierarchia panelen húzza a Brushes GameObject alatt szülő előtagokat ezekbe a pontokba bármilyen sorrendben. (Győződjön meg arról, hogy az előfabsokat a helyszínről húzza, nem pedig a projektmappában lévő előtagokat.)

Kefeválasztó

BrushSelector prefab

Mivel a BrushSelector az AttachToControllert örökli, az Inspectorpanelen látható aKkreditás és elembeállítások. A Jobbra és a Mutató pózt választottuk, hogy az ecseteszközöket előre irányban csatoljuk a jobb oldali vezérlőhöz.

A BrushSelector két segédprogramot használ:

  • Ellipszis: pontok létrehozására szolgál a három pont alakú tér mentén.
  • LineObjectCollection: az objektumokat bármely Line osztály által létrehozott pontok (pl. Ellipszis) használatával osztja el. Ezt fogjuk használni az ecsetek három pont alakú mentén való elhelyezéséhez.

Kombinálva ezek a segédprogramok tárcsamenü létrehozásához használhatók.

LineObjectCollection szkript

A LineObjectCollection vezérlőkkel rendelkezik a vonal mentén elosztott objektumok méretére, helyzetére és elforgatására. Ez olyan tárcsamenük létrehozásához hasznos, mint az ecsetválasztó. A semmiből felskálázó ecsetek megjelenésének létrehozásához, amikor megközelítik a középre kiválasztott pozíciót, az ObjectScale görbe középen csúcsosodik, a széleken pedig kúpos lesz.

BrushSelector-szkript

A BrushSelector esetében a procedurális animációt választottuk. Először az ecsetmodelleket három pontban osztja el a LineObjectCollection szkript. Ezután minden ecset felelős azért, hogy megtartsa a felhasználó kezében lévő pozícióját a DisplayMode értéke alapján, amely a kijelölés alapján változik. Azért választottunk eljárási megközelítést, mert nagy valószínűséggel megszakadnak az ecsetpozíció-áttűnések, amikor a felhasználó kiválasztja az ecseteket. A Mecanim animációk szabályosan képesek kezelni a megszakításokat, de általában bonyolultabbak, mint egy egyszerű Lerp-művelet.

A BrushSelector a kettő kombinációját használja. Ha érintőképernyős bemenetet észlel, az ecset beállításai láthatóvá válnak, és felskálázhatók a tárcsamenü mentén. Egy időtúllépési időszak után (amely azt jelzi, hogy a felhasználó kiválasztotta) az ecset beállításai ismét leskálázhatók, és csak a kijelölt ecset marad.

Érintőpárnával bevitt adatok vizualizációja

Még akkor is hasznos lehet az eredeti modell bemeneteinek megjelenítése, ha a vezérlőmodellt teljesen lecserélték. Ez segít a felhasználó műveleteinek a valóságban történő megalapozásában. A BrushSelector esetében úgy döntöttünk, hogy az érintőpárnát rövid ideig láthatóvá tesszük a bemenet fogadásakor. Ez úgy történt, hogy lekérte a Touchpad elemet a vezérlőből, az anyagát egy egyéni anyagra cserélte, majd színátmenetet alkalmazott az anyag színére az érintőpárnával történő legutóbbi bemenet beérkezése alapján.

protected override void OnAttachToController()
{
    // Turn off the default controller's renderers
    controller.SetRenderersVisible(false);

    // Get the touchpad and assign our custom material to it
    Transform touchpad;
    if (controller.TryGetElement(MotionControllerInfo.ControllerElementEnum.Touchpad, out touchpad))
    {
        touchpadRenderer = touchpad.GetComponentInChildren<MeshRenderer>();
        originalTouchpadMaterial = touchpadRenderer.material;
        touchpadRenderer.material = touchpadMaterial;
        touchpadRenderer.enabled = true;
    }

    // Subscribe to input now that we're parented under the controller
    InteractionManager.InteractionSourceUpdated += InteractionSourceUpdated;
}

private void Update()
{
    ...
    // Update our touchpad material
    Color glowColor = touchpadColor.Evaluate((Time.unscaledTime - touchpadTouchTime) / touchpadGlowLossTime);
    touchpadMaterial.SetColor("_EmissionColor", glowColor);
    touchpadMaterial.SetColor("_Color", glowColor);
    ...
}

Ecset eszköz kiválasztása érintőpárnával

Amikor a kefeválasztó észleli az érintőpad megnyomott bemenetét, ellenőrzi a bemenet pozícióját annak megállapításához, hogy balra vagy jobbra volt-e.

Ecsetvonás vastagsága a selectPressedAmount billentyűvel

Az InteractionSourcePressType.Select esemény helyett az InteractionSourcePressed()-ben a lenyomott mennyiség analóg értékét a selectPressedAmount paranccsal szerezheti be. Ez az érték az InteractionSourceUpdated()-ben kérhető le.

private void InteractionSourceUpdated(InteractionSourceUpdatedEventArgs obj)
{
    if (obj.state.source.handedness == handedness)
    {
        if (obj.state.touchpadPressed)
        {
            // Check which side we clicked
            if (obj.state.touchpadPosition.x < 0)
            {
                currentAction = SwipeEnum.Left;
            }
            else
            {
                currentAction = SwipeEnum.Right;
            }

            // Ping the touchpad material so it gets bright
            touchpadTouchTime = Time.unscaledTime;
        }

        if (activeBrush != null)
        {
            // If the pressed amount is greater than our threshold, draw
            if (obj.state.selectPressedAmount >= selectPressedDrawThreshold)
            {
                activeBrush.Draw = true;
                activeBrush.Width = ProcessSelectPressedAmount(obj.state.selectPressedAmount);
            }
            else
            {
                // Otherwise, stop drawing
                activeBrush.Draw = false;
                selectPressedSmooth = 0f;
            }
        }
    }
}

Radírszkript

A Radír egy speciális ecsettípus, amely felülbírálja az alap ecsetDrawOverTime() függvényét. Míg a Rajzolás igaz, a radír ellenőrzi, hogy a csúcsa metszi-e a meglévő ecsetvonásokat. Ha igen, a rendszer hozzáadja őket egy üzenetsorhoz, hogy azok le legyenek zsugorodva és törölve legyenek.

Fejlett tervezés – Teleportálás és mozgásterelés

Ha engedélyezni szeretné a felhasználónak, hogy teleportálással mozogjon a jelenetben a hüvelykujjával, használja a MixedRealityCameraParent parancsot a MixedRealityCamera helyett. Az InputManagert és a DefaultCursort is hozzá kell adnia. Mivel a MixedRealityCameraParent gyermekösszetevőként már tartalmazza a MotionControllers és a Boundary összetevőt, el kell távolítania a meglévő MotionControllers és Environment előfabolót.

Utasítások

  • A Hierarchia panelen törölje a MixedRealityCamera, a Environment és a MotionControllers elemet

  • A Projekt panelen keresse meg és húzza az alábbi előtagokat a Hierarchia panelre:

    • Assets/AppPrefabs/Input/Prefabs/MixedRealityCameraParent
    • Assets/AppPrefabs/Input/Prefabs/InputManager
    • Assets/AppPrefabs/Input/Prefabs/Cursor/DefaultCursor

    Mixed Reality kamera szülője

  • A Hierarchia panelen kattintson az Input Manager elemre.

  • Az Inspector panelen görgessen le az Egyszerű mutatóválasztó szakaszhoz

  • A Hierarchia panelről húzza a DefaultCursor elemet a Kurzor mezőbe

    DefaultCursor hozzárendelése

  • Mentse a jelenetet, és kattintson a lejátszás gombra. A hüvelykujjával balra/jobbra vagy teleportot forgathat.

Vége

És ez az oktatóanyag vége! A következőket tanulta meg:

  • Mozgásvezérlő modellek használata a Unity játékmódban és futtatókörnyezetben.
  • A gombesemények és alkalmazásaik különböző típusainak használata.
  • Hogyan fedheti át a felhasználói felület elemeit a vezérlő fölé, vagy hogyan szabhatja testre teljesen.

Most már készen áll arra, hogy saját magával ragadó élményt hozzon létre a mozgásvezérlőkkel!

Befejezett jelenetek

  • A Unity Projekt paneljén kattintson a Jelenetek mappára.
  • Két Unity-jelenetet fog találni MixedReality213 és MixedReality213Advanced.
    • MixedReality213: Befejezett jelenet egyetlen ecsettel
    • MixedReality213Advanced: Befejezett jelenet több ecsettel a select gomb megnyomási mennyiségének példájával

Lásd még