Creëer een Pokémon GO Style Augmented Reality-spel met Vuforia beelddoelen

In deze zelfstudie duiken we terug in de Vuforia Augmented Reality (AR) -bibliotheek en verkennen we een van de meest interessante bronnen: het beelddoel. We zullen het Shoot the Cubes-spel dat we in eerdere lessen hebben gemaakt uitbreiden met een nieuw niveau waarbij de speler zijn basis moet verdedigen tegen aanvallende kubussen. 

 

Deze tutorial kan alleen worden voltooid, maar als je een inleiding tot AR wilt met Vuforia en Unity3D, bekijk dan de eerdere berichten in de serie.

Beelddoelen

Elke soort afbeelding kan een Vuforia Image Target zijn. Hoe gedetailleerder en ingewikkelder het beeld, hoe beter het door het algoritme zal worden herkend. 

Veel van de factoren zullen deel uitmaken van de herkenningsberekening, maar in principe moet het beeld een redelijk niveau van contrast, resolutie en onderscheidende elementen hebben. Een blauwe luchtfoto zou niet zo goed werken, maar een afbeelding van wat gras zou sierlijk werken. Beelddoelen kunnen met de toepassing worden verzonden, via de cloud naar de toepassing worden geüpload of door de gebruiker rechtstreeks in de app worden gemaakt.

Een doel toevoegen

Laten we beginnen met het toevoegen van een ImageTarget element voor ons Unity-project. 

Download eerst de cursusactiva van de knop in de zijbalk. Maak vervolgens in uw Unity-project een nieuwe scène genaamd DefendTheBase: in de project venster, selecteert u de scenes map en klik op creëren > Tafereel. Open nu die scène en verwijder alle standaardscenevoorwerpen uit de hiërarchie.

Vervolgens voegen we een licht en een camera toe. Klik op Toevoegen > Licht > Directional Light om een ​​gericht licht toe te voegen. Selecteer dit nieuwe licht en stel in Zachte schaduw als de Schaduwtype keuze. 

Hierna sleep je een ARCamera object van Vuforia > prefabs. Selecteer de ARCamera object en in het infovenster, stelt u de App licentie sleutel gemaakt op de ontwikkelaarspagina van Vuforia (zie de eerste handleiding voor instructies). kiezen DEVICE_TRACKING voor de World Center Mod.

Sleep ten slotte een en ImageTargetnaar de hiërarchie van Vuforia > prefabs.

Nu moeten we een Vuforia-database toevoegen. Ga eerst naar https://developer.vuforia.com/target-manager. Klik op Database toevoegen en kies een naam.

Er zijn drie soorten databases om uit te kiezen:

  1. Apparaat: De database wordt op het apparaat opgeslagen en alle doelen worden lokaal bijgewerkt.
  2. Wolk: Database op de Vuforia-servers.
  3. VuMark: Database exclusief voor VuMark-doelen. Het wordt ook opgeslagen op het apparaat.

Kies in dit geval de Apparaat optie en klik op creëren.

Selecteer de nieuwe database zodat we kunnen beginnen met het toevoegen van doelen. Nu is het tijd om doelen toe te voegen aan de database. Voor nu gebruiken we alleen de Enkele afbeelding keuze.

Navigeer naar de eerder gedownloade bestanden, kies ImageTarget1, en stel zijn Breedte naar 1 en klik op Toevoegen. (Opmerking: als u er de voorkeur aan geeft uw eigen beelddoel te maken, lees dan eerst de gids.)

Nu kunt u de database downloaden en selecteren Unity Editor als het gekozen platform. Open het bestand en selecteer alle elementen die moeten worden geïmporteerd. We moeten ook onze scène Unity voorbereiden om de ImageTarget met deze database die we hebben gemaakt.

Klik in de Unity-editor op de ikmageTarget voorwerp. Zoek eerst en expandeer Afbeelding doelgedrag in de objectinspecteur. Selecteer een Type van Vooraf gedefinieerde. Kies het afbeeldingsdoel dat we eerder hebben gemaakt Database. Zorg er ten slotte voor dat de Uitgebreide tracking inschakelen en Schakel slim terrein in opties zijn beide uitgeschakeld.

