Créez un jeu de réalité augmentée de style Pokémon GO avec Vuforia Cibles d'image

Dans ce didacticiel, nous allons revenir à la bibliothèque de réalité augmentée Vuforia, en explorant l'une de ses ressources les plus intéressantes: la cible d'image. Nous développerons le jeu Shoot the Cubes que nous avons créé dans les leçons précédentes, en ajoutant un nouveau niveau où le joueur doit défendre sa base contre l'attaque de cubes. 

 

Ce tutoriel peut être complété seul. Toutefois, si vous souhaitez une introduction à AR avec Vuforia et Unity3D, consultez les articles précédents de la série..

Cibles d'image

N'importe quel type d'image peut être une cible d'image Vuforia. Cependant, plus l'image est détaillée et complexe, mieux elle sera reconnue par l'algorithme.. 

De nombreux facteurs feront partie du calcul de reconnaissance, mais l’image doit présenter un niveau de contraste, de résolution et d’éléments distinctif raisonnable. Une photo de ciel bleu ne fonctionnerait pas très bien, mais une photo d'une herbe fonctionnerait avec élégance. Les cibles d'image peuvent être livrées avec l'application, téléchargées vers l'application via le cloud ou directement créées dans l'application par l'utilisateur..

Ajout d'une cible

Commençons par ajouter un ImageTarget élément de notre projet Unity. 

Tout d’abord, téléchargez les ressources du cours à partir du bouton dans la barre latérale. Ensuite, dans votre projet Unity, créez une nouvelle scène appelée DefendTheBase: dans le Projet fenêtre, sélectionnez le Des scènes dossier et cliquez sur Créer > Scène. Ouvrez maintenant cette scène et supprimez tous les objets de scène par défaut de la hiérarchie..

Ensuite, nous allons ajouter une lumière et une caméra. Cliquer sur Ajouter > Lumière > Lumière directionnelle ajouter une lumière directionnelle. Sélectionnez cette nouvelle lumière et réglez Ombre douce comme le Type d'ombre option. 

Après cela, glissez et déposez un ARCamera objet de Vuforia > Préfabriqués. Sélectionnez le ARCamera objet et dans le panneau de l'inspecteur, définissez le Clé de licence d'application créé sur la page du développeur Vuforia (voir le premier tutoriel pour les instructions). Sélectionner DEVICE_TRACKING pour le World Center Mod.

Enfin, faites glisser et déposez un ImageTargetà la hiérarchie de Vuforia > Préfabriqués.

Nous devons maintenant ajouter une base de données Vuforia. Tout d'abord, accédez à https://developer.vuforia.com/target-manager. Cliquer sur Ajouter une base de données et choisissez un nom.

Il existe trois types de bases de données parmi lesquels choisir:

  1. Dispositif: La base de données est enregistrée sur le périphérique et toutes les cibles sont mises à jour localement.
  2. Nuage: Base de données sur les serveurs de Vuforia.
  3. VuMark: Base de données exclusive aux cibles VuMark. Il est également enregistré sur l'appareil.

Dans ce cas, choisissez le Dispositif option et cliquez sur créer.

Sélectionnez la nouvelle base de données afin que nous puissions commencer à y ajouter des cibles. Il est maintenant temps d'ajouter des cibles à la base de données. Pour l'instant, nous allons simplement utiliser le Image unique option.

Accédez aux fichiers précédemment téléchargés, choisissez ImageTarget1, et mettre sa Largeur à 1 et cliquez sur Ajouter. (Remarque: si vous préférez créer votre propre cible d'image, lisez d'abord le guide.)

Vous pouvez maintenant télécharger la base de données en sélectionnant Unity Editor comme la plate-forme choisie. Ouvrez le fichier et sélectionnez tous les éléments à importer. Nous devons également préparer notre scène d’Unity à reconnaître la ImageTarget avec cette base de données nous avons créé.

