Crea un juego de realidad aumentada estilo Pokémon GO con Vuforia objetivos de imagen

En este tutorial, nos sumergiremos de nuevo en la biblioteca de Realidad Aumentada (AR) de Vuforia, explorando uno de sus recursos más interesantes: el Objetivo de la imagen. Expandiremos el juego Shoot the Cubes que creamos en lecciones anteriores, agregando un nuevo nivel donde el jugador necesita defender su base de los cubos atacantes.. 

 

Este tutorial se puede completar solo, aunque si desea una introducción a AR con Vuforia y Unity3D, consulte las publicaciones anteriores de la serie..

Objetivos de imagen

Cualquier tipo de imagen puede ser un objetivo de imagen Vuforia. Sin embargo, cuanto más detallada e intrincada sea la imagen, mejor será reconocida por el algoritmo.. 

Muchos factores formarán parte del cálculo de reconocimiento, pero básicamente la imagen debe tener un nivel razonable de contraste, resolución y elementos distintivos. Una fotografía del cielo azul no funcionaría muy bien, pero una foto de un poco de hierba funcionaría con gracia. Los objetivos de imagen se pueden enviar con la aplicación, subirlos a la aplicación a través de la nube o crearlos directamente en la aplicación por parte del usuario..

Añadiendo un objetivo

Comencemos agregando un ImageTarget Elemento para nuestro proyecto de unidad.. 

Primero, descargue los recursos del curso desde el botón en la barra lateral. Luego, en tu proyecto de Unity, crea una nueva escena llamada Defender la base: en el Proyecto ventana, seleccione la Escenas carpeta y haga clic en Crear > Escena. Ahora abre esa escena y elimina todos los objetos de escena predeterminados de la jerarquía.

A continuación añadiremos una luz y una cámara. Haga clic en Añadir > Ligero > Luz direccional Para añadir una luz direccional. Selecciona esta nueva luz y configúrala. Sombra suave como el Tipo de sombra opción. 

Después de eso, arrastra y suelta un ARCamera objeto de Vuforia > Prefabricados. Selecciona el ARCamera objeto y en el panel del inspector, establecer la Clave de licencia de la aplicación creado en la página de desarrolladores de Vuforia (consulte el primer tutorial para obtener instrucciones). Seleccionar DEVICE_TRACKING Para el Centro Mundial Mod.

Finalmente, arrastra y suelta un ImageTargeta la jerarquía desde Vuforia > Prefabricados.

Ahora tenemos que añadir una base de datos Vuforia. Primero, navegue a https://developer.vuforia.com/target-manager. Haga clic en Añadir base de datos y elige un nombre.

Hay tres tipos de base de datos para elegir:

  1. Dispositivo: La base de datos se guarda en el dispositivo y todos los objetivos se actualizan localmente.
  2. Nube: Base de datos en los servidores Vuforia.
  3. VuMark: Base de datos exclusiva para los objetivos de VuMark. También se guarda en el dispositivo..

En este caso, elija el Dispositivo opción y haga clic en crear.

Seleccione la nueva base de datos para que podamos comenzar a agregarle objetivos. Ahora es el momento de agregar objetivos a la base de datos. Por ahora, solo usaremos el Una sola imagen opción.

Vaya a los archivos descargados anteriormente, seleccione ImageTarget1, y establecer su Anchura a 1 y haga clic en Añadir. (Nota: si prefiere crear su propio objetivo de imagen, lea primero la guía).

Ahora puedes descargar la base de datos, seleccionando Editor de la unidad como la plataforma elegida. Abra el archivo y seleccione todos los elementos para importar. También debemos preparar nuestra escena de Unidad para reconocer la ImageTarget Con esta base de datos hemos creado..

En el editor de Unity, haga clic en el yoMageTarget objeto. Primero, encuentra y expande. Comportamiento objetivo de la imagen en el inspector de objetos. Seleccione un Tipo de Predefinido. Elija el objetivo de imagen que creamos anteriormente para Base de datos. Por último, asegúrese de que el Habilitar seguimiento extendido y Habilitar terreno inteligente las opciones están deshabilitadas.