De ImageTarget prefab is gemaakt van een reeks componenten, waaronder enkele scripts zoals Afbeelding doelgedrag, Turn uit gedrag, en Standaard Tracker Event-handler. Als u diepgaand wilt begrijpen hoe het systeem werkt, lees dan die scripts en probeer hun relatie met andere componenten te begrijpen. 

Voor deze zelfstudie graven we echter niet te diep. We zullen ons alleen moeten concentreren op de Standaard Tracker Event-handler, die oproepen ontvangt wanneer de tracking-status van het beelddoel verandert. Laten we dit script gebruiken als basis om ons eigen scriptgedrag te creëren.

Maak een kopie van dit script dat we kunnen uitbreiden. Selecteer eerst Standaard Tracker Event-handler, Klik op opties en selecteer Bewerk script. Maak nu een kopie van het script. Als u MonoDevelop gebruikt, klikt u op het dossier > Opslaan als en opslaan als ImageTargetBehavior, opslaan in de scripts map.

Het TargetBehaviorScript-script

We hebben het niet nodig Vuforia naamruimte in ons script. Verwijder de regel "naamruimte VuforiaEn de haakjes. Dat betekent dat we expliciet moeten verwijzen naar de Vuforia naamruimte wanneer we toegang willen tot zijn klassen: 

gebruikmakend van UnityEngine; met behulp van System.Collections; public class BaseScript: MonoBehaviour, Vuforia.ITrackableEventHandler // code hier

De belangrijkste methode in deze klasse is de OnTrackableStateChanged methode die oproepen ontvangt wanneer het beelddoel wordt gevonden of verloren door het camera-apparaat. Volgens de doelstatus belt hij OnTrackingFound of OnTrackingLost, en we moeten die methoden ook bewerken. Maar laten we eerst eens nadenken over hoe we willen dat het beelddoel zich gedraagt. 

In dit spel verdedigt de gebruiker een basis die op een afbeelding wordt weergegeven. Laten we de volgende spelmechanismen bekijken:

  • Zodra het doel wordt herkend door het systeem, verschijnt de basis en vijanden beginnen te spawnen en vliegen naar de basis in een kamikaze-stijl.
  • Elke keer dat een vijand de basis raakt, zal de basis wat schade aanrichten en zal de vijand worden vernietigd.
  • Om het spel te winnen moet de gebruiker alle vijanden schieten en vernietigen voordat de basis wordt vernietigd.
  • Als het afbeeldingsdoel verloren gaat (is niet meer zichtbaar vanaf de camera van het apparaat), start het spel een afteltimer. Als de timer op nul komt, is het spel verloren. Terwijl het doelwit verloren is, stoppen alle vijanden met het opgaan naar de basis.

Dus we moeten die game-mechanica aanpassen bovenop wat we in de vorige tutorial hebben gebouwd. We maken de vijandelijke spawn-logica in de volgende sectie met een leeg object met de naam _SpawnController, dezelfde logica gebruiken die in het eerste deel van het spel is gebruikt.

Laten we voorlopig kijken naar de logica voor het traceren van de gegevens.

private void OnTrackingFound () EnableRendererAndCollider (); // Informeer het systeem dat het doel is gevonden StartCoroutine (InformSpawnCtr (true));  private void OnTrackingLost () DisableRendererAndCollider (); // Informeer het systeem dat het doel verloren was StartCoroutine (InformSpawnCtr (false));  // SpanController op de hoogte dat de basis is opgericht. private IEnumerator InformSpawnCtr (bool isOn) // verplaatsing van de spa GameObject spawn = GameObject.FindGameObjectWithTag ("_SpawnController"); opbrengst retourneert nieuwe WaitForSeconds (0,2f); // inform SpanController als (isOn) spawn.GetComponent () .BaseOn (transform.position);  else spawn.GetComponent () .BaseOff (); 

Terug in de Unity-editor kunnen we het basisobject maken dat wordt uitgelokt door de spawn-controller. 

Ten eerste, op de ImageTarget object, schakel de Standaard Trackable Event Handler script.