Dans l'éditeur Unity, cliquez sur le bouton jemageTarget objet. Tout d'abord, trouver et développer Comportement de la cible d'image dans l'inspecteur d'objets. Sélectionner un Type de Prédéfini. Choisissez la cible d'image que nous avons créée précédemment pour Base de données. Enfin, assurez-vous que le Activer le suivi étendu et Activer Smart Terrain les options sont toutes les deux désactivées.

le ImageTarget prefab est composé d’une série de composants, dont certains scripts tels que Comportement de la cible d'image, TComportement, et Gestionnaire d'événements Tracker par défaut. Si vous voulez bien comprendre le fonctionnement du système, lisez ces scripts et essayez de comprendre leur relation avec d'autres composants.. 

Pour ce tutoriel, nous ne creuserons pas trop, cependant. Nous aurons seulement besoin de nous concentrer sur Gestionnaire d'événements Tracker par défaut, qui reçoit des appels lorsque l'état de suivi de la cible de l'image change. Utilisons donc ce script comme base pour créer notre propre comportement de script.

Créez une copie de ce script que nous pouvons étendre. D'abord sélectionner Gestionnaire d'événements Tracker par défaut, cliquer sur options et sélectionnez Editer le script. Maintenant, faites une copie du script. Si vous utilisez MonoDevelop, cliquez sur Fichier > Enregistrer sous et enregistrer sous ImageTargetBehavior, le sauver dans le Les scripts dossier.

Le script TargetBehaviorScript

Nous n'aurons pas besoin de Vuforia espace de noms dans notre script. Supprimer la ligne “espace de noms Vuforia”Et les crochets. Cela signifie que nous devrons faire explicitement référence à la Vuforia espace de noms lorsque nous voulons accéder à ses classes: 

utiliser UnityEngine; using System.Collections; Classe publique BaseScript: MonoBehaviour, Vuforia.ITrackableEventHandler // code here

La méthode la plus importante de cette classe sera la OnTrackableStateChanged Méthode qui reçoit des appels lorsque la cible de l'image est trouvée ou perdue par l'appareil photo. Selon l’état de la cible, il appelle OnTrackingFound ou OnTrackingLost, et nous devrons également éditer ces méthodes. Mais d'abord, réfléchissons à la manière dont nous voulons que la cible de l'image se comporte. 

Dans ce jeu, l'utilisateur défendra une base qui apparaît sur une cible d'image. Considérons les mécanismes de jeu suivants:

  • Une fois la cible reconnue par le système, la base apparaît et les ennemis commencent à apparaître et volent vers la base dans un style kamikaze..
  • Chaque fois qu'un ennemi frappe la base, la base subit des dégâts et l'ennemi est détruit.
  • Pour gagner le jeu, l'utilisateur doit tirer et détruire tous les ennemis avant que la base ne soit détruite..
  • Si la cible de l'image est perdue (n'est plus visible depuis la caméra du périphérique), le jeu démarrera un compte à rebours. Si le chronomètre arrive à zéro, la partie est perdue. Tant que la cible est perdue, tous les ennemis cesseront d'avancer vers la base..

Nous devrons donc adapter ces mécanismes de jeu à ce que nous avons construit dans le dernier tutoriel. Nous allons créer la logique de génération d'ennemis dans la section suivante avec un objet vide nommé _SpawnController, en utilisant la même logique adoptée dans la première partie du jeu.

Pour l'instant, regardons la logique de suivi trouvée.

void privé OnTrackingFound () EnableRendererAndCollider (); // Informe le système que la cible a été trouvée. StartCoroutine (InformSpawnCtr (true));  void privé OnTrackingLost () DisableRendererAndCollider (); // Informe le système que la cible a été perdue StartCoroutine (InformSpawnCtr (false));  // informe SpanController que la base a été créée, privée IEnumerator InformSpawnCtr (bool isOn) // déplace la position de génération qui apparaît. GameObject spawn = GameObject.FindGameObjectWithTag ("_SpawnController"); return return new WaitForSeconds (0.2f); // informe SpanController si (isOn) spawn.GetComponent () .BaseOn (transform.position);  else spawn.GetComponent () .BaseOff (); 

