1. Panoramica
ARCore è il framework di Google per la creazione di esperienze di realtà aumentata sugli smartphone. Puoi utilizzare AR Foundation di Unity per creare applicazioni AR multipiattaforma.
Cosa creerai
In questo codelab, creerai un gioco semplice utilizzando AR Foundation. Lo scopo del gioco è raccogliere pacchi utilizzando un'auto che controlli con il tuo dispositivo portatile.
Tuttavia, questo non accadrà in un mondo completamente virtuale. Mescolerai atomi fisici e bit digitali per creare un nuovo tipo di esperienza per i giocatori, creando un gioco che comprenda l'ambiente circostante.
Al termine di questo codelab, il tuo gioco sarà in grado di:
- Rileva gli aerei nel mondo reale e disegna un campo di gioco sopra.
- Proietta raggi dalla visuale della videocamera e rileva le intersezioni con i piani.
- Reagisce alle condizioni di illuminazione del mondo reale per dare al gioco un realismo extra.

Obiettivi didattici
- Come configurare un progetto che utilizza AR Foundation di Unity.
- Come utilizzare
ARPlaneManagerper abbonarsi a nuovi piani. - Come utilizzare
Raycastper trovare intersezioni con la geometria virtuale - Come utilizzare
ARLightEstimationDataper illuminare la scena.
Che cosa ti serve
- Un dispositivo ARCore supportato, collegato alla macchina di sviluppo tramite un cavo USB.
- Google Play Services per AR 1.23 o versioni successive.
- Un'installazione di Unity Hub o Unity 2020 LTS.
2. Configurazione dell'ambiente di sviluppo
In questo passaggio, preparerai l'ambiente per lo sviluppo con AR Foundation di Unity.
Assicurarsi che il dispositivo sia compatibile con la realtà aumentata
Le esperienze AR sui dispositivi Android sono gestite da ARCore, disponibile sui dispositivi supportati da ARCore. Assicurati che il dispositivo di sviluppo sia compatibile con la AR. In alternativa, puoi utilizzare un'istanza dell'emulatore Android compatibile con la AR configurata correttamente.
Configurare il debug USB sul dispositivo
Per eseguire le app di debug, devi attivare le Opzioni sviluppatore sul tuo dispositivo. Se non l'hai ancora fatto, consulta la documentazione di Android su come attivare le opzioni sviluppatore e il debug USB.
Installare Unity (2020.3 LTS)
Sulla workstation, installa Unity 2020 LTS. In questo codelab vengono mostrati screenshot della UI di Unity nella versione 2020.3 (LTS). Potrebbero funzionare anche altre versioni di Unity, ma potrebbero essere necessari passaggi aggiuntivi. Potrebbe avere un aspetto diverso rispetto agli screenshot mostrati qui.
Crea un nuovo progetto
Crea un nuovo progetto utilizzando il modello Universal Render Pipeline. Assegna un nome descrittivo e una posizione appropriata, quindi premi CREA.

Installa i framework richiesti
AR Foundation di Unity è disponibile in Unity Package Manager.
- Per aprirlo, fai clic su Finestra > Package Manager.

- In questa finestra, installa i pacchetti che utilizzerai in questo codelab. Visualizza le ultime versioni di questi framework espandendo la voce utilizzando l'icona
►. Installa le versioni più recenti di ciascuno di questi framework:- AR Foundation
- Plug-in ARCore XR
Al termine, Package Manager dovrebbe avere un aspetto simile a questo:

Installa il pacchetto iniziale
Per questo codelab, abbiamo fornito un pacchetto iniziale contenente prefabbricati e script che velocizzeranno alcune parti del codelab, in modo che tu possa concentrarti su come utilizzare AR Foundation.
- Installa il pacchetto iniziale aprendo Assets > Import Package > Custom Package… (Risorse > Importa pacchetto > Pacchetto personalizzato…) e aprendo
starter-package.unitypackage. - Nella finestra popup, assicurati che tutto sia selezionato.
- Fai clic su Importa.
Modificare le impostazioni di build
Poiché l'applicazione verrà eseguita su Android, modifica la piattaforma di build in Android:
- Apri File > Build Settings (Impostazioni build).
- Nel riquadro Piattaforma, seleziona Android.
- (Facoltativo) Attiva Build di sviluppo e Debug script per conservare le informazioni di debug durante l'esecuzione dell'app.
- Fai clic su Cambia piattaforma.