Klik vervolgens op Component toevoegen en selecteer de Target Behavior Script. Van de Hiërarchie paneel, klik met de rechtermuisknop op ImageTarget en maak een nieuwe kubus met de naam "BaserenDeze kubus moet in de ImageTarget voorwerp.

Zorg ervoor dat de Baseren heeft Box Collider en Mesh Renderer ingeschakeld. 

Eventueel kunt u ook een invoegen Vlak object binnen de ImageTarget de ... gebruiken ImageTarget eerder in Vuforia als een textuur ingediend. Dit zou een interessant effect creëren, schaduwen van het doel projecteren en een rijkere ervaring creëren.

De SpawnScript aanpassen

Nu zullen we het aanpassen _SpawnController gebruikt in de laatste zelfstudie. Sla de huidige scène op en open deze ShootTheCubesMain van de laatste zelfstudie. In de Hiërarchie paneel, selecteer de _SpawnController en sleep het naar de prefabs map om er een te maken Eenheid Prefab.

Sla deze nieuwe scène op en heropend DefendTheBase. Slepen _SpawnController van de prefab-map naar de Hiërarchie paneel. Met de _SpawnController geselecteerd, klik op Tag toevoegen op de Inspecteur paneel. Geef de nieuwe tag een naam _SpawnController en pas het op het object toe. 

Selecteer de in het projectvenster Kubus element in de prefab map en stel het in Label, terug op zijn inspecteur, naar 'Enemy'.

Open ten slotte de scripts map en open SpawnScript. We moeten dit script laten aanpassen aan de geladen scène.

gebruikmakend van UnityEngine; gebruik van UnityEngine.SceneManagement; met behulp van System.Collections; met behulp van System.Collections.Generic; gebruikmakend van Vuforia; public class SpawnScript: MonoBehaviour #region VARIABLES private bool mSpawningStarted = false; // Kubuselement om openbaar te spawnen GameObject mCubeObj; // Qtd van kubussen om openbaar te worden gepubliceerd int mTotalCubes = 10; private int mCurrentCubes = 0; // Tijd om de Cubes openbaar te laten zweven mTimeToSpawn = 1f; private int mDistanceFromBase = 5; privélijst mCubes; private bool mIsBaseOn; privéscène mScene; #endregion // VARIABLES #region UNITY_METHODS // Gebruik dit voor initialisatie void Start () mScene = SceneManager.GetActiveScene (); mCubes = nieuwe lijst (); if (mScene.name == "ShootTheCubesMain") StartSpawn ();  // Update wordt eenmaal per frame ongeldig Update ()  #endregion // UNITY_METHODS

Vervolgens moeten we twee openbare methoden maken om oproepen van te ontvangen TargetBehaviorScript wanneer het doelwit is gevonden of verloren is gegaan: 

  • BaseOn (Vector3 basePosition) wordt gebeld wanneer het doelwit wordt gevonden door de camera en de Baseren object wordt getoond. Het verandert de spawningpositie, start het proces en informeert alle kubussen die eerder aan de stage zijn toegevoegd, zodat de base zichtbaar is.

  • De BaseOff () methode zal worden gebruikt wanneer het doelwit verloren is. Het stopt het stagingproces en informeert alle kubuselementen dat de basis verloren was gegaan. 

#region PUBLIC_METHODS // Base werd gevonden door de tracker public void BaseOn (Vector3 basePosition) Debug.Log ("SpawnScript2: BaseOn"); mIsBaseOn = true; // verander positie SetPosition (basePosition); // start zo nodig paaiproces StartSpawn (); // informeer alle kubussen op het scherm dat de base leek InformBaseOnToCubes ();  // Base verloren door de tracker public void BaseOff () mIsBaseOn = false; mSpawningStarted = false; // informeer alle kubussen op het scherm dat basis verloren is InformBaseOffToCubes ();  #endregion // PUBLIC_METHODS

De SetPosition (System.Nullable pos) gebruikt de huidige positie van het doel om de x-, y- en z-assen van het object aan te passen, en het kan ook een nul waarde wanneer de scène geladen is ShootTheCubesMain.