De retour dans l'éditeur Unity, nous pouvons créer l'objet de base qui sera généré par le contrôleur spawn. 

Tout d'abord, sur le ImageTarget objet, désactiver le Gestionnaire d'événements traçables par défaut scénario.

Ensuite, cliquez sur Ajouter un composant et sélectionnez le Script de comportement cible. Du Hiérarchie panneau, clic droit sur ImageTarget et créez un nouveau cube nommé "Base". Ce cube doit être inséré à l'intérieur du ImageTarget objet.

Assurez-vous que le Base a Collisionneur de boîte et Rendu de maille activée. 

Facultativement, vous pouvez également insérer un Avion objet à l'intérieur du ImageTarget en utilisant le ImageTarget présenté précédemment dans Vuforia sous forme de texture. Cela créerait un effet intéressant, projetant des ombres de la cible et créant une expérience plus riche..

Adapter le SpawnScript

Maintenant, nous allons adapter le _SpawnController utilisé dans le dernier tutoriel. Enregistrer la scène en cours et ouvrir ShootTheCubesMain du dernier tutoriel. dans le Hiérarchie panneau, sélectionnez le _SpawnController et faites-le glisser vers le Préfabriqués dossier pour en faire un Unity Prefab.

Sauvegarder cette nouvelle scène et rouvrir DefendTheBase. Traîne _SpawnController du dossier prefabs au Hiérarchie panneau. Avec le _SpawnController sélectionné, cliquez sur Ajouter une étiquette sur le Inspecteur panneau. Nommez la nouvelle balise _SpawnController et l'applique à l'objet. 

Dans la fenêtre de projet, sélectionnez le cube élément dans le Préfabriqué dossier et définir son Étiquette, retour sur son inspecteur, à 'Enemy'.

Enfin, ouvrez le Les scripts dossier et ouvert SpawnScript. Nous devons faire en sorte que ce script s'adapte à la scène chargée.

utiliser UnityEngine; using UnityEngine.SceneManagement; using System.Collections; using System.Collections.Generic; en utilisant Vuforia; Classe publique SpawnScript: MonoBehaviour #region VARIABLES private bool mSpawningStarted = false; // élément de cube pour générer public GameObject mCubeObj; // nombre de cubes à engendrer public int mTotalCubes = 10; private int mCurrentCubes = 0; // Il est temps de générer le flotteur public Cubes mTimeToSpawn = 1f; private int mDistanceFromBase = 5; liste privée mCubes; bool privé mIsBaseOn; Scène privée mScene; #endregion // VARIABLES #region UNITY_METHODS // Utilisez ceci pour l'initialisation void Start () mScene = SceneManager.GetActiveScene (); mCubes = nouvelle liste (); if (mScene.name == "ShootTheCubesMain") StartSpawn ();  // Update est appelé une fois par image. Void Update ()  #endregion // UNITY_METHODS

Ensuite, nous devons créer deux méthodes publiques pour recevoir des appels de TargetBehaviorScript quand la cible est retrouvée ou perdue: 

  • BaseOn (Vector3 basePosition) sera appelé lorsque la cible est trouvée par la caméra et le Base l'objet est montré. Cela modifiera la position de ponte, lancera le processus et informera tous les cubes précédemment ajoutés à la scène que la base est visible..

  • le BaseOff () Cette méthode sera utilisée lorsque la cible est perdue. Cela arrêtera le processus de transfert et informera tous les éléments du cube que la base a été perdue.. 

#region PUBLIC_METHODS // Base a été trouvée par le traqueur public void BaseOn (Vector3 basePosition) Debug.Log ("SpawnScript2: BaseOn"); mIsBaseOn = true; // change position SetPosition (basePosition); // commence le processus de génération si nécessaire StartSpawn (); // informe tous les cubes à l'écran que la base est apparue InformBaseOnToCubes ();  // Base perdue par le suivi public void BaseOff () mIsBaseOn = false; mSpawningStarted = false; // informe tous les cubes à l'écran que la base est perdue InformBaseOffToCubes ();  #endregion // PUBLIC_METHODS