los ImageTarget la prefabricación se compone de una serie de componentes, incluidos algunos scripts como Comportamiento objetivo de la imagen, Turno de comportamiento, Controlador de eventos de seguimiento predeterminado. Si desea comprender a fondo cómo funciona el sistema, lea esos scripts e intente comprender su relación con otros componentes. 

Sin embargo, para este tutorial no profundizaremos demasiado. Solo necesitaremos concentrarnos en el Controlador de eventos de seguimiento predeterminado, que recibe llamadas cuando cambia el estado de seguimiento de la imagen. Así que vamos a usar este script como base para crear nuestro propio comportamiento de script.

Crea una copia de este script que podamos extender. Primera selección Controlador de eventos de seguimiento predeterminado, haga clic en opciones y seleccione Editar Script. Ahora, haz una copia del guión. Si está utilizando MonoDevelop, haga clic en Expediente > Guardar como y guardar como ImageTargetBehavior, guardándolo en el Guiones carpeta.

El script de TargetBehaviorScript

No necesitaremos el Vuforia espacio de nombres en nuestro script. Quitar la lineaespacio de nombres Vuforia”Y los soportes. Eso significa que tendremos que hacer referencia explícita a la Vuforia espacio de nombres cuando queremos acceder a sus clases: 

utilizando UnityEngine; utilizando System.Collections; BaseScript de clase pública: MonoBehaviour, Vuforia.ITrackableEventHandler // code here

El método más importante en esta clase será el OnTrackableStateChanged Método que recibe llamadas cuando el dispositivo de la cámara encuentra o pierde el objetivo de la imagen. Según el estado de destino, llama. OnTrackingFound o OnTrackingLost, y tendremos que editar esos métodos también. Pero primero, pensemos en cómo queremos que se comporte el objetivo de la imagen. 

En este juego, el usuario defenderá una base que aparece en un objetivo de imagen. Consideremos las siguientes mecánicas de juego:

  • Una vez que el sistema reconoce el objetivo, aparece la base y los enemigos comienzan a aparecer y volar hacia la base en un estilo kamikaze..
  • Cada vez que un enemigo golpea la base, la base sufrirá daño y el enemigo será destruido..
  • Para ganar el juego, el usuario debe disparar y destruir a todos los enemigos antes de que se destruya la base..
  • Si el objetivo de la imagen se pierde (ya no es visible desde la cámara del dispositivo), el juego iniciará un temporizador de cuenta regresiva. Si el temporizador llega a cero, el juego se pierde. Mientras el objetivo está perdido, todos los enemigos dejarán de avanzar hacia la base..

Por lo tanto, tendremos que adaptar esas mecánicas del juego a lo que creamos en el último tutorial. Crearemos la lógica de generación del enemigo en la siguiente sección con un objeto vacío llamado _SpawnController, Usando la misma lógica adoptada en la primera parte del juego..

Por ahora, veamos la lógica de seguimiento encontrada..

el vacío privado OnTrackingFound () EnableRendererAndCollider (); // Informar al sistema que se encontró el destino StartCoroutine (InformSpawnCtr (true));  void privado OnTrackingLost () DisableRendererAndCollider (); // Informar al sistema que se perdió el destino StartCoroutine (InformSpawnCtr (false));  // informar a SpanController que la base se fundó privado IEnumerator InformSpawnCtr (bool isOn) // mover posición de generación GameObject spawn = GameObject.FindGameObjectWithTag ("_SpawnController"); rendimiento retorno nuevo WaitForSeconds (0.2f); // informar a SpanController if (isOn) spawn.GetComponent () .BaseOn (transform.position);  else spawn.GetComponent () .BaseOff (); 

De vuelta en el editor de Unity, podemos crear el objeto base que generará el controlador de spawn.. 

