Crea un juego de carreras de globos en Unity usando el micrófono

Lo que vas a crear

Introducción

En este tutorial, aprenderás cómo crear un juego 2D usando C # y Unity. Aprovecharemos el soporte de micrófono de Unity para mejorar la jugabilidad del juego. El objetivo del juego es simple, llegar al otro lado del nivel al evitar los obstáculos en el camino. El jugador puede mover el personaje principal soplando en el micrófono del dispositivo, moviéndolo hacia arriba.

Aprenderás los siguientes aspectos del desarrollo del juego Unity en este tutorial:

  • Configuración de un proyecto 2D en Unity.
  • importando sprites
  • controles de micrófono
  • trabajando con colisiones físicas

1. Crea un nuevo proyecto de unidad

Abre Unity y selecciona Nuevo proyecto desde el Expediente Menú para abrir el nuevo cuadro de diálogo del proyecto. Indica a Unity dónde quieres guardar el proyecto y configuraConfigurar valores predeterminados para: menú para 2D.

 

2. Crear configuraciones

En el siguiente paso, se presenta la interfaz de usuario de Unity. Configure el proyecto para su plataforma preferida eligiendo Configuraciones de compilación desde el Expediente Menú y selección de la plataforma de destino..

3. Interfaz de usuario de Unity

Antes de comenzar, asegúrese de que 2D botón en el Escena El panel está resaltado. También puede modificar la resolución actual en el Juego panel.

También deberías ver los paneles del área de trabajo de Unity, que usaremos en este tutorial. Tómese un momento para explorar la interfaz de usuario de Unity, como la Escena, Juego, Jerarquía, Proyecto, Bienes, y Inspector. Los usaremos mucho en este tutorial..

4. Interfaz de juego

La interfaz de usuario de nuestro juego será sencilla. La siguiente captura de pantalla te da una idea de los recursos que usaremos y de cómo quedará la interfaz de usuario final del juego. Puede encontrar los recursos que usaremos en los archivos de origen en GitHub.


5. Lenguaje de programación

Puedes usar uno de los tres lenguajes de programación cuando usas Unity, DO#, UnityScript, una variación de JavaScript, y Abucheo. Cada uno de estos lenguajes de programación tiene sus pros y sus contras y depende de usted decidir cuál prefiere. Mi preferencia personal va al lenguaje de programación C # y ese es el lenguaje que usaré en este tutorial.

Si decide utilizar otro lenguaje de programación, asegúrese de consultar la Referencia de guiones de Unity para ver ejemplos..

6. Activos y efectos de sonido

Antes de comenzar la codificación, debemos agregar los activos al proyecto de Unity. Puedes hacer esto de varias maneras:

  • seleccionar Importar nuevo activo desde el Bienes menú
  • agrega los elementos a la carpeta de activos en tu proyecto
  • arrastrar y soltar los activos en la ventana del proyecto

Después de completar este paso, debería ver los activos en el proyecto de su proyecto. Bienes carpeta en el Proyecto panel.

Usaremos una serie de sonidos para crear una gran experiencia auditiva. Los efectos de sonido utilizados en este tutorial se obtuvieron de freesound.org.

7. Antecedentes

Comience arrastrando y soltando el fondo en el Jerarquía panel. Debería aparecer automáticamente en el Escena panel.


8. Tamaño de la cámara

Porque el Escena El panel está configurado para mostrar una vista 2D, notará que al seleccionar Cámara principal en el Jerarquía muestra una vista previa de lo que la cámara va a mostrar. También puedes ver esto en el Juego ver. Para que toda la escena sea visible, configure la tamaño valor de la Cámara principal a 4 en el Inspector panel como se muestra a continuación.

9. Hoja de Sprite

Usaremos una hoja de sprites para los elementos de la interfaz de usuario de nuestro juego. Unity tiene un editor de sprites que facilita el uso de sprites. La obra de arte utilizada en este tutorial se obtuvo de openclipart.org.

Importe la obra, selecciónela de la Bienes panel, y cambiar el Modo Sprite opción a Múltiple en el Inspector panel.

Haga clic en el botón etiquetado Editor de Sprite y establecer el Tipo opción a Automático.