le SetPosition (System.Nullable pos) utilise la position actuelle de la cible pour modifier les axes x, y et z de l'objet et peut également recevoir une nul valeur lorsque la scène chargée est ShootTheCubesMain.

#region PRIVATE_METHODS // Nous allons utiliser un Coroutine // pour donner un peu de retard avant de définir la position private IEnumerator ChangePosition () Debug.Log ("ChangePosition"); return return new WaitForSeconds (0.2f); // Définit la position de Spawn une seule fois // change la position uniquement si Vuforia est actif if (VuforiaBehaviour.Instance.enabled) SetPosition (null);  // Définir la position privée void SetPosition (System.Nullable pos) if (mScene.name == "ShootTheCubesMain") // récupère la position de la caméra Transform cam = Camera.main.transform; // définit la position 10 unités en avant de la position de la caméra 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 () et InformBaseOffToCubes () sont responsables d'informer tous les cubes par étapes de l'état actuel de la base.

// Informe tous les cubes générés de la position de base private void InformBaseOnToCubes () // Debug.Log ("InformBaseOnToCubes"); foreach (cube GameObject en mCubes) cube.GetComponent () .SwitchBaseStatus (mIsBaseOn);  // Informer tous les cubes que la base est désactivée. Void privé InformBaseOffToCubes () // Debug.Log ("InformBaseOffToCubes"); foreach (cube GameObject en mCubes) cube.GetComponent () .SwitchBaseStatus (mIsBaseOn); 

le SpawnLoop () et SpawnElement () les méthodes utilisent presque la même logique que le dernier tutoriel.

// Lancer le processus de génération en instance privé privé StartSpawn () if (! MSpawningStarted) // begin spawn mSpawningStarted = true; StartCoroutine (SpawnLoop ());  // Loop Spawn Éléments de cube privés IEnumerator SpawnLoop () if (mScene.name == "ShootTheCubesMain") // Définition de la position de génération StartCoroutine (ChangePosition ());  return return new WaitForSeconds (0.2f); // Génération des éléments 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));  // Crée un cube privé GameObject SpawnElement () // crée l'élément à une position aléatoire, à l'intérieur d'une sphère imaginaire GameObject cube = Instantiate (mCubeObj, (Random.insideUnitSphere * 4) + transformation.position, transformation.rotation) comme GameObject; // définit une échelle aléatoire pour le cube float scale = Random.Range (0.5f, 2f); // change l'échelle du cube cube.transform.localScale = new Vector3 (scale, scale, scale); retourner le cube;  #endregion // PRIVATE_METHODS

Créer les ennemis

Maintenant, nous devons créer des ennemis. Nous allons utiliser le cube objet que nous avons créé dans le dernier tutoriel, en apportant quelques modifications à son script.

dans le Préfabriqués dossier, ajouter un cube objet à la hiérarchie. Puis sélectionnez l'objet et éditez le CubeBehaviorScript.

Nous allons conserver presque la même logique dans ce script, mais avec les différences suivantes:

  • le cube poursuivra le Base quand la cible est trouvée par la caméra.
  • Quand le cube frappe le Base, il va se détruire et causer des dommages à la Base.
  • Le script doit connaître le nom de la scène chargée et s’adapter en conséquence. 
utiliser UnityEngine; using UnityEngine.SceneManagement; using System.Collections; Classe publique CubeBehaviorScript: MonoBehaviour #region VARIABLES public float mScaleMax = 1f; flottant public mScaleMin = 0.2f; public int mCubeHealth = 100; // vitesse maximale en orbite public float mOrbitMaxSpeed ​​= 30f; public float velocityToBase = 0.4f; dommages int publics = 10; // vitesse de flottement privée float mOrbitSpeed; // Orbit direction private Vector3 mOrbitDirection; // Max Cube Scale private Vector3 mCubeMaxScale; // vitesse de croissance public float mGrowingSpeed ​​= 10f; bool privé mIsCubeScaled = false; bool privé mIsAlive = true; AudioSource mExplosionFx privé; mBase privé de GameObject; bool privé mIsBaseVisible = false; private Vector3 mRotationDirection; Scène privée mScene; #endregion

