Crea un gioco di realtà aumentata in stile Pokémon GO con Vuforia Obiettivi dell'immagine

In questo tutorial torneremo alla libreria Vuforia Augmented Reality (AR), esplorando una delle sue risorse più interessanti: Image Target. Espanderemo il gioco Shoot the Cubes che abbiamo creato nelle lezioni precedenti, aggiungendo un nuovo livello in cui il giocatore deve difendere la propria base dai cubi attaccanti. 

 

Questo tutorial può essere completato da solo, anche se se vuoi un'introduzione ad AR con Vuforia e Unity3D, controlla i post precedenti della serie.

Obiettivi di immagine

Qualsiasi tipo di immagine può essere un Vuforia Image Target. Tuttavia, più l'immagine è dettagliata e complessa, meglio sarà riconosciuta dall'algoritmo. 

Un sacco di fattori faranno parte del calcolo di riconoscimento, ma fondamentalmente l'immagine deve avere un livello ragionevole di contrasto, risoluzione e elementi distintivi. Una fotografia di cielo blu non funzionerebbe molto bene, ma una foto di erba funzionerebbe con grazia. I target di immagine possono essere forniti con l'applicazione, caricati nell'applicazione tramite il cloud o creati direttamente nell'app dall'utente.

Aggiungere un obiettivo

Iniziamo aggiungendo un ImageTarget elemento del nostro progetto Unity. 

Innanzitutto, scarica le risorse del corso dal pulsante nella barra laterale. Quindi, nel tuo progetto Unity, crea una nuova scena chiamata DefendTheBase: nel Progetto finestra, selezionare il scene cartella e fare clic su Creare > Scena. Ora apri quella scena e rimuovi tutti gli oggetti scena di default dalla gerarchia.

Quindi aggiungeremo una luce e una fotocamera. Clicca su Inserisci > Luce > Luce direzionale aggiungere una luce direzionale. Seleziona questa nuova luce e imposta Soft Shadow come il Tipo di ombra opzione. 

Dopo di ciò, trascina e rilascia un ARCamera oggetto da Vuforia > prefabbricati. Seleziona il ARCamera oggetto e nel pannello di controllo, impostare il Chiave di licenza dell'app creato sulla pagina degli sviluppatori di Vuforia (vedere il primo tutorial per le istruzioni). Selezionare DEVICE_TRACKING per il World Center Mod.

Infine, trascina e rilascia un ImageTargetalla gerarchia da Vuforia > prefabbricati.

Ora dobbiamo aggiungere un database Vuforia. Per prima cosa, vai a https://developer.vuforia.com/target-manager. Clicca su Aggiungi database e scegli un nome.

Esistono tre tipi di database tra cui scegliere:

  1. Dispositivo: Il database viene salvato sul dispositivo e tutte le destinazioni vengono aggiornate localmente.
  2. Nube: Database sui server Vuforia.
  3. VuMark: Database esclusivo per gli obiettivi VuMark. Viene anche salvato sul dispositivo.

In questo caso, scegliere il Dispositivo opzione e fare clic su creare.

Seleziona il nuovo database in modo che possiamo iniziare ad aggiungere target a esso. Ora è il momento di aggiungere obiettivi al database. Per ora, useremo semplicemente il Immagine singola opzione.

Passare ai file precedentemente scaricati, selezionare ImageTarget1, e impostare il suo Larghezza a 1 e fare clic su Inserisci. (Nota: se preferisci creare il tuo Target immagine, leggi prima la guida.)

Ora puoi scaricare il database, selezionando Unity Editor come la piattaforma scelta. Apri il file e seleziona tutti gli elementi da importare. Dobbiamo anche preparare la nostra scena dell'Unità per riconoscere il ImageTarget con questo database che abbiamo creato.

Nell'editor di Unity, fai clic su iomageTarget oggetto. In primo luogo, trova ed espandi Comportamento dell'obiettivo dell'immagine nell'ispettore degli oggetti. Seleziona un genere di predefiniti. Scegli il target immagine creato in precedenza per Banca dati. Infine, assicurati che il Attiva il monitoraggio esteso e Abilita Smart Terrain le opzioni sono entrambe disabilitate.

