Codifica per HoloLens con Unity 5 – Parte n. 5:Creazione di ologrammi da prefabbricati in fase di esecuzione utilizzando i gesti

Codifica per HoloLens con Unity 5 – Parte n. 5:Creazione di ologrammi da prefabbricati in fase di esecuzione utilizzando i gesti

Finora in questa serie ho aggiunto ologrammi alla mia scena all'interno di Unity. Ma è molto più utile poter creare ologrammi in fase di esecuzione. Questo tutorial mostrerà come creare un oggetto prefabbricato (chiamato prefabbricato) in Unity e come utilizzare un semplice gesto di tocco per aggiungere questo ologramma prefabbricato alla scena.

Creazione di un oggetto prefabbricato in Unity

Unity ha un tipo di risorsa chiamato prefabbricato. Ciò consente di creare un GameObject come una sorta di risorsa di progetto globale che può essere riutilizzata numerose volte nel progetto. La modifica dell'asset prefabbricato in un'unica posizione consente inoltre di modificare anche tutte le occorrenze istanziate dell'asset nella scena.

Creiamo un semplice oggetto in una gerarchia di progetto e convertiamolo in una risorsa prefabbricata.

Innanzitutto, in un progetto Unity, fai clic con il pulsante destro del mouse sulla superficie Gerarchia e crea un nuovo oggetto Cube 3d:chiamalo "Cubo".

Quindi, fai clic con il pulsante destro del mouse sul nodo Asset nell'area del progetto, crea un nuovo materiale (l'immagine sotto mostra come selezionare Materiale dal menu contestuale). Chiama il materiale “Blu”.

Per questo materiale, seleziona l'opzione Albedo e dalla tavolozza di scelta dei colori che appare, seleziona un colore blu.

Ora trascina questo materiale sull'oggetto "Cubo" nella vista Gerarchia. Il cubo che si trova al centro della scena dovrebbe ora assumere un colore blu.

Quindi, fai clic con il pulsante destro del mouse sul nodo Risorse nella vista Progetto e seleziona l'elemento Crea nel menu di scelta rapida. Da questo, seleziona l'opzione Prefabbricato.

Chiama questo oggetto prefabbricato "BlueCube". Questo avrà l'icona predefinita di una casella bianca.

Se ora fai clic sul Cubo nella vista Gerarchia, puoi trascinarlo sull'oggetto prefabbricato BlueCube. L'icona cambierà da una casella bianca a una blu, visualizzando in anteprima l'aspetto dell'oggetto nel nostro mondo virtuale.

Ora hai creato un oggetto prefabbricato:ogni volta che vuoi creare un oggetto BlueCube come questo nella tua scena, puoi semplicemente usare l'oggetto prefabbricato, invece di dover creare un cubo e assegnargli un materiale ogni volta. Inoltre, se desideri modificare l'oggetto in qualche modo, ad esempio per modificare le dimensioni, l'orientamento o la tonalità di blu, puoi modificare l'oggetto prefabbricato e questa modifica si rifletterà in tutte le istanze di questo prefabbricato.

Come possiamo creare un ologramma prefabbricato in fase di esecuzione?

Iniziamo eliminando l'oggetto cubo dalla scena. Fai clic sul cubo nella scena o fai clic sull'oggetto "Cubo" nella vista Gerarchia e premi Elimina. La scena ora sarà vuota.

Ora creiamo un nuovo script C# per aiutarci a gestire la creazione di ologrammi. Fare clic con il pulsante destro del mouse sul pannello Risorse e creare un nuovo script C# chiamato "CubeManager". Ora fai doppio clic su questo script per aprire il tuo editor di script preferito (ad es. MonoDevelop o Visual Studio).

Ci sono due cose che voglio fare in questo script:devo catturare un gesto di tocco e, quando rilevo un tocco, voglio creare un'istanza di un oggetto "BlueCube" 2 m davanti a dove sto attualmente guardando.

Innanzitutto, aggiungi una variabile GameObject membro pubblica allo script CubeManager chiamato blueCubePrefab, come mostrato nel codice seguente:

public class CubeManager : MonoBehaviour
{
    public GameObject blueCubePrefab;
}

Ora dobbiamo far conoscere alla nostra scena questo copione. Torna a Unity e fai clic con il pulsante destro del mouse sul pannello Gerarchia:dal menu di scelta rapida, seleziona "Crea vuoto". Assegna a questo oggetto il nome “BlueCubeCollection”.

Trascina lo script C# "CubeManager" sul nuovo oggetto "BlueCubeCollection". Nel pannello Inspector per l'oggetto BlueCubeCollection, vedrai una nuova proprietà di script chiamata "Cube Manager".

Si noti nel diagramma sopra che lo script Cube Manager ha una variabile chiamata "Blue Cube Prefab". Unity ha creato questa proprietà in base alla variabile GameObject pubblica denominata "blueCubePrefab" nello script C#.

Ma nota anche che la proprietà ha un valore di "Nessuno" - mentre c'è una dichiarazione, non c'è un'istanza. Possiamo risolvere questo problema trascinando il prefabbricato BlueCube che abbiamo creato in precedenza nella casella di testo che dice "Nessuno (Oggetto di gioco)". Quando lo fai, il pannello cambierà per assomigliare al diagramma qui sotto:nota che ora dice "BlueCube" di seguito.

Torniamo allo script C#. Per riconoscere gesti come un tocco, lo script deve avere un oggetto GestureRecognizer. Questo oggetto ha un evento chiamato "TappedEvent" e quando questo evento viene registrato, possiamo iniziare a catturare i gesti. Il codice seguente mostra come funziona.

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.
    }

L'ultima parte è l'istanziazione del nuovo oggetto BlueCube in una posizione specifica. La chiave per questo è il parametro headRay in Recognizer_TappedEvent sopra. Questo oggetto headRay ha un paio di proprietà, che ci aiuteranno a posizionare il nuovo oggetto:le proprietà sono direzione e origine . Questi sono entrambi del tipo Vector3:questo tipo di oggetto viene utilizzato per passare posizioni e direzioni.

  • headRay.origin ci fornisce la posizione in cui si trova chi indossa HoloLens.
  • headRay.direction ci fornisce la direzione in cui guarda chi indossa HoloLens.

Pertanto, se vogliamo ottenere la posizione 2m davanti all'HoloLens, possiamo moltiplicare la direzione per 2 e aggiungerla al valore di origine, come il codice seguente:

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

Quindi ora abbiamo la posizione in cui vogliamo posizionare il nostro ologramma.

Infine, abbiamo solo bisogno del codice per creare un'istanza dell'ologramma blueCubeFab. Fortunatamente, è molto facile.

Instantiate(blueCubePrefab, position, Quaternion.identity);

Questa chiamata colloca un'istanza di blueCubePrefab nella posizione Vector3 definita da position. L'oggetto Quaternion.identity significa semplicemente che l'oggetto è nella rotazione predefinita.

Quindi il codice completo per CubeManager è di seguito:

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);
    }
}

Ora possiamo costruire ed eseguire il progetto usando le impostazioni definite nell'altro mio post qui. Dopo aver eseguito il progetto in Visual Studio tramite l'emulatore HoloLens che mostrava una scena vuota, ho creato alcune caselle (usando il tasto Invio per simulare un tocco aereo). Sono passato al lato per mostrare questi ologrammi.

Quindi ora sappiamo come creare ologrammi in fase di esecuzione da un oggetto prefabbricato utilizzando un gesto.