Kodierung für die HoloLens mit Unity 5 – Teil #5:Erstellen von Hologrammen aus Prefabs zur Laufzeit mithilfe von Gesten

Kodierung für die HoloLens mit Unity 5 – Teil #5:Erstellen von Hologrammen aus Prefabs zur Laufzeit mithilfe von Gesten

Bisher habe ich in dieser Serie Hologramme zu meiner Szene in Unity hinzugefügt. Aber es ist viel nützlicher, Hologramme zur Laufzeit erstellen zu können. Dieses Tutorial zeigt, wie Sie ein vorgefertigtes Objekt (als Prefab bezeichnet) in Unity erstellen und wie Sie dieses Hologramm-Prefab mit einer einfachen Tippgeste zu Ihrer Szene hinzufügen.

Erstellen eines vorgefertigten Objekts in Unity

Unity hat einen Asset-Typ namens Prefab. Dadurch kann ein GameObject als eine Art globales Projekt-Asset erstellt werden, das im Projekt mehrfach wiederverwendet werden kann. Durch das Ändern des vorgefertigten Objekts an einer Stelle können auch alle instanziierten Vorkommen des Objekts in Ihrer Szene geändert werden.

Lassen Sie uns ein einfaches Objekt in einer Projekthierarchie erstellen und es in ein vorgefertigtes Objekt umwandeln.

Klicken Sie zunächst in einem Unity-Projekt mit der rechten Maustaste auf die Hierarchieoberfläche und erstellen Sie ein neues Würfel-3D-Objekt – nennen Sie es „Würfel“.

Klicken Sie als Nächstes mit der rechten Maustaste auf den Asset-Knoten in der Projektoberfläche und erstellen Sie ein neues Material (das Bild unten zeigt, wie Material aus dem Kontextmenü ausgewählt wird). Nennen Sie das Material „Blau“.

Wählen Sie für dieses Material die Albedo-Option und wählen Sie aus der angezeigten Farbauswahlpalette eine blaue Farbe aus.

Ziehen Sie nun dieses Material auf das „Cube“-Objekt in der Hierarchieansicht. Der Würfel, der sich in der Mitte der Szene befindet, sollte sich nun blau färben.

Klicken Sie anschließend mit der rechten Maustaste auf den Knoten Assets in der Projektansicht und wählen Sie im Kontextmenü den Eintrag Erstellen. Wählen Sie hier die Option Prefab aus.

Nennen Sie dieses vorgefertigte Objekt „BlueCube“. Dies hat das Standardsymbol eines weißen Kästchens.

Wenn Sie nun in der Hierarchieansicht auf den Cube klicken, können Sie diesen auf das BlueCube-Fertigobjekt ziehen. Das Symbol ändert sich von einem weißen Kästchen in ein blaues Kästchen und zeigt eine Vorschau, wie das Objekt in unserer virtuellen Welt aussieht.

Sie haben jetzt ein vorgefertigtes Objekt erstellt – wann immer Sie ein solches BlueCube-Objekt in Ihrer Szene erstellen möchten, können Sie einfach das vorgefertigte Objekt verwenden, anstatt jedes Mal einen Würfel erstellen und ihm ein Material zuweisen zu müssen. Wenn Sie das Objekt auf irgendeine Weise ändern möchten – beispielsweise um die Größe, Ausrichtung oder den Blauton zu ändern – können Sie das Prefab-Objekt ändern, und diese Änderung wird in allen Instanziierungen dieses Prefabs widergespiegelt.

Wie können wir zur Laufzeit ein vorgefertigtes Hologramm erstellen?

Beginnen wir damit, das Würfelobjekt aus der Szene zu löschen. Klicken Sie entweder auf den Würfel in der Szene oder auf das „Würfel“-Objekt in der Hierarchieansicht und klicken Sie auf „Löschen“. Die Szene ist jetzt leer.

Lassen Sie uns nun ein neues C#-Skript erstellen, das uns bei der Erstellung von Hologrammen hilft. Klicken Sie mit der rechten Maustaste auf das Bedienfeld „Assets“ und erstellen Sie ein neues C#-Skript mit dem Namen „CubeManager“. Doppelklicken Sie nun auf dieses Skript, um Ihren bevorzugten Skript-Editor (z. B. MonoDevelop oder Visual Studio) zu öffnen.

Es gibt zwei Dinge, die ich in diesem Skript tun möchte – ich muss eine Tipp-Geste erfassen, und wenn ich einen Tipp erkenne, möchte ich ein „BlueCube“-Objekt 2 m vor der Stelle, an der ich gerade hinschaue, instanziieren.

Fügen Sie dem CubeManager-Skript zunächst eine öffentliche GameObject-Variable mit dem Namen blueCubePrefab hinzu, wie im folgenden Code gezeigt:

public class CubeManager : MonoBehaviour
{
    public GameObject blueCubePrefab;
}