Il ImageTarget prefabbricato è costituito da una serie di componenti, tra cui alcuni script simili Comportamento dell'obiettivo dell'immagine, Turna comportamento, Gestore di eventi Tracker predefinito. Se vuoi capire profondamente come funziona il sistema, leggi quegli script e cerca di capire la loro relazione con altri componenti. 

Per questo tutorial, tuttavia, non scaveremo troppo in profondità. Dovremo concentrarci solo sul Gestore di eventi Tracker predefinito, che riceve le chiamate quando cambia lo stato del tracciamento della destinazione dell'immagine. Quindi usiamo questo script come base per creare il nostro comportamento di script.

Crea una copia di questo script che possiamo estendere. Prima selezione Gestore di eventi Tracker predefinito, clicca su opzioni e selezionare Modifica Script. Ora, fai una copia della sceneggiatura. Se stai usando MonoDevelop, clicca File > Salva come e salva come ImageTargetBehavior, salvandolo nel Script cartella.

Lo script TargetBehaviorScript

Non avremo bisogno del Vuforia spazio dei nomi nel nostro script. Rimuovi la linea "spazio dei nomi Vuforia"E le parentesi. Ciò significa che avremo bisogno di fare riferimento esplicitamente al Vuforia namespace quando vogliamo accedere alle sue classi: 

usando UnityEngine; usando System.Collections; BaseScript di classe pubblica: MonoBehaviour, Vuforia.ITrackableEventHandler // code here

Il metodo più importante in questa classe sarà il OnTrackableStateChanged metodo che riceve le chiamate quando la destinazione dell'immagine viene trovata o persa dal dispositivo della fotocamera. Secondo lo stato di destinazione, chiama OnTrackingFound o OnTrackingLost, e avremo bisogno di modificare anche questi metodi. Ma prima pensiamo a come vogliamo che il target dell'immagine si comporti. 

In questo gioco, l'utente difenderà una base che appare su un bersaglio dell'immagine. Consideriamo le seguenti meccaniche di gioco:

  • Una volta che il bersaglio viene riconosciuto dal sistema, viene visualizzata la base e i nemici iniziano a spawnare e volare verso la base in stile kamikaze.
  • Ogni volta che un nemico colpisce la base, la base subirà qualche danno e il nemico verrà distrutto.
  • Per vincere il gioco, l'utente deve sparare e distruggere tutti i nemici prima che la base venga distrutta.
  • Se il bersaglio dell'immagine è perso (non è più visibile dalla telecamera del dispositivo), il gioco inizierà un conto alla rovescia. Se il timer arriva a zero, il gioco è perso. Mentre il bersaglio è perso, tutti i nemici smetteranno di avanzare verso la base.

Quindi dovremo adattare quelle meccaniche di gioco a quelle che abbiamo creato nell'ultimo tutorial. Creeremo la logica di deposizione nemica nella prossima sezione con un oggetto vuoto chiamato _SpawnController, usando la stessa logica adottata nella prima parte del gioco.

Per ora, diamo un'occhiata alla logica trovata di tracciamento.

private void OnTrackingFound () EnableRendererAndCollider (); // Informa il sistema che il target è stato trovato StartCoroutine (InformSpawnCtr (true));  private void OnTrackingLost () DisableRendererAndCollider (); // Informa il sistema che il target è stato perso StartCoroutine (InformSpawnCtr (false));  // informa SpanController che è stata fondata la base privata IEnumerator InformSpawnCtr (bool isOn) // sposta posizione di spawn GameObject spawn = GameObject.FindGameObjectWithTag ("_SpawnController"); yield return new WaitForSeconds (0.2f); // informa SpanController if (isOn) spawn.GetComponent () .BaseOn (transform.position);  else spawn.GetComponent () .BaseOff (); 

Tornando all'editor Unity, possiamo creare l'oggetto base che verrà generato dal controller spawn. 

Innanzitutto, sul ImageTarget oggetto, disabilitare il Gestore di eventi tracciabile predefinito copione.

Quindi, fare clic su Aggiungi componente e selezionare il Script di comportamento target. Dal Gerarchia pannello, fare clic con il tasto destro su ImageTarget e creare un nuovo cubo chiamato "BaseMsgstr "Questo cubo dovrebbe essere inserito nel ImageTarget oggetto.