10. Vaca Rigidbody 2D

Con la hoja de sprites cortada y lista para usar, haga clic en la flecha que aparece cuando se selecciona la hoja de sprites y elija el sprite de la vaca, el personaje principal de nuestro juego. Arrástrelo a la escena para agregarlo..

Para detectar colisiones, al menos uno de los objetos en colisión debe tener un Rigidbody 2D componente adjunto a él. Para agregar uno a la vaca, haga clic en Agregar componente botón en el Inspector panel. De la lista de componentes, seleccione RigidBody 2D en el Física 2D sección.

Comprobar el Ángulo fijo Caja para evitar que la vaca gire si se produce una colisión. No usaremos la gravedad física predeterminada en este juego, en lugar de eso simularemos la nuestra. Cambiar el Escala de gravedad desde 1 a 0 para garantizar que la gravedad predeterminada no afecte al objeto.

11. Añadiendo colisionadores

El piso se usa para evitar que nuestro personaje principal se caiga una vez que hemos agregado física al juego. Crea un nuevo objeto de juego seleccionando Crear vacío desde el GameObject menú.

Para hacer que el piso detecte cuando el personaje lo está tocando, necesitamos agregar un Box Collider 2D componente. Un colisionador es una forma física que define el área que desencadena una colisión..

Seleccione el objeto de juego de piso en el Jerarquía, abre el Inspector panel, y haga clic en Agregar componente. De la lista de componentes, seleccione Box Collider 2D en el Física 2D sección.

Cambiar el tamaño propiedad a X: 4.8 y Y: 0.05 para crear un pequeño rectángulo donde la vaca será posicionada. Finalmente, agregue un Box Collider 2D al objeto del juego de la vaca repitiendo estos pasos.

12. Fuente de audio de vaca

Un Fuente de audio componente se utiliza para reproducir un clip de audio cuando el jugador recoge la estrella. Este componente leerá el conjunto de clips de audio en sus opciones y lo reproducirá cuando se lo llame desde un script o al principio si el Jugar en Awake casilla de verificación está seleccionada.

Para reproducir un sonido cuando el jugador recoge una estrella, primero debemos adjuntar un Fuente de audio componente a ella Seleccione la estrella de la Jerarquía o Escena ver, haga clic en el Agregar componente botón en el Inspector panel, y seleccione Fuente de audio en el Audio sección.

Como solo queremos que el sonido se reproduzca cuando el jugador toca la estrella, debemos desmarcar la Jugar en Awake opción. Haga clic en el pequeño punto a la derecha, debajo del icono del engranaje, para seleccionar el sonido que queremos reproducir..

13. añadiendo globos

Los globos representan la vida o la salud de nuestro personaje principal. Cuando una mano colisiona con la vaca, hará estallar uno de los globos para indicar que fue golpeado y el número de vidas ha disminuido..

Arrastra el sprite globo desde el Bienes al Jerarquía panel y luego de vuelta a la Bienes. Esto creará un casa prefabricada del globo. Notarás que el texto se vuelve azul indicando que ahora es una casa prefabricada. Al crear un prefab, podemos reutilizar el globo sin utilizar recursos adicionales.

Seleccione el nuevo prefab y presione Comando + D para duplicarlo. Utilizar el Rotación Herramienta para rotar ligeramente los globos como se muestra en la captura de pantalla anterior.

Agrupamos la vaca y los globos para que moverlos sea un poco más fácil. Para ello, arrastra un globo desde el Jerarquía panel y colóquelo sobre el objeto de juego de la vaca en el Jerarquía panel. El objeto del juego de la vaca se resalta para indicar que colocar el globo sobre él lo agregará como elemento secundario del objeto del juego de la vaca. El resultado es que mover el objeto del juego de la vaca también mueve la posición de los globos..

14. Añadiendo Obstáculos

Las manos son los enemigos u obstáculos que deben evitarse si el jugador quiere terminar el nivel recogiendo la estrella. Las manos se mueven de lado a lado, dejando un espacio estrecho en el medio para que la vaca pase a través.