Modificare le impostazioni del progetto
AR Foundation deve essere configurato per inizializzare i sistemi XR all'avvio.
- Apri Modifica > Impostazioni progetto… e fai clic sulla sezione Gestione plug-in XR.
- Nella scheda Android, attiva ARCore.

- Nel riquadro a sinistra, fai clic sulla sezione Player.
- Nella scheda Android, in Other Settings, rimuovi Vulkan da Graphics API.

- Le app AR Required che utilizzano ARCore richiedono un livello API minimo di 24. Scorri verso il basso e trova Livello API minimo. Imposta il livello API minimo su 24.

Aggiungere gli elementi della scena richiesti
Il modello Universal Render Pipeline include alcuni oggetti di gioco che non utilizzerai in questo tutorial.
- Elimina tutti gli oggetti di gioco in
SampleScene.

- Aggiungi oggetti AR Foundation. Fai clic con il tasto destro del mouse nel riquadro Gerarchia. Utilizza questo menu per aggiungere:
- XR > AR Session: questo oggetto controlla il ciclo di vita di un'esperienza AR.
- XR > AR Session Origin: questo oggetto trasforma le coordinate AR in coordinate del mondo Unity.
- Luce > Luce direzionale: fornisce una sorgente luminosa per illuminare gli oggetti di gioco.
La gerarchia dovrebbe essere simile alla seguente:

- Espandi l'origine della sessione AR che hai creato nella gerarchia e seleziona l'oggetto Fotocamera AR. Nell'inspector, cambia il tag in MainCamera.

Configurare il rendering
La pipeline di rendering universale di Unity richiede una modifica per essere compatibile con AR Foundation.
- Nel riquadro Progetto, vai a Risorse > Impostazioni per trovare la risorsa ForwardRenderer.

- Seleziona ForwardRenderer.
- Nel riquadro Inspector, utilizza Add Renderer Feature per aggiungere una AR Background Renderer Feature. Questo componente eseguirà il rendering del feed della videocamera nella scena.

Verifica la configurazione
- Assicurati che il dispositivo sia collegato alla corrente e che il debug ADB sia attivo.
- Fai clic su File > Build And Run... (File > Compila ed esegui…) L'applicazione verrà caricata sul dispositivo e avviata al termine dell'installazione.
- Dovresti vedere il feed della videocamera sullo schermo del dispositivo.
Nel passaggio successivo inizierai ad aggiungere funzionalità alla tua app.
3. Rilevare gli aerei nel mondo reale
Ora che è stata configurata una scena di base, puoi iniziare a sviluppare il gioco. In questo passaggio, rileverai i piani e li disegnerai nella scena.
Aggiungere un componente ARPlaneManager
Un ARPlaneManager rileva ARPlane e crea, aggiorna e rimuove gli oggetti di gioco quando la comprensione dell'ambiente da parte del dispositivo cambia.
- Utilizzando il riquadro Gerarchia, crea un
GameObjectvuoto. - Rinominalo in
Driving Surface Manager. Questo componente mostrerà gli aerei finché uno non viene selezionato dal giocatore. - Seleziona il nuovo oggetto di gioco. Nel riquadro Inspector, fai clic su Add Component (Aggiungi componente) per aggiungere un AR Plane Manager (Gestore piani AR).

- Configura
ARPlaneManagerimpostando il campoPlane Prefab:- Fai clic sul pulsante accanto a
Noneper visualizzare la finestra Seleziona GameObject. - Seleziona la scheda Asset e cerca Driving Surface Plane.
- Fai clic sul pulsante accanto a