Si le nom de la scène est DefendTheBase, il faut trouver le Base objet et commencer à se déplacer vers elle.

#region UNITY_METHODS void Start () // Récupère le nom de la scène mScene = SceneManager.GetActiveScene (); CubeSettings ();  void Update () // met le cube en orbite et fait pivoter RotateCube (); if (mScene.name == "DefendTheBase") // déplace le cube vers la base, quand il est visible MoveToBase ();  // mettre à l'échelle le cube si nécessaire si (! mIsCubeScaled) ScaleObj ();  #endregion

le CubeSettings () également besoin de s'adapter en fonction de la scène chargée. le cube seules les orbites sur l'axe des y pour la DefendTheBase scène.

#region PRIVATE_METHODS private void CubeSettings () // définissant la direction de l'orbite float x = Random.Range (-1f, 1f); float y = Random.Range (-1f, 1f); float z = Random.Range (-1f, 1f); // Tutoriel de mise à jour TODO avec nouveau code // Définition des paramètres en fonction du nom de la scène if (mScene.name == "ShootTheCubesMain") mOrbitDirection = new Vector3 (x, y, z);  else if (mScene.name == "DefendTheBase") // orbite uniquement sur l’axe des y mOrbitDirection = new Vector3 (0, y, 0); // la taille de l'échelle doit être limitée mScaleMin = 0.05f; mScaleMax = 0,2f; VelocityToBase = 0.2f;  // tournant autour de son axe float rx = Random.Range (-1f, 1f); float ry = Random.Range (-1f, 1f); float rz = Random.Range (-1f, 1f); mRotationDirection = new Vector3 (rx, ry, rz); // définition de la vitesse mOrbitSpeed ​​= Random.Range (5f, mOrbitMaxSpeed); // définition de l'échelle float scale = Random.Range (mScaleMin, mScaleMax); mCubeMaxScale = nouveau Vector3 (échelle, échelle, échelle); // met l'échelle de cube à 0, pour l'agrandir ultérieurement transform.localScale = Vector3.zero; // Obtention de l'effet sonore d'explosion mExplosionFx = GetComponent (); 

Nous allons ajouter une nouvelle logique à la RotateCube () méthode. Les objets de cube pivoteront autour de la base pendant que la cible est visible. Lorsque la cible n'est pas visible, ils continuent à pivoter autour du Caméra, en utilisant la même logique que dans le dernier tutoriel.

// Faire pivoter le cube autour de la base privée voilée RotateCube () // faire pivoter la base ou la caméra si (mIsBaseVisible && mBase! = Null && mIsAlive) // faire pivoter le cube autour de la base. 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);  // Echelle l'objet de 0 à 1 espace privé privé ScaleObj () // obj croissant (transform.localScale! = MCubeMaxScale) transform.localScale = Vector3.Lerp (transform.localScale, mCubeMaxScale, Time.deltaTime * mGrowingSpeed); sinon mIsCubeScaled = true; 

Pour déplacer l'objet vers la base, nous devons d'abord vérifier si la base est présente, puis appliquer les étapes de position à l'objet..

 // Déplace le cube vers le vide privé de base MoveToBase () // déplace le cube vers la base uniquement si la base est présente if (mIsBaseVisible && mIsAlive && gameObject! = Null && mBase! = Null) float step = velocityToBase * Time.deltaTime; transformation.position = Vector3.MoveTowards (transformation.position, mBase.transform.position, étape); 

le DestroyCube () méthode est la même que précédemment, mais maintenant nous allons ajouter une nouvelle méthode-la TargetHit (GameObject) méthode qui sera appelée lorsque la base est touchée. Notez que le BaseHealthScript référencé dans TargetHit () n'a pas encore été créé.