Assicurarsi che il Base ha Box ColliderRenderizzatore di mesh abilitato. 

Facoltativamente, potresti anche inserire un Aereo oggetto dentro il ImageTarget usando il ImageTarget presentato in precedenza a Vuforia come una trama. Ciò creerebbe un effetto interessante, proiettando ombre dal bersaglio e creando un'esperienza più ricca.

Adattamento dello spawnScript

Ora adatteremo il _SpawnController usato nell'ultimo tutorial. Salva la scena corrente e aprila ShootTheCubesMain dall'ultimo tutorial. Nel Gerarchia pannello, selezionare il _SpawnController e trascinalo sul prefabbricati cartella per renderlo un Unity Prefab.

Salva questa nuova scena e riapri DefendTheBase. Trascinare _SpawnController dalla cartella prefabbricati al Gerarchia pannello. Con il _SpawnController selezionato, fare clic su Aggiungi Tag sul Ispettore pannello. Assegna un nome al nuovo tag _SpawnController e applicarlo all'oggetto. 

Nella finestra Progetto, seleziona il Cubo elemento nel Prefab cartella e impostare il suo Etichetta, torna sul suo ispettore, a 'Nemico'.

Infine, apri il Script cartella e aperto SpawnScript. Dobbiamo fare in modo che questo script si adatti alla scena caricata.

usando UnityEngine; using UnityEngine.SceneManagement; usando System.Collections; using System.Collections.Generic; usando Vuforia; classe pubblica SpawnScript: MonoBehaviour #region VARIABLES private bool mSpawningStarted = false; // Elemento cubo per generare pubblico GameObject mCubeObj; // Qtd di cubi da spawned public int mTotalCubes = 10; private int mCurrentCubes = 0; // Tempo di spawn del cubo public float mTimeToSpawn = 1f; private int mDistanceFromBase = 5; Elenco privato mCubes; private bool mIsBaseOn; scena privata mScene; #endregion // VARIABLES #region UNITY_METHODS // Usa questo per l'inizializzazione void Start () mScene = SceneManager.GetActiveScene (); mCubes = new List (); if (mScene.name == "ShootTheCubesMain") StartSpawn ();  // L'aggiornamento viene chiamato una volta per frame void Update ()  #endregion // UNITY_METHODS

Successivamente, dobbiamo creare due metodi pubblici per ricevere chiamate da TargetBehaviorScript quando l'obiettivo viene trovato o perso: 

  • BaseOn (Vector3 basePosition) verrà chiamato quando il target viene rilevato dalla fotocamera e dal Base l'oggetto è mostrato. Cambierà la posizione di spawning, avvierà il processo e informerà tutti i cubi che sono stati precedentemente aggiunti allo stage che la base è visibile.

  • Il BaseOff () il metodo sarà usato quando il bersaglio è perso. Interrompe il processo di staging e informa tutti gli elementi del cubo che la base è stata persa. 

#region PUBLIC_METHODS // Base trovata dal localizzatore pubblico void BaseOn (Vector3 basePosition) Debug.Log ("SpawnScript2: BaseOn"); mIsBaseOn = true; // cambia posizione SetPosition (basePosition); // avvia il processo di spawning se necessario StartSpawn (); // informa tutti i cubi sullo schermo che è apparso InformBaseOnToCubes ();  // Base persa dal localizzatore pubblico void BaseOff () mIsBaseOn = false; mSpawningStarted = false; // informa tutti i cubi sullo schermo che la base è persa InformBaseOffToCubes ();  #endregion // PUBLIC_METHODS

Il SetPosition (System.Nullable pos) usa la posizione corrente del target per modificare l'oggetto x, ye gli assi z, e può anche ricevere a nullo valore quando la scena è caricata ShootTheCubesMain.