Primero, en el ImageTarget objeto, deshabilitar el Controlador de eventos rastreable predeterminado guión.

A continuación, haga clic en Agregar componente y seleccione el Guión de comportamiento objetivo. Desde el Jerarquía panel, clic derecho en ImageTarget y crea un nuevo cubo llamado "Base". Este cubo debe ser insertado dentro de la ImageTarget objeto.

Asegúrese de que el Base tiene Box ColliderRenderizador de malla habilitado. 

Opcionalmente, también puede insertar un Avión objeto dentro de la ImageTarget utilizando la ImageTarget presentado anteriormente en Vuforia como una textura. Esto crearía un efecto interesante, proyectando sombras desde el objetivo y creando una experiencia más rica.

Adaptando el SpawnScript

Ahora adaptaremos el _SpawnController Utilizado en el último tutorial. Guarda la escena actual y abre DisparaLos cubosMain Desde el último tutorial. En el Jerarquía panel, seleccione el _SpawnController y arrástrelo a la Prefabricados carpeta para que sea una Unity Prefab.

Guarda esta nueva escena y reabre Defender la base. Arrastrar _SpawnController de la carpeta de prefabs a la Jerarquía panel. Con el _SpawnController seleccionado, haga clic en Añadir etiqueta sobre el Inspector panel. Nombra la nueva etiqueta _SpawnController y aplicarlo al objeto. 

En la ventana Proyecto, seleccione la Cubo elemento en el Casa prefabricada carpeta y establecer su Etiqueta, De vuelta en su inspector, a 'Enemigo'..

Finalmente, abre el Guiones carpeta y abrir SpawnScript. Necesitamos hacer que este script se adapte a la escena cargada..

utilizando UnityEngine; utilizando UnityEngine.SceneManagement; utilizando System.Collections; utilizando System.Collections.Generic; utilizando Vuforia; clase pública SpawnScript: MonoBehaviour #region VARIABLES private bool mSpawningStarted = false; // Elemento de cubo para generar GameObject público mCubeObj; // Qtd de cubos que se van a generar public int mTotalCubes = 10; private int mCurrentCubes = 0; // Tiempo para generar los cubos public float mTimeToSpawn = 1f; int privado mDistanceFromBase = 5; Lista privada mCubes; bool privado mIsBaseOn; Escena privada mScene; #endregion // VARIABLES #region UNITY_METHODS // Use esto para la inicialización void Start () mScene = SceneManager.GetActiveScene (); mCubes = nueva lista (); if (mScene.name == "ShootTheCubesMain") StartSpawn ();  // Se llama a la actualización una vez por marco. Actualización ()  #endregion // UNITY_METHODS

A continuación, necesitamos crear dos métodos públicos para recibir llamadas de TargetBehaviorScript cuando el objetivo se encuentra o se pierde: 

  • BaseOn (Vector3 basePosition) se llamará cuando el objetivo sea encontrado por la cámara y el Base Se muestra el objeto. Cambiará la posición de desove, iniciará el proceso e informará a todos los cubos que se agregaron previamente a la etapa que la base es visible..

  • los BaseOff () Método será utilizado cuando el objetivo se pierde. Detendrá el proceso de preparación e informará a todos los elementos del cubo que se perdió la base. 

#region PUBLIC_METHODS // Base fue encontrada por el rastreador public void BaseOn (Vector3 basePosition) Debug.Log ("SpawnScript2: BaseOn"); mIsBaseOn = true; // cambiar posición SetPosition (basePosition); // iniciar el proceso de desove si es necesario StartSpawn (); // informar a todos los cubos en la pantalla que apareció la base InformBaseOnToCubes ();  // Base perdida por el rastreador public void BaseOff () mIsBaseOn = false; mSpawningStarted = false; // informar a todos los cubos en la pantalla que se perdió la base InformBaseOffToCubes ();  #endregion // PUBLIC_METHODS