#region PRIVATE_METHODS // We gebruiken een Coroutine om een ​​beetje // delay te geven voordat de positie wordt ingesteld private IEnumerator ChangePosition () Debug.Log ("ChangePosition"); opbrengst retourneert nieuwe WaitForSeconds (0,2f); // Definieer de spawn-positie slechts eenmaal // verander de positie alleen als Vuforia actief is als (VuforiaBehavi.Instance.ingeschakeld) SetPosition (null);  // Set position private void SetPosition (System.Nullable pos) if (mScene.name == "ShootTheCubesMain") // verkrijg de camerapositie Transform cam = Camera.main.transform; // plaats de positie 10 eenheden voor de camerapositie 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 () en InformBaseOffToCubes () zijn verantwoordelijk voor het informeren van alle gefaseerde kubussen van de huidige basisstatus.

// Informeer alle voortgebrachte kubussen van de basispositie private void InformBaseOnToCubes () // Debug.Log ("InformBaseOnToCubes"); foreach (GameObject-kubus in mCubes) cube.GetComponent () .SwitchBaseStatus (mIsBaseOn);  // Informeer aan alle kubussen dat het basisstation van privé is ongeldig InformBaseOffToCubes () // Debug.Log ("InformBaseOffToCubes"); foreach (GameObject-kubus in mCubes) cube.GetComponent () .SwitchBaseStatus (mIsBaseOn); 

De SpawnLoop () en SpawnElement () methoden gebruiken bijna dezelfde logica als de laatste zelfstudie.

// Start spawning proces private void StartSpawn () if (! MSpawningStarted) // begin spawn mSpawningStarted = true; StartCoroutine (SpawnLoop ());  // Loop Spawning cube elements private IEnumerator SpawnLoop () if (mScene.name == "ShootTheCubesMain") // Definitie van de spawnpositie StartCoroutine (ChangePosition ());  opbrengst retourneert nieuwe WaitForSeconds (0,2f); // Paaien van de elementen terwijl (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 ++;  opbrengst retourneer nieuwe WaitForSeconds (Random.Range (mTimeToSpawn, mTimeToSpawn * 3));  // Een kubus privà © spoelen GameObject SpawnElement () // spawn het element op een willekeurige positie, binnen een denkbeeldige bol GameObject cube = Instantiate (mCubeObj, (Random.insideUnitSphere * 4) + transform.position, transform.rotation) als GameObject; // definieer een willekeurige schaal voor de kubusvlotterschaal = Willekeurig.bereik (0.5f, 2f); // verander de kubusschaal cube.transform.localScale = new Vector3 (schaal, schaal, schaal); terugkeer kubus;  #endregion // PRIVATE_METHODS

De vijanden maken

Nu moeten we een aantal vijanden maken. We zullen de gebruiken Kubus object dat we in de laatste zelfstudie hebben gemaakt, waarbij we enkele wijzigingen in het script aanbrengen.

In de prefabs map, voeg een toe Kubus bezwaar tegen de hiërarchie. Selecteer vervolgens het object en bewerk de CubeBehaviorScript.

We behouden bijna dezelfde logica in dit script, maar met de volgende verschillen:

  • De Kubus zal de Baseren wanneer het doelwit door de camera wordt gevonden.
  • Wanneer de Kubus raakt de Baseren, het zal zichzelf vernietigen en wat schade toebrengen aan de Baseren.
  • Het script moet de naam van de geladen scène weten en zich dienovereenkomstig aanpassen. 
gebruikmakend van UnityEngine; gebruik van UnityEngine.SceneManagement; met behulp van System.Collections; public class CubeBehaviorScript: MonoBehaviour #region VARIABLES public float mScaleMax = 1f; openbare float mScaleMin = 0.2f; public int mCubeHealth = 100; // Orbit max Speed ​​public float mOrbitMaxSpeed ​​= 30f; public float velocityToBase = 0.4f; openbare int schade = 10; // Orbit speed private float mOrbitSpeed; // Orbit direction private Vector3 mOrbitDirection; // Max. Kubusschaal privé Vector3 mCubeMaxScale; // Groeisnelheid openbare float mGrowingSpeed ​​= 10f; private bool mIsCubeScaled = false; private bool mIsAlive = true; private AudioSource mExplosionFx; privé GameObject mBase; private bool mIsBaseVisible = false; privé Vector3 mRotationDirection; privéscène mScene; #endregion