#region PRIVATE_METHODS // Useremo una Coroutine per dare un piccolo // ritardo prima di impostare la posizione privata IEnumerator ChangePosition () Debug.Log ("ChangePosition"); yield return new WaitForSeconds (0.2f); // Definisce la posizione Spawn solo una volta // cambia la posizione solo se Vuforia è attivo se (VuforiaBehaviour.Instance.enabled) SetPosition (null);  // Imposta posizione private void SetPosition (System.Nullable pos) if (mScene.name == "ShootTheCubesMain") // ottiene la posizione della telecamera Transform cam = Camera.main.transform; // imposta la posizione 10 davanti alla posizione della telecamera transform.position = cam.forward * 10;  else if (mScene.name == "DefendTheBase") if (pos! = null) Vector3 basePosition = (Vector3) pos; transform.position = new Vector3 (basePosition.x, basePosition.y + mDistanceFromBase, basePosition.z); 

InformBaseOnToCubes () e InformBaseOffToCubes () sono responsabili di informare tutti i cubi in scena dello stato di base corrente.

// Informa tutti i cubi spawnati della posizione di base private void InformBaseOnToCubes () // Debug.Log ("InformBaseOnToCubes"); foreach (cubo GameObject in mCubes) cube.GetComponent () .SwitchBaseStatus (mIsBaseOn);  // Informa a tutti i cubi che la base è vuota. InformBaseOffToCubes () // Debug.Log ("InformBaseOffToCubes"); foreach (cubo GameObject in mCubes) cube.GetComponent () .SwitchBaseStatus (mIsBaseOn); 

Il SpawnLoop () e SpawnElement () i metodi utilizzano quasi la stessa logica dell'ultimo tutorial.

// Avvia il processo di spawn privato void StartSpawn () if (! MSpawningStarted) // begin spawn mSpawningStarted = true; StartCoroutine (SpawnLoop ());  // Loop spawning cube elements private IEnumerator SpawnLoop () if (mScene.name == "ShootTheCubesMain") // Definizione della posizione di spawn StartCoroutine (ChangePosition ());  yield return new WaitForSeconds (0.2f); // Spawning degli elementi while (mCurrentCubes <= (mTotalCubes - 1))  // Start the process with different conditions // depending on the current stage name if (mScene.name == "ShootTheCubesMain" || (mScene.name == "DefendTheBase" && mIsBaseOn))  mCubes.Add (SpawnElement ()); mCubes [mCurrentCubes].GetComponent () .SwitchBaseStatus (mIsBaseOn); mCurrentCubes ++;  return return new WaitForSeconds (Random.Range (mTimeToSpawn, mTimeToSpawn * 3));  // Crea un cubo privato GameObject SpawnElement () // spawn l'elemento in una posizione casuale, all'interno di una sfera immaginaria GameObject cube = Instantiate (mCubeObj, (Random.insideUnitSphere * 4) + transform.position, transform.rotation) come GameObject; // definisce una scala casuale per il cubo float scale = Random.Range (0.5f, 2f); // cambia la scala del cubo cube.transform.localScale = new Vector3 (scala, scala, scala); return cube;  #endregion // PRIVATE_METHODS

Creare i nemici

Ora dovremo creare alcuni nemici. Useremo il Cubo oggetto che abbiamo creato nell'ultimo tutorial, apportando alcune modifiche al suo script.

Nel prefabbricati cartella, aggiungi a Cubo oggetto alla gerarchia. Quindi selezionare l'oggetto e modificare il CubeBehaviorScript.

Conserveremo quasi la stessa logica in questo script, ma con le seguenti differenze:

  • Il Cubo perseguirà il Base quando il bersaglio viene rilevato dalla fotocamera.
  • Quando il Cubo colpisce il Base, distruggerà se stesso e danneggerà il Base.
  • Lo script deve conoscere il nome della scena caricata e adattarsi di conseguenza. 
usando UnityEngine; using UnityEngine.SceneManagement; usando System.Collections; public class CubeBehaviorScript: MonoBehaviour #region VARIABLES public float mScaleMax = 1f; public float mScaleMin = 0.2f; public int mCubeHealth = 100; // Orbit max Speed ​​public float mOrbitMaxSpeed ​​= 30f; public float velocityToBase = 0,4f; danno int pubblico = 10; // Orbit speed private float mOrbitSpeed; // Orbita in direzione privata Vector3 mOrbitDirection; // Max Cube Scale private Vector3 mCubeMaxScale; // Growing Speed ​​public float mGrowingSpeed ​​= 10f; private bool mIsCubeScaled = false; private bool mIsAlive = true; AudioSource privato mExplosionFx; mObase GameObject privato; private bool mIsBaseVisible = false; private Vector3 mRotationDirection; scena privata mScene; #endregion