Debido a que las manos son objetos de juego que usaremos varias veces, primero lo convertimos en una casa prefabricada como lo hicimos con los globos. Siga los pasos anteriores para crear la prefab y utilice las herramientas del editor para colocar las manos como se muestra en la captura de pantalla anterior.

También necesitamos agregar un colisionador a cada mano para detectar colisiones. Para agregar el colisionador, haga clic en Agregar componente botón en el Inspector panel y seleccione Box Collider 2D en el Física 2D sección. Notará que aparece un cuadro verde alrededor de la mano cuando lo selecciona para indicar que la mano tiene un colisionador atado.

También reproducimos un sonido cuando una mano choca con la vaca, haciendo estallar un globo. Para lograr esto, primero necesitamos agregar el sonido. Seleccione la mano de la Jerarquía o Escena ver, haga clic en el Agregar componente botón en el Inspector panel, y seleccione Fuente de audio desde el Audio sección.

Los detalles del componente de audio se mostrarán en la Panel de inspectores. Haga clic en el punto debajo del icono del engranaje para seleccionar el sonido correcto.

15. Añadiendo la estrella

El objetivo del juego es recoger la estrella al final de cada nivel. El jugador puede mover la vaca hacia arriba soplando en el micrófono del dispositivo.

Arrastra la estrella desde el Bienes panel y agregarlo a la Escena. En el Inspectores Transformar En la sección, cambie los valores como se muestra en la captura de pantalla a continuación para colocar la estrella.

Esto colocará a la estrella en la parte superior del nivel. Para detectar cuándo la vaca recoge la estrella, debemos agregarle un colisionador, como ya hicimos algunas veces. Agrega un Box Collider 2D a la estrella.

16. Añadiendo Alertas

Las alertas también son objetos de juego. Son mensajes que informan al jugador cuando el nivel se ha completado o el juego ha terminado..

Arrastra las alertas desde el Bienes panel para el Jerarquía y luego de vuelta a la Bienes Panel para convertirlos en un prefab. Más adelante en este tutorial, agregaremos un script a las alertas y mostraremos cómo se usan. No olvides borrarlos de la Escena una vez que los hayas convertido en un prefab.

17. Añadiendo guiones

Unity incluye un editor de código, una versión de Mono Desarrollar. Si bien es un buen editor, puedes usar el editor que quieras. Estudio visual, por ejemplo, es una opción popular si está utilizando Windows.

Puede crear un nuevo archivo iniciando su editor de código, guardando el archivo en el Bienes carpeta de su proyecto, y luego agregarla a un GameObject, Al igual que lo hace con un componente. Alternativamente, puede crear un nuevo script en el Inspector seleccionando Nueva secuencia de comandos y luego haga doble clic para abrirlo.

18. Detección de entrada de micrófono

Para mover a nuestro personaje principal, necesitaremos acceso al micrófono del dispositivo. De forma predeterminada, Unity proporciona soporte básico para capturar audio, pero no incluye una propiedad o método para detectar el nivel de actividad del micrófono, que es lo que necesitamos para mover a la vaca..

Afortunadamente, podemos utilizar un script de terceros que nos dará acceso a un volumen propiedad. los volumen propiedad nos permitirá, junto con posición de transformación, mover la vaca.

Crear un vacío GameObject y nombrarlo Entrada de micrófono. Utilizar el Agregar componente botón para adjuntar el script antes mencionado y una Fuente de audio componente para el nuevo objeto de juego.

Al hacer esto, habilitamos el script y la aplicación comenzará a capturar la entrada del micrófono. Ajustando el Sensibilidad propiedad en el Inspector, controlamos cuánto se mueve la vaca con la entrada del micrófono. Cuanto mayor sea el valor, más rápido se moverá la vaca. He encontrado que 50 es un buen valor para empezar.

19. Moviendo las manos

El siguiente script define el Mano Clase y controla el movimiento de las manos. Las manos se mueven continuamente de izquierda a derecha y viceversa. Veamos como funciona esto..

Paso 1: Propiedades

La primera propiedad que usamos en el script es Velocidad de movimiento, una flotador que define el número de unidades que una mano mueve durante cada cuadro. Establece el X valor de la posición de transformación propiedad, moviendo la mano horizontalmente.