// fait un dommage sur le vide privé cible TargetHit (cible GameObject) Debug.Log ("TargetHit:" + target.name); if (target.name == "Base") // cause des dommages sur la base MyBase baseCtr = target.GetComponent (); baseCtr.TakeHit (dommage); StartCoroutine (DestroyCube ());  // Destroy Cube private IEnumerator DestroyCube () mIsAlive = false; mExplosionFx.Play (); GetComponent() .enabled = false; return return new WaitForSeconds (mExplosionFx.clip.length); Détruire (gameObject);  #endregion

Enfin, nous allons ajouter les méthodes publiques à appeler lorsque le cube reçoit un hit, lorsqu'il entre en collision avec la base ou lorsque la base change d'état..

#region PUBLIC_METHODS // Cube gor Hit // retourne 'false' lorsque le cube a été détruit bool public Hit (int hitDamage) mCubeHealth - = hitDamage; if (mCubeHealth> = 0 && mIsAlive) StartCoroutine (DestroyCube ()); retourne vrai;  return false;  public void OnCollisionEnter (Collision col) TargetHit (col.gameObject);  // Recevoir l'état actuel de la base public void SwitchBaseStatus (bool isOn) // arrête le cube lors du déplacement vers la base mIsBaseVisible = isOn; if (isOn) mBase = GameObject.Find ("Base");  else mBase = null;  #endregion

Contrôler la santé de base

Les ennemis se mettent en scène et volent vers la base, mais ils ne causent aucun dommage lorsqu'ils entrent en collision, ni avec la base ni avec l'ennemi. Nous devons créer un script pour répondre aux collisions et ajouter une barre de santé à l'écran pour que l'utilisateur sache à quel point il se débrouille bien..

Commençons par ajouter la barre de santé. dans le Hiérarchie dans l’éditeur Unity, cliquez sur Créer > UI > Curseur. Un nouveau Toile l'élément sera ajouté à la hiérarchie. Il contient des éléments d'interface utilisateur, y compris le nouveau Curseur. Étendre le Toile et sélectionnez le Curseur.

Modifiez le nom de l'élément du curseur en UIHealth. dans le Inspecteur panneau, développez Transform Rect Et mettre Largeur à 400 et la taille à 40. Ensemble Pos X à -220Pos Y à 30, et Pos Z à 0.

Développez maintenant le script du curseur dans la hiérarchie. Désélectionner le Interactable option. Pour Graphique cible, cliquez sur le petit "point" sur le côté droit et sélectionnez le Contexte image. 

  • Met le Valeur Min à 0 et Valeur max à 100.
  • Sélectionner Des nombres entiers.
  • Ensemble Valeur à 100.

Maintenant, développez le Curseur panneau pour exposer ses éléments enfants: Contexte, Zone de remplissage, et Zone de glissière.

  • Effacer Zone de glissière.
  • Sélectionner Contexte et mettre sa Couleur à une nuance de vert plus foncée, comme # 12F568FF.
  • Développer Zone de remplissage et sélectionnez le Remplir objet et mettre sa couleur à # 7FEA89FF.

Voici comment Fenêtre de jeu devrait regarder avec la barre de santé.

Le script de santé de base

Le code est très simple. il ne fait que soustraire les dégâts infligés par les ennemis au montant total des points de vie de la base. Une fois que la santé est à zéro, le joueur perd la partie. Cela ajoutera également une animation de rotation à la base. Créez un nouveau script C # appelé MyBase.