Se il nome della scena è DefendTheBase, deve trovare il Base oggetto e iniziare a muoversi verso di esso.

#region UNITY_METHODS void Start () // Visualizza nome scena mScene = SceneManager.GetActiveScene (); CubeSettings ();  void Update () // rende l'orbita del cubo e ruota RotateCube (); if (mScene.name == "DefendTheBase") // sposta il cubo verso la base, quando è visibile MoveToBase ();  // ridimensiona cubo se necessario se (! mIsCubeScaled) ScaleObj ();  #endregion

Il CubeSettings () anche bisogno di adattarsi in base alla scena caricata. Il Cubo solo orbite sull'asse y per il DefendTheBase scena.

#region PRIVATE_METHODS private void CubeSettings () // definisce la direzione dell'orbita float x = Random.Range (-1f, 1f); float y = Random.Range (-1f, 1f); float z = Random.Range (-1f, 1f); // Tutorial per l'aggiornamento di TODO con nuovo codice // definisce le impostazioni in base al nome della scena se (mScene.name == "ShootTheCubesMain") mOrbitDirection = new Vector3 (x, y, z);  else if (mScene.name == "DefendTheBase") // orbita solo sull'asse y mOrbitDirection = new Vector3 (0, y, 0); // la dimensione della scala deve essere limitata mScaleMin = 0.05f; mScaleMax = 0.2f; velocityToBase = 0.2f;  // ruota attorno al proprio asse float rx = Random.Range (-1f, 1f); float ry = Random.Range (-1f, 1f); float rz = Random.Range (-1f, 1f); mRotationDirection = new Vector3 (rx, ry, rz); // definizione della velocità mOrbitSpeed ​​= Random.Range (5f, mOrbitMaxSpeed); // defining scale float scale = Random.Range (mScaleMin, mScaleMax); mCubeMaxScale = new Vector3 (scala, scala, scala); // imposta la scala del cubo a 0, per farla crescere più tardi transform.localScale = Vector3.zero; // ottenendo Esplosione effetto sonoro mExplosionFx = GetComponent (); 

Aggiungeremo una nuova logica al RotateCube () metodo. Gli oggetti cubo ruotano attorno alla base mentre il bersaglio è visibile. Quando il bersaglio non è visibile, continuerà a ruotare attorno al telecamera, usando la stessa logica dell'ultimo tutorial.

// Ruota il cubo attorno al vuoto privato di base RotateCube () // ruota attorno alla base o alla telecamera se (mIsBaseVisible && mBase! = Null && mIsAlive) // ruota attorno al cubo transform.RotateAround (mBase.transform.position, mOrbitDirection , mOrbitSpeed ​​* Time.deltaTime);  else transform.RotateAround (Camera.main.transform.position, mOrbitDirection, mOrbitSpeed ​​* Time.deltaTime);  transform.Rotate (mRotationDirection * 100 * Time.deltaTime);  // Scala oggetto da 0 a 1 privato vuoto ScaleObj () // crescente obj if (transform.localScale! = MCubeMaxScale) transform.localScale = Vector3.Lerp (transform.localScale, mCubeMaxScale, Time.deltaTime * mGrowingSpeed); else mIsCubeScaled = true; 

Per spostare l'oggetto verso la base, dovremo prima controllare se la base è presente e quindi applicare i passaggi di posizione all'oggetto.

 // Sposta il cubo verso il vuoto privato di base MoveToBase () // fai muovere il cubo verso la base solo se la base è presente se (mIsBaseVisible && mIsAlive && gameObject! = Null && mBase! = Null) float step = velocityToBase * Time.deltaTime; transform.position = Vector3.MoveTowards (transform.position, mBase.transform.position, step); 

Il DestroyCube () il metodo è lo stesso di prima, ma ora aggiungeremo un nuovo metodo: il TargetHit (GameObject) metodo - che verrà chiamato quando viene colpita la base. Si noti che il BaseHealthScript referenziato in TargetHit () non è stato ancora creato.