Als de naam van de scène is DefendTheBase, het moet het vinden Baseren voorwerp en begin er naartoe te bewegen.

#region UNITY_METHODS void Start () // Scènenaam ophalen mscene = SceneManager.GetActiveScene (); CubeSettings ();  void Update () // maakt de baan van de kubus en roteert RotateCube (); if (mScene.name == "DefendTheBase") // verplaats de kubus naar de basis, wanneer deze zichtbaar is MoveToBase ();  // schaal kubus indien nodig indien (! mIsCubeScaled) ScaleObj ();  #endregion

De CubeSettings () moet ook aanpassen aan de geladen scène. De Kubus alleen banen op de y-as voor de DefendTheBase tafereel.

#region PRIVATE_METHODS private void CubeSettings () // definieert de orbit direction float x = Random.Range (-1f, 1f); zweven y = Random.Range (-1f, 1f); float z = Random.Range (-1f, 1f); // TODO update-zelfstudie met nieuwe code // definieer instellingen volgens scènenaam if (mScene.name == "ShootTheCubesMain") mOrbitDirection = new Vector3 (x, y, z);  else if (mScene.name == "DefendTheBase") // orbit alleen op y-as mOrbitDirection = new Vector3 (0, y, 0); // schaalgrootte moet beperkt zijn mScaleMin = 0.05f; mScaleMax = 0,2f; velocityToBase = 0.2f;  // roterend rond zijn as float rx = Random.Range (-1f, 1f); float ry = Random.Range (-1f, 1f); float rz = Random.Range (-1f, 1f); mRotationDirection = new Vector3 (rx, ry, rz); // defining speed mOrbitSpeed ​​= Random.Range (5f, mOrbitMaxSpeed); / / definiërende schaal float schaal = Random.Range (mScaleMin, mScaleMax); mCubeMaxScale = new Vector3 (schaal, schaal, schaal); // stel de kubusweger in op 0, om later te laten groeien transform.localScale = Vector3.zero; // krijgt Explosion Sound Effect mExplosionFx = GetComponent (); 

We zullen wat nieuwe logica toevoegen aan de RotateCube () methode. De kubusobjecten draaien rond de basis terwijl het doel zichtbaar is. Als het doelwit niet zichtbaar is, blijven ze draaien rond de Camera, met behulp van dezelfde logica als in de laatste zelfstudie.

// Roteer de kubus rond de basis privé-leegte RotateCube () // roteer rond basis of camera als (mIsBaseVisible && mBase! = Null && mIsAlive) // draai de kubus rond basistransformatie. 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);  // Schaalobject van 0 tot 1 private void ScaleObj () // growing obj if (transform.localScale! = MCubeMaxScale) transform.localScale = Vector3.Lerp (transform.localScale, mCubeMaxScale, Time.deltaTime * mGrowingSpeed); else mIsCubeScaled = true; 

Als u het object naar het basisstation wilt verplaatsen, moeten we eerst controleren of het voetstuk aanwezig is en vervolgens de positiestappen toepassen op het object.

 // Verplaats de kubus naar de basis private void MoveToBase () // laat de kubus alleen in de richting van de basis bewegen als base aanwezig is als (mIsBaseVisible && mIsAlive && gameObject! = Null && mBase! = Null) float step = velocityToBase * Time.deltaTime; transform.position = Vector3.MoveTowards (transform.position, mBase.transform.position, step); 

De DestroyCube () methode is hetzelfde als voorheen, maar nu voegen we een nieuwe methode toe: de TargetHit (GameObject) methode - die wordt aangeroepen wanneer de base wordt geraakt. Merk op dat de BaseHealthScript waarnaar wordt verwezen in TargetHit () is nog niet gemaakt.