La segunda propiedad, currentPos, también es un flotador y almacena la posición actual de la mano antes de que se mueva. Esto nos ayudará a calcular el número de unidades que la mano puede mover..

utilizando UnityEngine; utilizando System.Collections; Mano pública de clase: MonoBehaviour private float moveSpeed ​​= 0.02f; Flotante privado actualPos; público bool izquierdo = falso;

Por último, la izquierda propiedad de tipo booleano Define si la mano se mueve hacia la izquierda. Esto facilita cambiar la dirección de una mano al configurar el izquierda variable a cualquiera cierto o falso.

Paso 2: Método de inicio

los comienzo método es un método definido en el MonoBehaviour clase que se llama durante la inicialización, antes de llamar a cualquier otro método, con la excepción de Despierto, que no cubriremos en este tutorial.

En el comienzo Método, podemos configurar el objeto antes de ejecutar cualquier otro código. En este caso, configuramos el currentPos propiedad a la posición actual de la mano, antes de que se haya movido.

void Start () currentPos = transform.position.x; 

Paso 3: Cambiar posición

En el Actualizar Método, verificamos si la mano es izquierda o derecha y la movemos en la dirección correcta durante cada cuadro. Para ello, escribimos un Si declaración dentro de la Actualizar Método y disminuir o aumentar la X posición usando el Velocidad de movimiento variable para modificar la posición propiedad.

void Update () / * Move Hand * / / * Move to the right si la mano está en el lado izquierdo * / if (! left) transform.position - = new Vector3 (moveSpeed, 0, 0);  else transform.position + = new Vector3 (moveSpeed, 0, 0);  / * Cambie moveSpeed ​​para moverse en la otra dirección, creando un bucle de movimiento * / if (transform.position.x <= currentPos - 0.7f)  moveSpeed *= -1;  if (transform.position.x >= currentPos + 0.7f) moveSpeed ​​* = -1; 

Cuando la mano se mueve 0.7 unidades, multiplicamos la Velocidad de movimiento propiedad por -1 Para hacer que la mano se mueva en la dirección opuesta. El resultado es que las manos se mueven de un lado a otro en un bucle continuo, lo que dificulta que la vaca pase a través de las manos y alcance la estrella..

20. Guión de vaca

Cree un nuevo script y adjúntelo al objeto del juego cow. Este script manejará las acciones del jugador y algunas otras funciones relacionadas con la mecánica del juego, como mostrar las alertas. Echemos un vistazo a las propiedades utilizadas en este script..

utilizando UnityEngine; utilizando System.Collections; Vaca de clase pública: MonoBehaviour privado Vector3 gravedad = nuevo Vector3 (0, 0.02f, 0); GameObject micVolume público; flotador privado moveSpeed; globos de bytes privados = 3; juego públicoObject alertWin; public GameObject alertLose; 
  • gravedad: usado para simular una fuerza vertical, tira la vaca hacia abajo
  • micVolumen: referencia a la Entrada de micrófono objeto de juego
  • Velocidad de movimiento: obtiene el volumen valor de la Entrada de micrófono clase
  • globos: contiene cantidad de globos, este valor representa la vida del jugador
  • alertWin: Referencia a la alertWin objeto de juego
  • alertar perder: Referencia a la alertar perder objeto de juego

Tenga en cuenta que las variables públicas deben configurarse en el editor de Unity. Todos ellos son referencias a prefabs. Establecer el valor de una variable en el editor es fácil. Guarde el script y asegúrese de que no haya errores. Luego vuelve a Unity y selecciona objeto de juego a la que se adjunta el guión. Debería ver las variables enumeradas debajo del componente de script como se muestra a continuación.

Arrastre y suelte el activo requerido o preferido a la variable, o haga clic en el pequeño punto debajo del icono de engranaje para seleccionarlo.

Asegúrese de que el activo y la variable son de la el mismo tipo o no podrá soltarlo o verlo cuando haga clic en el icono de punto.

21. Moviendo la vaca

Paso 1: Moverse