Jetzt müssen wir unsere Szene über dieses Drehbuch informieren. Wechseln Sie zurück zu Unity und klicken Sie mit der rechten Maustaste auf das Hierarchie-Panel – wählen Sie im Kontextmenü „Create Empty“. Geben Sie diesem Objekt den Namen „BlueCubeCollection“.

Ziehen Sie das C#-Skript „CubeManager“ auf das neue Objekt „BlueCubeCollection“. Im Inspector-Panel für das BlueCubeCollection-Objekt sehen Sie eine neue Skripteigenschaft namens „Cube Manager“.

Beachten Sie im obigen Diagramm, dass das Cube Manager-Skript eine Variable namens „Blue Cube Prefab“ hat. Unity hat diese Eigenschaft basierend auf der öffentlichen GameObject-Variable namens „blueCubePrefab“ im C#-Skript erstellt.

Beachten Sie aber auch, dass die Eigenschaft den Wert „None“ hat – während es eine Deklaration gibt, gibt es keine Instanziierung. Wir können dies beheben, indem wir das zuvor erstellte BlueCube-Prefab auf das Textfeld mit der Aufschrift „None (Game Object)“ ziehen. Wenn Sie dies tun, ändert sich das Bedienfeld so, dass es wie in der Abbildung unten aussieht – beachten Sie, dass unten jetzt „BlueCube“ steht.

Kehren wir zum C#-Skript zurück. Um Gesten wie Tippen zu erkennen, muss das Skript über ein GestureRecognizer-Objekt verfügen. Dieses Objekt hat ein Ereignis namens „TappedEvent“, und wenn dieses Ereignis registriert ist, können wir mit der Erfassung von Gesten beginnen. Der folgende Code zeigt, wie das funktioniert.

using UnityEngine;
using UnityEngine.VR.WSA.Input;

public class CubeManager : MonoBehaviour
{
    public GameObject blueCubePrefab;
 
    GestureRecognizer recognizer;
 
    void Start()
    {
        recognizer = new GestureRecognizer();
 
        recognizer.TappedEvent += Recognizer_TappedEvent;
 
        recognizer.StartCapturingGestures();
    }
 
    private void Recognizer_TappedEvent(InteractionSourceKind source, int tapCount, Ray headRay)
    {
        // process the event.
    }

Der letzte Teil davon besteht darin, das neue BlueCube-Objekt an einem bestimmten Ort zu instanziieren. Der Schlüssel dazu ist der Parameter headRay im obigen Recognizer_TappedEvent. Dieses HeadRay-Objekt hat einige Eigenschaften, die uns helfen, das neue Objekt zu positionieren – die Eigenschaften sind Richtung und Herkunft . Diese sind beide vom Typ Vector3 – dieser Objekttyp wird zum Übergeben von Positionen und Richtungen verwendet.

  • headRay.origin gibt uns die Position an, an der sich der HoloLens-Träger befindet.
  • headRay.direction gibt uns die Blickrichtung des HoloLens-Trägers an.

Wenn wir also die Position 2 m vor der HoloLens erhalten möchten, können wir die Richtung mit 2 multiplizieren und zum Ursprungswert hinzufügen, wie im folgenden Code:

var direction = headRay.direction;
 
var origin = headRay.origin;
 
var position = origin + direction * 2.0f;

Jetzt haben wir also die Position, an der wir unser Hologramm platzieren möchten.

Schließlich brauchen wir nur noch den Code, um das blueCubeFab-Hologramm zu instanziieren. Glücklicherweise ist dies sehr einfach.

Instantiate(blueCubePrefab, position, Quaternion.identity);

Dieser Aufruf platziert eine Instanz des blueCubePrefab an der durch position definierten Vector3-Position. Das Quaternion.identity-Objekt bedeutet einfach, dass sich das Objekt in der Standardrotation befindet.

Der vollständige Code für den CubeManager ist also unten:

using UnityEngine;
using UnityEngine.VR.WSA.Input;

public class CubeManager : MonoBehaviour
{
    public GameObject blueCubePrefab;
 
    GestureRecognizer recognizer;
 
    void Start()
    {
        recognizer = new GestureRecognizer();
 
        recognizer.TappedEvent += Recognizer_TappedEvent;
 
        recognizer.StartCapturingGestures();
    }
 
    private void Recognizer_TappedEvent(InteractionSourceKind source, int tapCount, Ray headRay)
    {
        var direction = headRay.direction;
 
        var origin = headRay.origin;
 
        var position = origin + direction * 2.0f;
 
        Instantiate(blueCubePrefab, position, Quaternion.identity);
    }
}

Jetzt können wir das Projekt mit den in meinem anderen Beitrag hier definierten Einstellungen erstellen und ausführen. Nachdem ich das Projekt in Visual Studio über den HoloLens-Emulator ausgeführt hatte, der eine leere Szene zeigte, erstellte ich einige Kästchen (unter Verwendung der Eingabetaste, um einen Air-Tap zu simulieren). Ich habe zur Seite navigiert, um diese Hologramme anzuzeigen.

Jetzt wissen wir also, wie man aus einem vorgefertigten Objekt per Geste Hologramme zur Laufzeit erzeugt.