Questo prefab del pacchetto iniziale fornisce una texture del pavimento granulosa che verrà utilizzata come decorazione dell'aereo.
- Modifica
Detection ModeinHorizontal. In questo modo,ARPlaneManagerfornisce solo piani orizzontali, ideali per la guida.
Aggiungere un componente ARRaycastManager
Un ARRaycastManager espone la funzionalità di raycast. Nel passaggio successivo, utilizzeremo questo oggetto per fornire i controlli all'utente.
- Assicurati che l'oggetto denominato
Driving Surface Managersia selezionato nel riquadro Gerarchia. - Nell'inspector, fai clic su Aggiungi componente per aggiungere un componente
ARRaycastManagerall'oggetto di gioco.
Non è necessaria alcuna ulteriore configurazione per questo componente.
Aggiungere un componente DrivingSurfaceManager
Un DrivingSurfaceManager è uno script helper del pacchetto iniziale che consente di selezionare un ARPlane. Una volta selezionato un ARPlane, tutti gli altri piani verranno nascosti e i nuovi piani verranno disattivati.
- Assicurati che l'oggetto denominato
Driving Surface Managersia selezionato nel riquadro Gerarchia. - Nell'inspector, fai clic su Add Component (Aggiungi componente) per aggiungere un componente
DrivingSurfaceManageral tuo oggetto di gioco.
Non è necessaria alcuna ulteriore configurazione per questo componente.
Esegui l'app
- Fai clic su File > Build ed esegui… per testare le modifiche.
- Punta il dispositivo verso una superficie orizzontale del mondo reale e muovilo per migliorare la comprensione del mondo da parte di ARCore.

- Quando ARCore ha rilevato un piano, dovresti vedere una texture di sporco che copre le superfici del mondo reale.
ARPlaneManagercrea un'istanza diPlane Prefabper ogni piano rilevato. Il prefabDriving Surface Planeha un componenteARPlaneMeshVisualizerche crea una mesh per un determinatoARPlane.
Nel passaggio successivo, utilizzerai un piano rilevato come campo di gioco.
4. Eseguire un test di riscontro sugli aerei rilevati
Nel passaggio precedente, hai programmato un'applicazione in grado di rilevare gli aerei. Questi piani si riflettono nella scena del gioco. Ora aggiungerai interattività a questi piani creando un reticolo di puntamento e un'auto che si muoverà sulla superficie del piano rilevato.
Creare un reticolo di puntamento
Lo schema di controllo di questa app prevede che il giocatore punti lo smartphone verso una superficie. Per fornire un feedback visivo chiaro per la posizione designata, utilizzerai un reticolo di puntamento.

Per "incollare" questo reticolo a un piano AR, utilizza un test di riscontro. Un test di hit è una tecnica che calcola le intersezioni quando viene lanciato un raggio in una determinata direzione. Utilizzerai un test di rilevamento per individuare un incrocio nella direzione del campo visivo della videocamera.

Aggiungere il reticolo
- Nel riquadro Progetto nella parte inferiore dello schermo, vai a Risorse > Pacchetto iniziale.
- Inserisci il prefab del reticolo nella scena trascinandolo nel riquadro Gerarchia del progetto.
- Seleziona il reticolo nella gerarchia.
- Nell'inspector, fai clic su Aggiungi componente. Aggiungi lo script
ReticleBehaviourdal pacchetto iniziale. Questo script contiene del codice standard per controllare il reticolo. - Lo script
ReticleBehaviourdipende daDriving Surface Managerche hai creato in precedenza, quindi aggiungi la dipendenza facendo clic sul selettoreDriving Surface Manager. Seleziona la scheda Scena e scegliDriving Surface Manager.