// maak een schade op het doel private void TargetHit (GameObject target) Debug.Log ("TargetHit:" + target.name); if (target.name == "Base") // schade aanbrengen op basis MyBase baseCtr = target.GetComponent (); baseCtr.TakeHit (schade); StartCoroutine (DestroyCube ());  // Vernietig Cube private IEnumerator DestroyCube () mIsAlive = false; mExplosionFx.Play (); GetComponent() .enabled = false; opbrengst retourneert nieuwe WaitForSeconds (mExplosionFx.clip.length); Vernietigen (gameObject);  #endregion

Ten slotte voegen we de openbare methoden toe die moeten worden aangeroepen wanneer de kubus een hit treft, wanneer deze botst met de basis, of wanneer de basis de status wijzigt.

#region PUBLIC_METHODS // Kubus gor Hit // return 'false' als kubus werd vernietigd public bool Hit (int hit Damage) mCubeHealth - = hit Damage; if (mCubeHealth> = 0 && mIsAlive) StartCoroutine (DestroyCube ()); geef waar terug;  return false;  public void OnCollisionEnter (Coll Coll) TargetHit (col.gameObject);  // Ontvang huidige basisstatus public void SwitchBaseStatus (bool is On) // stop de kubus op de verplaatsing naar basis mIsBaseVisible = isOn; if (isOn) mBase = GameObject.Find ("Base");  else mBase = null;  #endregion

De basisgezondheid beheersen

De vijanden worden geënsceneerd en vliegen naar de basis, maar ze veroorzaken geen schade als ze botsen, noch tegen de basis noch tegen de vijand. We moeten een script maken om te reageren op botsingen en ook een gezondheidsbalk aan het scherm toevoegen, zodat de gebruiker weet hoe goed ze het doen.

Laten we beginnen met het toevoegen van de gezondheidsbalk. In de Hiërarchie paneel in de Unity-editor, klik op creëren > UI > schuif. Een nieuw Canvas element wordt toegevoegd aan de hiërarchie. Het bevat UI-elementen, inclusief het nieuwe schuif. Vouw het Canvas en selecteer de schuif.

Wijzig de naam van het schuifregelaarelement in UIHealth. In de Inspecteur paneel, uitbreiden Rect Transform En instellen Breedte naar 400 en Hoogte naar 40. set Pos X naar -220Pos Y naar 30, en Pos Z naar 0.

Breid nu het schuifregenscript uit in de hiërarchie. Deselecteer de Interactable keuze. Voor Target grafisch, klik op de kleine 'stip' aan de rechterkant en selecteer de Achtergrond beeld. 

  • Stel de Min waarde naar 0 en Maximum waarde naar 100.
  • kiezen Hele getallen.
  • set Waarde naar 100.

Breid nu het schuif paneel om de onderliggende elementen zichtbaar te maken: Achtergrond, Vul gebied, en Behandel het schuifgebied.

  • Verwijder Behandel het schuifgebied.
  • kiezen Achtergrond en stel zijn Kleur naar een donkerdere schaduw van groen, zoals # 12F568FF.
  • Uitbreiden Vul gebied en selecteer de Vullen object en stel de kleur in # 7FEA89FF.

Dit is hoe het Game Window zou moeten kijken met de gezondheidsbalk.

Het Base Health Script

De code is heel eenvoudig; het trekt alleen de schade van de vijanden af ​​van de totale hoeveelheid basisgezondheid. Zodra de gezondheid op nul komt, verliest de speler het spel. Het voegt ook een rotatie-animatie toe aan de Base. Maak een nieuw C # -script met de naam MyBase.