// infligge un danno sul target privato target TargetHit (obiettivo GameObject) Debug.Log ("TargetHit:" + target.name); if (target.name == "Base") // crea danni sulla base MyBase baseCtr = target.GetComponent (); baseCtr.TakeHit (danno); StartCoroutine (DestroyCube ());  // Destroy Cube private IEnumerator DestroyCube () mIsAlive = false; mExplosionFx.Play (); GetComponent() .enabled = false; yield return new WaitForSeconds (mExplosionFx.clip.length); Destroy (gameObject);  #endregion

Infine, aggiungeremo i metodi pubblici da chiamare quando il cubo subisce un colpo, quando entra in collisione con la base, o quando la base cambia stato.

#region PUBLIC_METHODS // Cube gor Hit // restituisce 'false' quando il cubo è stato distrutto public bool Hit (int hitDamage) mCubeHealth - = hitDamage; if (mCubeHealth> = 0 && mIsAlive) StartCoroutine (DestroyCube ()); ritorna vero;  return false;  pubblico vuoto OnCollisionEnter (Collision coll) TargetHit (col.gameObject);  // Ricevi lo stato attuale della base public void SwitchBaseStatus (bool isOn) // ferma il cubo sul movimento verso la base mIsBaseVisible = isOn; if (isOn) mBase = GameObject.Find ("Base");  else mBase = null;  #endregion

Controllare la salute di base

I nemici sono messi in scena e volano verso la base, ma non causano alcun danno quando si scontrano, né alla base né al nemico. Abbiamo bisogno di creare uno script per rispondere alle collisioni e anche di aggiungere una barra della salute allo schermo, in modo che l'utente sappia come stanno facendo.

Iniziamo ad aggiungere la barra della salute. Nel Gerarchia pannello nell'editor di Unity, fare clic su Creare > UI > Slider. Una nuova Tela l'elemento verrà aggiunto alla gerarchia. Contiene elementi dell'interfaccia utente, incluso il nuovo Slider. Espandi il Tela e selezionare il Slider.

Cambia il nome dell'elemento del cursore su UIHealth. Nel Ispettore pannello, espandere Retta trasformazione e impostare Larghezza a 400 e Altezza a 40. Impostato Pos X a -220Pos Y 30, e Pos Z a 0.

Ora espandi lo script del cursore nella gerarchia. Deseleziona il interactable opzione. Per Grafica di destinazione, clicca sul piccolo 'punto' sul lato destro e seleziona il sfondo Immagine. 

  • Impostare il Valore minimo a 0 e Valore massimo a 100.
  • Selezionare Numeri interi.
  • Impostato Valore a 100.

Ora, espandi il Slider pannello per esporre i suoi elementi figli: sfondo, Area di riempimento, e Gestire la diapositiva.

  • Elimina Gestire la diapositiva.
  • Selezionare sfondo e impostare il suo Colore ad una tonalità di verde più scura, come # 12F568FF.
  • Espandere Area di riempimento e selezionare il Riempire oggetto e impostare il suo colore a # 7FEA89FF.

Questo è come il Finestra di gioco dovrebbe guardare con la barra della salute.

Lo script di salute di base

Il codice è molto semplice; sottrae semplicemente il danno fatto dai nemici dall'ammontare totale della salute della base. Una volta che la salute si azzera, il giocatore perde la partita. Aggiungerà anche un'animazione di rotazione alla Base. Crea un nuovo script C # chiamato MyBase.