los SetPosition (System.Nullable pos) utiliza la posición actual del objetivo para modificar los ejes x, y yz del objeto, y también puede recibir una nulo valor cuando la escena cargada es DisparaLos cubosMain.

#region PRIVATE_METHODS // Usaremos un Coroutine para dar un poco de // retraso antes de establecer la posición privada IEnumerator ChangePosition () Debug.Log ("ChangePosition"); rendimiento retorno nuevo WaitForSeconds (0.2f); // Defina la posición de Generación solo una vez // cambie la posición solo si Vuforia está activa si (VuforiaBehaviour.Instance.enabled) SetPosition (null);  // Establecer posición privada void SetPosition (System.Nullable pos) if (mScene.name == "ShootTheCubesMain") // obtener la posición de la cámara Transform cam = Camera.main.transform; // establece la posición 10 unidades delante de la posición de la cámara 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 () y InformBaseOffToCubes () son responsables de informar a todos los cubos escalonados del estado base actual.

// Informar a todos los cubos generados de la posición base privado vacío InformBaseOnToCubes () // Debug.Log ("InformBaseOnToCubes"); foreach (GameObject cube in mCubes) cube.GetComponent () .SwitchBaseStatus (mIsBaseOn);  // Informar a todos los cubos que la base está fuera del vacío privado InformBaseOffToCubes () // Debug.Log ("InformBaseOffToCubes"); foreach (GameObject cube in mCubes) cube.GetComponent () .SwitchBaseStatus (mIsBaseOn); 

los SpawnLoop () y SpawnElement () Los métodos utilizan casi la misma lógica que el último tutorial..

// Iniciar proceso de desove privado void StartSpawn () if (! MSpawningStarted) // begin spawn mSpawningStarted = true; StartCoroutine (SpawnLoop ());  // Loop Spawning cube elements private IEnumerator SpawnLoop () if (mScene.name == "ShootTheCubesMain") // Definición de la posición de inicio StartCoroutine (ChangePosition ());  rendimiento devolver nuevo WaitForSeconds (0.2f); // Generando los elementos 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 ++;  rendimiento devolver nuevo WaitForSeconds (Random.Range (mTimeToSpawn, mTimeToSpawn * 3));  // Generar un cubo privado GameObject SpawnElement () // generar el elemento en una posición aleatoria, dentro de una esfera imaginaria GameObject cube = Instantiate (mCubeObj, (Random.insideUnitSphere * 4) + transform.position, transform.rotation) como GameObject; // define una escala aleatoria para la escala flotante del cubo = Random.Range (0.5f, 2f); // cambiar la escala del cubo cube.transform.localScale = new Vector3 (scale, scale, scale); cubo de retorno;  #endregion // PRIVATE_METHODS

Creando a los enemigos

Ahora tendremos que crear algunos enemigos. Usaremos el Cubo Objeto que creamos en el último tutorial, haciendo algunas modificaciones a su script..

En el Prefabricados carpeta, añadir un Cubo Objeto a la jerarquía. Luego selecciona el objeto y edita el CubeBehaviorScript.

Conservaremos casi la misma lógica en este script, pero con las siguientes diferencias:

  • los Cubo perseguirá el Base cuando el objetivo es encontrado por la cámara.
  • Cuando el Cubo golpea el Base, Se destruirá y dará algún daño a la Base.
  • El guión necesita saber el nombre de la escena cargada y adaptarse en consecuencia. 
utilizando UnityEngine; utilizando UnityEngine.SceneManagement; utilizando System.Collections; clase pública CubeBehaviorScript: MonoBehaviour #region VARIABLES public float mScaleMax = 1f; flotador público mScaleMin = 0.2f; public int mCubeHealth = 100; // Orbit max Speed ​​public float mOrbitMaxSpeed ​​= 30f; flotador público velocityToBase = 0.4f; daño int público = 10; // Orbit speed private float mOrbitSpeed; // Orbit direction private Vector3 mOrbitDirection; // Escala máxima de cubos Vector3 privado mCubeMaxScale; // Velocidad de crecimiento public float mGrowingSpeed ​​= 10f; bool privado mIsCubeScaled = falso; privado bool mIsAlive = true; AudioSource privado mExplosionFx; GameObject mBase privado; bool privado mIsBaseVisible = falso; Vector3 mRotationDirection privado; Escena privada mScene; #endregion