Para mover la vaca hacia arriba, usaremos la FixedUpdate método. ¿Por qué no el regular? Actualizar ¿método? Este método es un predefinido. MonoBehaviour método que se ejecuta cada velocidad de cuadro fija en lugar de cada cuadro Esto significa que será suave incluso si la velocidad de cuadros actual es un poco baja. Agregue el siguiente bloque de código al script:

void FixedUpdate () / * Mueve la vaca hacia arriba según el volumen del micrófono * / moveSpeed ​​= micVolume.GetComponent() .nombre * 0.01f; transform.position = new Vector3 (0, transform.position.y + moveSpeed, 0); / * Simular nuestra propia gravedad (esta no se vuelve más fuerte cuando está alta) * / transform.position - = gravedad; 

Calculamos la velocidad obteniendo la intensidad actual del micrófono. Esta sonoridad se obtiene de la Entrada de micrófono clase y luego multiplicado por 0.01. Hacemos esto para evitar que la vaca se mueva demasiado rápido.

El personaje de la vaca se mueve aumentando la y valor de la posición de transformación propiedad, utilizando la velocidad almacenada en Velocidad de movimiento.

Paso 2: Simulando Gravedad

Además de mover la vaca, también aplicamos una fuerza hacia abajo, la gravedad. Esto lo logramos disminuyendo la posición de la vaca usando el gravedad vector que creamos anteriormente. Hacer esto reducirá constantemente la y Posición de la vaca sin hacerla caer más rápido, lo que sucede si tuviéramos que utilizar el comportamiento de gravedad predeterminado..

22. Colisión de manos

Paso 1: Detectar colisiones

En el siguiente paso, detectamos si alguna de las manos choca con la vaca. los OnTriggerEnter2D El método se ejecuta cuando dos objetos chocan sin interacción física. En este caso, verificamos si la vaca colisiona con un objeto llamado "Mano", que puede ser cualquiera de las manos en la escena, y reproducir el audio adjunto al objeto del juego de la vaca si ocurre la colisión. Notarás que también inspeccionamos la propiedad alfa de la vaca. Por qué hacemos esto se explica en el siguiente paso..

void OnTriggerEnter2D (Collider2D otro) / * Hands Collision * / if (other.name == "Hand" && transform.GetComponent() .color.a == 1) other.audio.Play ();

Paso 2: Prevención de colisiones múltiples

Las colisiones se prueban varias veces en cada fotograma, lo que significa que se producirán tres colisiones en muy poco tiempo haciendo estallar todos los globos. Como no queremos que esto suceda, necesitamos una manera de prevenir esto..

Una forma útil de hacer esto es cambiar el alfa del objeto hit. Esto también le dará al usuario retroalimentación visual que indica que ha sido golpeado. Las siguientes líneas se encargarán de eso..

/ * Prevenir de colisión múltiple * / Color alfa = nuevo Color (1, 1, 1, 0.5f); transform.GetComponent() .color = alfa; Invocar ("EnableCollision", 1);

Primero creamos un nuevo Color objeto y asignarle el color del objeto del juego y establecer el alfa valor para 0.5 para que sea semitransparente. Entonces accedemos al objeto del juego. SpriteRenderer, Lo que nos permite modificar su color..

La última línea en este bloque de código espera un segundo y luego llama a la EnableCollision función. Esta función restablece los valores de color de la vaca para que pueda detectar una colisión nuevamente. Implementaremos esta función más adelante en este tutorial..

23. Extracción de globos

Cuando la vaca es golpeada por una mano, un globo necesita ser removido. Llamamos al Destruir Método en un objeto de juego de globo. Usamos el Encontrar Función, porque no tenemos una referencia a cada uno de los globos..

Esta función busca los recursos del juego y devuelve el objeto del juego que estamos buscando, en este caso un globo.

/ * Remove Balloon * / Destroy (GameObject.Find ("Balloon")); globos--;

Pero espera, ¿no hay tres globos en la escena? Eso es correcto. sin embargo, el Encontrar La función devuelve la primera coincidencia que puede encontrar. En otras palabras, devuelve el primer objeto de juego de globos que encuentra..