usando UnityEngine; utilizzando UnityEngine.UI; usando System.Collections; public class MyBase: MonoBehaviour #region VARIABLE public float rotationSpeed ​​= 10f; pubblico int health = 100; public AudioClip explosionSoundFx; pubblico AudioClip hitSoundFx; // TODO sceglie un suono diverso per Hit bool privato mIsAlive = true; private AudioSource mAudioSource; Slider pubblico mHealthSlider; #endregion // VARIABLES #region UNITY_METHODS // Usa questo per l'inizializzazione void Start () mAudioSource = GetComponent (); mHealthSlider.maxValue = salute; mHealthSlider.value = salute;  // L'aggiornamento viene chiamato una volta per frame void Update () RotateBase ();  #endregion // UNITY_REGION #region PRIVATE_METHODS private void RotateBase () if (mIsAlive && gameObject! = null) // implementare la rotazione degli oggetti transform.Rotate (Vector3.up, rotationSpeed ​​* Time.deltaTime);  // Destroy base private IEnumerator DestroyBase () mIsAlive = false; mAudioSource.clip = explosionSoundFx; mAudioSource.Play (); GetComponent () .enabled = false; // informa tutti i nemici che la base è persa GameObject [] enemy = GameObject.FindGameObjectsWithTag ("Enemy"); foreach (GameObject e nei nemici) e.gameObject.GetComponent () .SwitchBaseStatus (false);  return return new WaitForSeconds (mAudioSource.clip.length); Destroy (gameObject);  #endregion // PRIVATE_METHODS #region PUBLIC_METHODS // riceve danno pubblico come TakeHit (int damage) health - = damage; mHealthSlider.value = salute; se (salute <= 0)  StartCoroutine (DestroyBase ());  else  mAudioSource.clip = hitSoundFx; mAudioSource.Play ();   #endregion // PUBLIC_METHODS 

Ora dobbiamo aggiungere e configurare lo script. 

Seleziona il Base nella gerarchia, fare clic su Aggiungi componente, e aggiungere un Sorgente Audio. Ora trascina MyBase al Base elemento e, nel Ispettore pannello, espandere MyBase. Seleziona un effetto sonoro per l'esplosione e colpisci. Ho usato il esplosione clip utilizzata nell'ultimo tutorial, ma sentiti libero di aggiungere il tuo. Finalmente, nel Cursore della salute, seleziona il UISlider elemento.

Difendere la Base

La nostra nuova esperienza di gioco è quasi terminata. Abbiamo solo bisogno di sparare alcuni laser per iniziare a difendere la nostra base. Creiamo uno script per il laser! 

Prima trascina il _PlayerController dal Prefab cartella nella gerarchia. Espandere _PlayerController e selezionare _LaserController. Nel Ispettore pannello, trova Script laser e fare clic su modificare.

L'unica cosa che dobbiamo cambiare in questo script è la posizione del laser.

// Shot the Laser private void Fire () // Get ARCamera Transform Transform cam = Camera.main.transform; // Definisci il tempo del prossimo incendio mNextFire = Time.time + mFireRate; // Imposta l'origine di RayCast Vector3 rayOrigin = cam.position; // Mostra il laser usando una Coroutine StartCoroutine (LaserFx ()); // Contiene l'hit Hit di RaycastHit; // Imposta la posizione di origine della linea laser // Aggiungerà 10 unità giù dalla ARCamera // Abbiamo adottato questa logica per semplicità Vector3 laserStartPos = new Vector3 (cam.position.x, cam.position.y -2f, cam .position.z); mLaserLine.SetPosition (0, laserStartPos); // Controlla se RayCast ha colpito qualcosa se (Physics.Raycast (rayOrigin, cam.forward, out hit, mFireRange)) // Imposta la fine della linea laser sull'oggetto hit mLaserLine.SetPosition (1, hit.point) ; // controlla il tipo di destinazione if (hit.collider.tag == "Enemy") CubeBehaviorScript cubeCtr = hit.collider.GetComponent (); if (cubeCtr! = null) if (hit.rigidbody! = null) hit.rigidbody.AddForce (-hit.normal * mHitForce); cubeCtr.Hit (mLaserDamage);  else // Imposta l'enfo della linea laser per far avanzare la telecamera // usando l'intervallo Laser mLaserLine.SetPosition (1, cam.forward * mFireRange); 

Provare il gioco

 

È stato un sacco di lavoro, ma ora è il momento di giocare! Stampa l'immagine di destinazione e prova a eseguire il gioco sul tuo telefono o tablet. Divertiti con esso e vedi se riesci a trovare alcuni modi per migliorare il gioco! 

A questo punto, hai una buona comprensione di come funziona il sistema Vuforia e come usarlo con Unity. Mi aspetto che tu abbia apprezzato questo viaggio tanto quanto me. A presto!

Per ulteriori informazioni su Augmented Reality con Vuforia e Unity, consulta il nostro corso video qui su Envato Tuts+!