Si el nombre de la escena es Defender la base, debe encontrar el Base Objetar y empezar a avanzar hacia ella..

#region UNITY_METHODS void Start () // Obtener el nombre de la escena mScene = SceneManager.GetActiveScene (); CubeSettings ();  void Update () // hace que el cubo orbite y gire RotateCube (); if (mScene.name == "DefendTheBase") // mueve el cubo hacia la base, cuando está visible MoveToBase ();  // escala el cubo si es necesario si (! mIsCubeScaled) ScaleObj ();  #endregion

los Ajustes de cubos () También es necesario adaptarse según la escena cargada. los Cubo solo orbita en el eje y para el Defender la base escena.

#region PRIVATE_METHODS private void CubeSettings () // definiendo la dirección de la órbita float x = Random.Range (-1f, 1f); float y = Random.Range (-1f, 1f); float z = Random.Range (-1f, 1f); // TODO actualiza el tutorial con el nuevo código // define las configuraciones según el nombre de la escena si (mScene.name == "ShootTheCubesMain") mOrbitDirection = new Vector3 (x, y, z);  else if (mScene.name == "DefendTheBase") // orbita solo en el eje y mOrbitDirection = new Vector3 (0, y, 0); // el tamaño de la escala debe estar limitado mScaleMin = 0.05f; mScaleMax = 0.2f; velocityToBase = 0.2f;  // girando alrededor de su eje float rx = Random.Range (-1f, 1f); float ry = Random.Range (-1f, 1f); float rz = Random.Range (-1f, 1f); mRotationDirection = new Vector3 (rx, ry, rz); // velocidad de definición mOrbitSpeed ​​= Random.Range (5f, mOrbitMaxSpeed); // definiendo la escala float scale = Random.Range (mScaleMin, mScaleMax); mCubeMaxScale = nuevo Vector3 (escala, escala, escala); // establece la escala del cubo en 0, para aumentarla más tarde transform.localScale = Vector3.zero; // obteniendo el efecto de sonido de explosión mExplosionFx = GetComponent (); 

Añadiremos una nueva lógica a la RotateCube () método. Los objetos cúbicos girarán alrededor de la base mientras el objetivo esté visible. Cuando el objetivo no es visible, continuarán girando alrededor de la Cámara, Usando la misma lógica que en el último tutorial..

// Gire el cubo alrededor del vacío privado de la base RotateCube () // gire alrededor de la base o la cámara si (mIsBaseVisible && mBase! = Null && mIsAlive) // gire el cubo alrededor 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);  // Escala el objeto de 0 a 1 void privado ScaleObj () // growing obj if (transform.localScale! = MCubeMaxScale) transform.localScale = Vector3.Lerp (transform.localScale, mCubeMaxScale, Time.deltaTime * mGrowingSpeed); else mIsCubeScaled = true; 

Para mover el objeto hacia la base, primero debemos verificar si la base está presente y luego aplicar los pasos de posición al objeto..

 // Mueva el cubo hacia la base privada void MoveToBase () // haga que el cubo se mueva hacia la base solo si la base está presente si (mIsBaseVisible && mIsAlive && gameObject! = Null && mBase! = Null) float step = velocityToBase * Time.deltaTime; transform.position = Vector3.MoveTowards (transform.position, mBase.transform.position, step); 

los DestroyCube () El método es el mismo que antes, pero ahora agregaremos un nuevo método: el TargetHit (GameObject) Método que se llamará cuando se golpee la base. Tenga en cuenta que el BaseHealthScript referenciado en TargetHit () no ha sido creado todavía.