Modifica ReticleBehaviour
Lo script ReticleBehavior posizionerà il reticolo sul piano al centro del riquadro del dispositivo.
- Apri lo script
ReticleBehaviour.csfacendo doppio clic sul campoScript. - Determina il centro dello schermo utilizzando il
ViewToScreenPointdella fotocamera. Modifica il metodoUpdate()per aggiungere quanto segue:
var screenCenter = Camera.main.ViewportToScreenPoint(new Vector3(0.5f, 0.5f));
- Utilizza questo punto per eseguire un raycast. Aggiungi quanto segue:
var hits = new List<ARRaycastHit>();
DrivingSurfaceManager.RaycastManager.Raycast(screenCenter, hits, TrackableType.PlaneWithinBounds);
La variabile hits conterrà ARRaycastHit che descrivono i punti sui trackable intersecati da ray.
- Determina il punto di interesse dell'incrocio eseguendo una query sull'elenco
hits. Dai la priorità al piano bloccato contenuto inDrivingSurfaceManagere, se non esiste, utilizza il primo piano rilevato. Aggiungi quanto segue alla fine diUpdate():
CurrentPlane = null;
ARRaycastHit? hit = null;
if (hits.Length > 0)
{
// If you don't have a locked plane already...
var lockedPlane = DrivingSurfaceManager.LockedPlane;
hit = lockedPlane == null
// ... use the first hit in `hits`.
? hits[0]
// Otherwise use the locked plane, if it's there.
: hits.SingleOrDefault(x => x.trackableId == lockedPlane.trackableId);
}
- Se
hitcontiene un risultato, sposta la trasformazione diGameObjectnella posizione del riscontro.
if (hit.HasValue)
{
CurrentPlane = DrivingSurfaceManager.PlaneManager.GetPlane(hit.Value.trackableId);
// Move this reticle to the location of the hit.
transform.position = hit.Value.pose.position;
}
Child.SetActive(CurrentPlane != null);
Testa il reticolo
- Fai clic su File > Build ed esegui… per testare le modifiche.
- Quando punti il dispositivo verso un aereo, dovresti vedere il reticolo seguire i movimenti della fotocamera.

Crea un'auto
Il giocatore controllerà un'auto giocattolo che si dirigerà verso la posizione del mirino. Un modello e un comportamento per questa auto sono forniti nel pacchetto iniziale.
Aggiungere un CarManager alla scena
- Nella gerarchia, crea un nuovo
GameObjectvuoto. - Rinominalo in
Car Spawner. - Seleziona l'oggetto che hai creato. Nel riquadro Gerarchia, fai clic su Aggiungi componente per aggiungere il componente
CarManager. - Configura le dipendenze di
CarManagerfacendo clic sul selettore per ogni campo:- Prefab auto: in Asset, seleziona Prefab auto.
- Reticolo: in Scena, seleziona Reticolo prefab.
- Driving Surface Manager: in Scena, seleziona Driving Surface Manager.
Questo comportamento di CarManager genera una macchinina sul piano su cui si trova il mirino. Se vuoi, dai un'occhiata allo script CarBehaviour per scoprire come è programmata l'auto.
Test drive
- Fai clic su File > Build And Run (Compila ed esegui) per testare le modifiche.
- Quando tocchi un aereo, dovresti vedere una piccola auto in quella posizione. Questa auto seguirà il reticolo.
Aggiungere l'elemento di gioco
Ora che il giocatore può controllare un'entità nella scena, dagli una destinazione da raggiungere.
- Crea un nuovo
GameObjectvuoto nella gerarchia. - Rinominalo in
Package Spawner. - Seleziona l'oggetto che hai creato. Nel riquadro Gerarchia, fai clic su Aggiungi componente per aggiungere il componente
PackageSpawner. - Configura le dipendenze di
PackageSpawnerfacendo clic sul selettore per ogni campo:- Package Prefab: in Asset, seleziona Package Prefab.
- Driving Surface Manager: in Scena, seleziona Driving Surface Manager.
Questo comportamento di PackageSpawner genera un nuovo pacchetto in una posizione casuale su un ARPlane bloccato se non è già presente un pacchetto.
Testare il gioco
- Fai clic su File > Build And Run (Compila ed esegui) per testare le modifiche. 2. Dopo aver creato un'auto, dovrebbe comparire un pacchetto.
- Guida l'auto fino al pacco.
- Ne verrà visualizzato uno nuovo in una posizione casuale.