También decrementamos el globos contador para ayudarnos a saber cuando la vaca ha perdido todas sus vidas.

24. Game Over

El juego termina cuando todos los globos se han reventado. Para probar esto, comprobamos si globos es igual a 0 y mostrar una alerta si es verdadero. También establecemos el gravedades y propiedad a 0 y pausar el juego configurando escala de tiempo a 0.

los escala de tiempo La propiedad controla cómo pasa el tiempo en el entorno del juego. Se puede usar para hacer que el juego sea más rápido o más lento según su valor. La escala de tiempo predeterminada es 1.0, aumentar su valor acelera las funciones asociadas con la velocidad de fotogramas y disminuirlo las ralentiza. Configurándolo para 0 Pausa el juego, evitando nuevas colisiones..

/ * Game Over * / if (balloons == 0) GameObject alert = Instantiate (alertLose, nuevo Vector3 (0, 0, 0), transform.rotation) como GameObject; gravity.y = 0; Time.timeScale = 0; 

25. Nivel completo

Cuando el jugador llega al otro lado del nivel, necesitamos eliminar la estrella y mostrar una alerta que indica que el nivel se ha completado..

los Si la declaración verifica si la colisión es de hecho con el objeto estrella del juego y reproduce el audio adjunto a la vaca si el nombre es correcto. Luego eliminamos la estrella de la escena antes de crear la alerta. También establecemos el gravedades y propiedad a 0 Como hicimos en el paso anterior..

/ * Star Collision * / if (other.name == "Star") audio.Play (); Destroy (other.gameObject); GameObject alert = Instantiate (alertWin, nuevo Vector3 (0, 0, 0), transform.rotation) como GameObject; gravity.y = 0; 

26. Habilitando colisiones

los EnableCollision El método restablece el valor alfa del objeto del juego de la vaca después de que haya sido golpeado por una mano. Hacer esto permitirá que el objeto del juego de la vaca detecte otro golpe. Tenga en cuenta que el Color objeto tiene un alfa de 1.

void EnableCollision () Color alpha = new Color (1, 1, 1, 1); transform.GetComponent() .color = alfa; 

27. Reiniciando el juego

los Recargar método utiliza el Solicitud Clase para recargar el nivel actual. Crear un nuevo script llamado Reiniciar , agregue el siguiente bloque de código y adjúntelo a ambos prefabs de alerta que creamos anteriormente.

utilizando UnityEngine; utilizando System.Collections; Reinicio público de clase: MonoBehaviour void Update () if (Input.GetButton ("Fire1")) Reload ();  void Reload () Application.LoadLevel (Application.loadedLevel); 

Primero probamos si el usuario toca la pantalla usando la tecla Entrada clase y llamar al Recargar método si es cierto La implementación de la Recargar El método es corto y simple. Todo lo que hacemos es cargar el nivel actual, restableciendo cada objeto y variable a su estado inicial.

28. Pruebas

Es hora de probar el juego. prensa Comando-P para jugar el juego en la unidad. Si todo funciona como se espera, estás listo para los pasos finales..

29. Configuración del jugador

Cuando estés satisfecho con tu juego, es hora de seleccionar Configuraciones de compilación desde el Expediente menú y haga clic en el Ajustes del jugador botón. Esto debería mostrar el Ajustes del jugador en el Inspector Panel donde puede configurar los parámetros para su aplicación..

Estas configuraciones son específicas de la aplicación e incluyen el creador o la compañía, la resolución de la aplicación, el modo de visualización, etc. Estas configuraciones dependen de los dispositivos a los que te dirijas y de las tiendas o mercados en los que publicará tu juego..

30. Construye y juega

Una vez que su proyecto esté correctamente configurado, es hora de volver a visitar el Configuraciones de compilación y haga clic en el Construir botón. Eso es todo lo que se necesita para construir tu juego para prueba y / o distribución.

Conclusión

En este tutorial, hemos aprendido cómo implementar controles de micrófono, interacción física, hojas de sprites y otros aspectos del desarrollo de juegos utilizando Unity. Te animo a experimentar con el resultado y personalizar el juego para que sea tuyo. Espero que te haya gustado este tutorial y te haya resultado útil..