// hacer un daño en el objetivo privado void TargetHit (GameObject target) Debug.Log ("TargetHit:" + target.name); if (target.name == "Base") // hacer daño en la base MyBase baseCtr = target.GetComponent (); baseCtr.TakeHit (daño); StartCoroutine (DestroyCube ());  // Destroy Cube IEnumerator privado DestroyCube () mIsAlive = false; mExplosionFx.Play (); GetComponent() habilitado = falso; producir retorno nuevo WaitForSeconds (mExplosionFx.clip.length); Destroy (gameObject);  #endregion

Finalmente, agregaremos los métodos públicos que se llamarán cuando el cubo reciba un golpe, cuando colisione con la base o cuando la base cambie de estado..

#region PUBLIC_METHODS // Cube gor Hit // devuelve 'false' cuando el cubo fue destruido public bool Hit (int hitDamage) mCubeHealth - = hitDamage; if (mCubeHealth> = 0 && mIsAlive) StartCoroutine (DestroyCube ()); devuelve verdadero  falso retorno;  public void OnCollisionEnter (Colisión de colisión) TargetHit (col.gameObject);  // Recibir el estado base actual void público SwitchBaseStatus (bool isOn) // detener el cubo en el movimiento hacia la base mIsBaseVisible = isOn; if (isOn) mBase = GameObject.Find ("Base");  else mBase = null;  #endregion

Controlando la salud de la base

Los enemigos están siendo organizados y volando hacia la base, pero no causan ningún daño cuando chocan, ni a la base ni al enemigo. Necesitamos crear un script para responder a las colisiones y también para agregar una barra de salud a la pantalla, para que el usuario sepa qué tan bien lo está haciendo..

Comencemos agregando la barra de salud. En el Jerarquía panel en el editor de Unity, haga clic en Crear > UI > Deslizador. Un nuevo Lona El elemento será agregado a la jerarquía. Contiene elementos UI, incluyendo el nuevo Deslizador. Ampliar la Lona y seleccione el Deslizador.

Cambiar el nombre del elemento deslizante a UIHealth. En el Inspector panel, ampliar Rect Transform y establecer Anchura a 400 y Altura a 40. Conjunto Pos X a -220Pos Y 30, y Pos Z a 0.

Ahora expanda la secuencia de comandos deslizante en la jerarquía. Deseleccionar la Interactable opción. por Gráfico de destino, haga clic en el pequeño 'punto' en el lado derecho y seleccione el Fondo imagen. 

  • Selecciona el Valor mínimo a 0 y Valor máximo a 100.
  • Seleccionar Números enteros.
  • Conjunto Valor a 100.

Ahora, expanda el Deslizador Panel para exponer sus elementos hijos: Fondo, Área de relleno, y Área de deslizamiento de la manija.

  • Borrar Área de deslizamiento de la manija.
  • Seleccionar Fondo y establecer su Color a un tono más oscuro de verde, como # 12F568FF.
  • Expandir Área de relleno y seleccione el Llenar objeto y establecer su color para # 7FEA89FF.

Así es como el Ventana de juego Debería mirar con la barra de salud..

La Escritura de Salud Base

El código es muy simple; solo resta el daño hecho por los enemigos de la cantidad total de la salud de la base. Una vez que la salud llega a cero, el jugador pierde el juego. También agregará una animación de rotación a la Base. Crear un nuevo script de C # llamado MyBase.