gebruikmakend van UnityEngine; gebruikmakend van UnityEngine.UI; met behulp van System.Collections; public class MyBase: MonoBehaviour #region VARIABLE public float rotationSpeed ​​= 10f; openbare int gezondheid = 100; openbare AudioClip explosionSoundFx; openbare AudioClip hitSoundFx; // TODO kies een ander geluid voor de Hit private bool mIsAlive = true; private AudioSource mAudioSource; openbare Slider mHealthSlider; #endregion // VARIABLES #region UNITY_METHODS // Gebruik dit voor initialisatie void Start () mAudioSource = GetComponent (); mHealthSlider.maxValue = gezondheid; mHealthSlider.value = gezondheid;  // Update wordt eenmaal per frame ongeldig Update () RotateBase ();  #endregion // UNITY_REGION #region PRIVATE_METHODS private void RotateBase () if (mIsAlive && gameObject! = null) // implementeer objectrotatie transform.Rotate (Vector3.up, rotationSpeed ​​* Time.deltaTime);  // Vernietig base private IEnumerator DestroyBase () mIsAlive = false; mAudioSource.clip = explosionSoundFx; mAudioSource.Play (); GetComponent () .enabled = false; // informeer alle vijanden dat Base verloren is GameObject [] enemies = GameObject.FindGameObjectsWithTag ("Enemy"); foreach (GameObject e in vijanden) e.g.Object.GetComponent () .SwitchBaseStatus (false);  opbrengst retourneert nieuwe WaitForSeconds (mAudioSource.clip.length); Vernietigen (gameObject);  #endregion // PRIVATE_METHODS #region PUBLIC_METHODS // ontvang schade openbare ongeldige TakeHit (int schade) gezondheid - = schade; mHealthSlider.value = gezondheid; als (gezondheid <= 0)  StartCoroutine (DestroyBase ());  else  mAudioSource.clip = hitSoundFx; mAudioSource.Play ();   #endregion // PUBLIC_METHODS 

Nu moeten we het script toevoegen en configureren. 

Selecteer de Baseren in de hiërarchie, klik op Component toevoegen, en voeg een toe Geluidsbron. Sleep nu MyBase naar de Baseren element en, in de Inspecteur paneel, uitbreiden MyBase. Selecteer een geluidseffect voor de explosie en druk op. Ik heb de explosie clip gebruikt in de laatste zelfstudie, maar voel je vrij om je eigen tutorial toe te voegen. Eindelijk, in de Health Slider, selecteer de UISlider element.

De basis verdedigen

Onze nieuwe game-ervaring is bijna klaar. We hoeven alleen maar wat lasers te schieten om onze basis te verdedigen. Laten we een script voor de laser maken! 

Sleep eerst de _PlayerController van de prefab map naar de hiërarchie. Uitbreiden _PlayerController en selecteer _LaserController. In de Inspecteur paneel, vind Laserscript en klik op Bewerk.

Het enige dat we in dit script moeten veranderen, is de positie van de laser.

// Shot the Laser private void Fire () // Get ARCamera Transform Transform cam = Camera.main.transform; // Definieer de tijd van de volgende brand mNextFire = Time.time + mFireRate; // Stel de oorsprong van de RayCast Vector3 rayOrigin = cam.position in; // Laat de laser zien met een Coroutine StartCoroutine (LaserFx ()); // Houdt de Hit-informatie vast Raycast Hit hit; // Stel de oorsprongspositie van de laserlijn in // Het voegt 10 eenheden toe vanaf de ARCamera // We hebben deze logica overgenomen voor eenvoud Vector3 laserStartPos = new Vector3 (cam.position.x, cam.position.y -2f, cam .position.z); mLaserLine.SetPosition (0, laserStartPos); // Controleert of de RayCast iets geraakt als (Physics.Raycast (rayOrigin, cam.forward, out hit, mFireRange)) // Zet het einde van de Laserlijn op het object hit mLaserLine.SetPosition (1, hit.point) ; // controleer het doeltype als (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 // Stel het enfo van de laserlijn in om de camera vooruit te sturen // met het laserbereik mLaserLine.SetPosition (1, cam.forward * mFireRange); 

Het spel proberen

 

Dat was veel werk, maar nu is het tijd om het spel te spelen! Print de doelafbeelding uit en probeer je game op je telefoon of tablet uit te voeren. Heb er wat plezier mee en kijk of je een aantal manieren kunt verzinnen om het spel te verbeteren! 

Op dit moment hebt u een goed begrip van hoe het Vuforia-systeem werkt en hoe u het met Unity kunt gebruiken. Ik verwacht dat je net zoveel van deze reis hebt genoten als ik. Tot ziens!

Voor meer informatie over Augmented Reality met Vuforia en Unity, bekijk onze videocursus hier op Envato Tuts+!