5. Configurare la stima dell'illuminazione
Ora che il gioco di base è stato completato, aggiungi un tocco di realismo alla tua scena AR. In questo passaggio, utilizzerai l'API Lighting Estimation di ARCore per rilevare l'illuminazione presente nel mondo reale in base ai frame della videocamera in entrata. Queste informazioni verranno utilizzate per adattare l'illuminazione della scena in modo che corrisponda a quella del mondo reale.
Attiva la stima dell'illuminazione
- In Gerarchia, espandi Origine sessione AR e seleziona l'oggetto Fotocamera AR.
- In Inspector, espandi lo script AR Camera Manager.
- Modifica il campo Stima illuminazione in Tutto.

Modificare la luce direzionale
- In Gerarchia, seleziona l'oggetto Luce direzionale.
- Aggiungi il componente
LightEstimation. Questo componente del pacchetto iniziale fornisce un boilerplate per l'iscrizione alle modifiche dell'illuminazione. - Nella funzione
FrameReceived(), aggiungi:
ARLightEstimationData lightEstimation = args.lightEstimation;
if (lightEstimation.averageBrightness.HasValue)
Light.intensity = lightEstimation.averageBrightness.Value;
if (lightEstimation.averageColorTemperature.HasValue)
Light.colorTemperature = lightEstimation.averageColorTemperature.Value;
if (lightEstimation.colorCorrection.HasValue)
Light.color = lightEstimation.colorCorrection.Value;
if (lightEstimation.mainLightDirection.HasValue)
Light.transform.rotation = Quaternion.LookRotation(lightEstimation.mainLightDirection.Value);
if (lightEstimation.mainLightColor.HasValue)
Light.color = lightEstimation.mainLightColor.Value;
if (lightEstimation.mainLightIntensityLumens.HasValue)
Light.intensity = lightEstimation.averageMainLightBrightness.Value;
if (lightEstimation.ambientSphericalHarmonics.HasValue)
{
RenderSettings.ambientMode = AmbientMode.Skybox;
RenderSettings.ambientProbe = lightEstimation.ambientSphericalHarmonics.Value;
}
Testare le modifiche
- Fai clic su File > Build And Run (Compila ed esegui) per testare le modifiche.
- Quando osservi gli oggetti nella scena, potresti notare che sono colorati a seconda dell'illuminazione dell'ambiente.
- Se possibile, prova a modificare l'illuminazione. Ad esempio, prova a spegnere le luci della stanza in cui ti trovi. Dovresti notare che l'illuminazione degli oggetti si adatta al cambiamento dell'illuminazione nel mondo reale.

6. Conclusione
Complimenti! Hai raggiunto la fine di questo codelab su Unity AR Foundation.
Argomenti trattati
- Come configurare un progetto di base utilizzando AR Foundation di Unity e la pipeline di rendering universale.
- Come utilizzare
ARPlaneManagerper abbonarsi a nuovi piani. - Come utilizzare
Raycastper trovare intersezioni con la geometria virtuale. - Come utilizzare
ARLightEstimationDataper illuminare la scena.
Passaggi successivi
- Dai un'occhiata agli esempi di AR Foundation di Unity.
- Sfoglia la documentazione di AR Foundation.
- Consulta la documentazione di Google sulle estensioni ARCore per AR Foundation di Unity.
Assegnazioni bonus
Se vuoi ampliare il gioco che hai creato qui, ecco alcune idee che potresti seguire:
- Aggiungi un contatore di punteggio al tuo gioco modificando un
TextMeshProquando unPackageManagergenera un nuovo pacchetto. - Controlla le informazioni sul rendimento durante l'esecuzione del gioco attivando la sovrapposizione delle prestazioni.
- Utilizza Persistent Raycasts per posizionare prima i nuovi oggetti nella scena. Quando viene rilevato un piano in quell'area, l'oggetto si aggiorna per agganciarsi a quel piano.