utilizando UnityEngine; utilizando UnityEngine.UI; utilizando System.Collections; clase pública MyBase: MonoBehaviour #region VARIABLE public float rotationSpeed ​​= 10f; salud pública int = 100; público AudioClip explosionSoundFx; AudioClip público hitSoundFx; // TODO elige un sonido diferente para Hit private bool mIsAlive = true; AudioSource privado mAudioSource; Slider público mHealthSlider; #endregion // VARIABLES #region UNITY_METHODS // Use esto para la inicialización void Start () mAudioSource = GetComponent (); mHealthSlider.maxValue = salud; mHealthSlider.value = salud;  // Se llama a la actualización una vez por fotograma nula Update () RotateBase ();  #endregion // UNITY_REGION #region PRIVATE_METHODS private void RotateBase () if (mIsAlive && gameObject! = null) // implementa la rotación de objetos transform.Rotate (Vector3.up, rotationSpeed ​​* Time.deltaTime);  // Destruir la base privada IEnumerator DestroyBase () mIsAlive = false; mAudioSource.clip = explosionSoundFx; mAudioSource.Play (); GetComponent () habilitado = falso; // informar a todos los enemigos que la base está perdida GameObject [] enemigos = GameObject.FindGameObjectsWithTag ("Enemy"); foreach (GameObject e en enemigos) e.gameObject.GetComponent () .SwitchBaseStatus (falso);  rendimiento devolver nuevo WaitForSeconds (mAudioSource.clip.length); Destroy (gameObject);  #endregion // PRIVATE_METHODS #region PUBLIC_METHODS // recibir daños public void TakeHit (intaños) salud - = daños; mHealthSlider.value = salud; si (salud) <= 0)  StartCoroutine (DestroyBase ());  else  mAudioSource.clip = hitSoundFx; mAudioSource.Play ();   #endregion // PUBLIC_METHODS 

Ahora necesitamos agregar y configurar el script.. 

Selecciona el Base en la jerarquía, haga clic en Agregar componente, y agrega un Fuente de audio. Ahora arrastrar MyBase al Base elemento y, en el Inspector panel, ampliar MyBase. Selecciona un efecto de sonido para la explosión y pulsa. He usado el explosión Clip utilizado en el último tutorial, pero siéntase libre de agregar el suyo. Finalmente, en el Control deslizante de salud, Selecciona el UISlider elemento.

Defendiendo la base

Nuestra nueva experiencia de juego está casi terminada. Solo necesitamos disparar algunos láseres para comenzar a defender nuestra base. Vamos a crear un script para el láser.! 

Primero arrastra el _PlayerController desde el Casa prefabricada Carpeta a la jerarquía. Expandir _PlayerController y seleccione _LaserController. En el Inspector panel, encontrar Láser Script y haga clic en Editar.

Lo único que tenemos que cambiar en este script es la posición del láser..

// Dispare el láser privado vacío Fuego () // Obtenga ARCamera Transform Transform cam = Camera.main.transform; // Defina la hora del siguiente incendio mNextFire = Time.time + mFireRate; // Establecer el origen de RayCast Vector3 rayOrigin = cam.position; // Mostrar el láser usando un Coroutine StartCoroutine (LaserFx ()); // Mantiene la información del hit RaycastHit hit; // Establezca la posición de origen de la línea láser // Agregará 10 unidades desde ARCamera // Adoptamos esta lógica por simplicidad Vector3 laserStartPos = nuevo Vector3 (cam.position.x, cam.position.y -2f, cam .position.z); mLaserLine.SetPosition (0, laserStartPos); // Comprueba si el RayCast golpeó algo si (Physics.Raycast (rayOrigin, cam.forward, out hit, mFireRange)) // Establezca el final de la línea láser en el objeto hit mLaserLine.SetPosition (1, hit.point) ; // verifique el tipo de destino 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 // Establezca la concentración de la línea láser para avanzar la cámara // utilizando el rango de láser mLaserLine.SetPosition (1, cam.forward * mFireRange); 

Probando el juego

 

Eso fue mucho trabajo, ¡pero ahora es el momento de jugar el juego! Imprima la imagen de destino e intente ejecutar su juego en su teléfono o tableta. Diviértase y vea si puede encontrar algunas maneras de mejorar el juego.! 

En este punto, tienes una buena comprensión de cómo funciona el sistema Vuforia y cómo usarlo con Unity. Espero que hayas disfrutado este viaje tanto como yo. Te veo pronto!

Para obtener más información sobre la realidad aumentada con Vuforia y Unity, consulte nuestro curso de video aquí en Envato Tuts+!