utiliser UnityEngine; using UnityEngine.UI; using System.Collections; public class MyBase: MonoBehaviour #region VARIABLE public float rotationSpeed ​​= 10f; public int santé = 100; AudioClip public explosionSoundFx; public AudioClip hitSoundFx; // TODO choisit un son différent pour le hit private bool mIsAlive = true; AudioSource mAudioSource privé; public Slider mHealthSlider; #endregion // VARIABLES #region UNITY_METHODS // Utilisez ceci pour l'initialisation void Start () mAudioSource = GetComponent (); mHealthSlider.maxValue = santé; mHealthSlider.value = santé;  // La mise à jour est appelée une fois par image. Void Update () RotateBase ();  #endregion // UNITY_REGION #region PRIVATE_METHODS private void RotateBase () if (mIsAlive && gameObject! = null) // implémente la transformation de rotation d'objet.Rotate (Vector3.up, rotationSpeed ​​* Time.deltaTime);  // Détruit le propriétaire de base privé IEnumerator DestroyBase () mIsAlive = false; mAudioSource.clip = explosionSoundFx; mAudioSource.Play (); GetComponent () .enabled = false; // informe tous les ennemis que la base est perdue GameObject [] ennemis = GameObject.FindGameObjectsWithTag ("Enemy"); foreach (GameObject e in ennemis) e.gameObject.GetComponent () .SwitchBaseStatus (false);  return return new WaitForSeconds (mAudioSource.clip.length); Détruire (gameObject);  #endregion // PRIVATE_METHODS #region PUBLIC_METHODS // recevoir des dommages public nuls TakeHit (int dommages) santé - = dommages; mHealthSlider.value = santé; si (santé <= 0)  StartCoroutine (DestroyBase ());  else  mAudioSource.clip = hitSoundFx; mAudioSource.Play ();   #endregion // PUBLIC_METHODS 

Maintenant, nous devons ajouter et configurer le script. 

Sélectionnez le Base dans la hiérarchie, cliquez sur Ajouter un composant, et ajouter un Source audio. Maintenant glisser MyBase au Base élément et, dans le Inspecteur panneau, développez MyBase. Sélectionnez un effet sonore pour l'explosion et appuyez sur. J'ai utilisé le explosion clip utilisé dans le dernier tutoriel, mais n'hésitez pas à ajouter le vôtre. Enfin, dans le Curseur de santé, sélectionnez le UISlider élément.

Défendre la base

Notre nouvelle expérience de jeu est presque terminée. Il suffit de tirer sur des lasers pour commencer à défendre notre base. Créons un script pour le laser! 

Faites d'abord glisser le _PlayerController du Préfabriqué dossier à la hiérarchie. Développer _PlayerController et sélectionnez _LaserController. Dans le Inspecteur panneau, trouver Script laser et cliquez sur modifier.

La seule chose que nous devons changer dans ce script est la position du laser.

// Lance le feu vide privé Laser () // Get ARCamera Transform Transform cam = Camera.main.transform; // Définit l'heure du prochain feu mNextFire = Time.time + mFireRate; // Définit l'origine du RayCast Vector3 rayOrigin = cam.position; // Montre le laser en utilisant un Coroutine StartCoroutine (LaserFx ()); // contient les informations sur le hit RaycastHit hit; // Définition de la position d'origine de la ligne laser // Il faudra ajouter 10 unités à partir de l'ARCamera // Nous avons adopté cette logique pour plus de simplicité Vector3 laserStartPos = new Vector3 (cam.position.x, cam.position.y -2f, cam .position.z); mLaserLine.SetPosition (0, laserStartPos); // Vérifie si le RayCast a atteint quelque chose si (Physics.Raycast (rayOrigin, cam.forward, out hit, mFireRange)) // Définit la fin de la ligne laser sur l'objet touché mLaserLine.SetPosition (1, hit.point) ; // vérifie le type de cible 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 // Définissez l'enfo de la ligne laser sur la caméra // à l'aide de la plage laser mLaserLine.SetPosition (1, cam.forward * mFireRange); 

Essayer le jeu

 

C’était beaucoup de travail, mais il est maintenant temps de jouer au jeu! Imprimez l'image cible et essayez de lancer votre jeu sur votre téléphone ou votre tablette. Amusez-vous et voyez si vous pouvez trouver des moyens d'améliorer le jeu.! 

À ce stade, vous avez une bonne compréhension du fonctionnement du système Vuforia et de son utilisation avec Unity. J'espère que vous avez apprécié ce voyage autant que moi. À bientôt!

Pour en savoir plus sur la réalité augmentée avec Vuforia et Unity, consultez notre cours vidéo ici sur Envato Tuts+!