Tabla de contenidos

Parte 3: Hacer un seguimiento de la puntuación, las recolecciones de elementos y obstáculos sin fin de desove

Esta es la parte final de una serie de tutoriales de tres partes sobre cómo crear un juego casual Hyper. Por favor asegúrese de que ha seguido y completado la primera y segunda partes del tutorial y los terminó antes de comenzar la parte 3. Estos son los enlaces a la Parte 1 y Parte 2.

Esta parte del tutorial se hizo en la versión Unidad 2018.2.13f1, que era la misma versión utilizada en los tutoriales anteriores.

Puede descargar los archivos de código fuente tutorial aquí. Todos los archivos de proyecto se encuentran en la carpeta principal. La carpeta contiene archivos activos intermedios adicionales que se utilizaron durante el proceso de creación de los sprites del juego.

No se pierda! extremos de la oferta en

  • Accede a los más de 200 cursos
  • Nuevos cursos añadió mensual
  • Cancelar en cualquier momento
  • Los certificados de terminación

    ACCESO ahora

    Cómo cambiar el color de fondo

    Cambiar el color de fondo en la cámara principal a Negro (no dude en cambiar esto a cualquier color que te gusta, el color del fondo no afectará a cómo se juega el juego).

    Adición de la necesaria bibliotecas

    Las siguientes bibliotecas deben agregarse: SceneManagement y TMPro al guión GameManager .
    usando UnityEngine.SceneManagement; usando TMPro; 12usingUnityEngine.SceneManagement; usingTMPro;

    desactivación y activación de la GameOverPanel

    Asegúrese de que ha desactivado la GameOverPanel en la ventana de inspección. Vamos a activarlo sólo cuando la función se llama GameOver en el guión GameManager. Añadir un GameObject público para el guión GameManager, y el nombre de GameOverPanel, configurar esto en el inspector y así en el componente de secuencia de comandos adjunta al objeto GameManager en la escena. Esto es por lo que el guión sabe lo que es GameOverPanel activar cuando la función se llama GameOver. En la función GameOver que necesitamos para establecer el GameOverPanel a estar activo. Guardar la secuencia de comandos.
    pública GameObject GameOverPanel; GameOver pública void () {debug.log ( «Juego encima!»); GameOverPanel.SetActive (true); } 1234567publicGameObject GameOverPanel; publicvoidGameOver () {debug.log ( «Juego encima!»); GameOverPanel.SetActive (true);}

    funcionalidad botón Reiniciar

    Añadir una función RestartGame al guión GameManager. Dentro de esta función simplemente vamos a cargar la escena de nuevo.
    pública RestartGame void () {SceneManager.LoadScene (0); } 1234publicvoidRestartGame () {SceneManager.LoadScene (0);.}

    A continuación, necesitamos configurar el evento on click en el botón de reinicio en la ventana de inspección


    Artículo camionetas

    Por supuesto, no es un juego casual Hyper estaría completa sin un objeto de colección de algún tipo, vamos a crear algunos diamantes pick ups siguiente. Crear un objeto de juego vacía y cambiarle el nombre a “elemento”. En el conjunto de transformación componente la posición X a 3 y la posición Y a 6. Crear un nuevo sprite diamante y establecer el color a amarillo. Hacer que el diamante a un niño del objeto juego de artículos. Cambie el nombre del diamante para Diamond1. Añadir un componente 2D círculo colisionador y establecer el disparador Is true. Restablecer la transformación de componentes. Ajustar la escala a 0,5 en tanto los valores de Y el X y. Añadir una nueva etiqueta y el nombre de “Punto”. Asegúrese de etiquetar el Diamond1 con esta etiqueta. Hacer que el objeto del juego de artículos en una casa prefabricada arrastrándolo desde la jerarquía en la carpeta de casas prefabricadas.

    Abrir el guión jugador y tenemos que añadir una sentencia if para la función OnTriggerEnter2D que detectará si los colisiona jugador GameObject con un juego de objetos etiquetados como “obstáculos” y luego llamar a la función PlayerDeath allí y más si el jugador choca con un juego de objetos etiquetados como “elemento”. La sentencia else if permanecerá vacía hasta que añadimos en la función de aumentar la puntuación.
    OnTriggerEnter2D private void (Collider2D otra) {if (other.gameObject.tag == «obstáculo») {PlayerDeath (); } Else if (other.gameObject.tag == «elemento») {}} 12345678910111213privatevoidOnTriggerEnter2D (Collider2D otra) {if (other.gameObject.tag == «obstáculo») {PlayerDeath ();} elseif (other.gameObject.tag == «elemento») {}}

    Configuración de la Partitura con TextMeshPro y aumentarla

    Seleccione el objeto del juego lienzo en la jerarquía y crear un objeto de juego vacío y el nombre de “Puntuación”. Tras confirmar que se trata de un niño con el objeto Canvas. Crear una interfaz de usuario> TextMeshPro objeto de texto como un niño al objeto Score. Con el objeto CurrScore seleccionado ajustar la alineación al centro y media en el inspector. Cambiar la fuente de activos a Oswald-Bold. En el cuadro de entrada de texto puso 1. Ajustar el valor Tamaño de fuente a 290. Cambiar el valor de color hexadecimal a B7B3B3. Ajustar el Alfa a 80.


    En el Rect Transformar componente ajustar el ancho a 270 y la altura a 280. Marque la casilla Tamaño automático y cambie el valor máximo de 535.


    Abrir el guión GameManager y añadir una variable TextMeshUProGUI público llamado “currScoreText.” Añadir una variable int currScore privado. En la función de arranque ajustado el valor currScore a 0.
    TextMeshProUGUI currScoreText pública; int currScore; // Usar esto para la inicialización de inicio void () {currScore = 0; ScoreSetting (); } 12345678910publicTextMeshProUGUI currScoreText; intcurrScore; // Usar esto para initializationvoidStart () {currScore = 0; ScoreSetting ();}

    Abre el guión Player y llamar a la función ScoreIncrement en el else if donde el jugador está colisionando con el artículo recoger. Con el fin de hacer esto correctamente, debe hacer referencia al gameManagerObject continuación, llamar a la función ScoreIncrement, que debe ser similar al siguiente:
    vacío Awake () {gameManagerObject = GameObject.Find ( «Juego Manager») getComponent (.); OnTriggerEnter2D} private void (Collider2D otra) {if (other.gameObject.tag == «obstáculo») {PlayerDeath (); } Else if (other.gameObject.tag == «elemento») {gameManagerObject.ScoreIncrement (); }} 1234567891011121314151617181920voidAwake () {gameManagerObject = GameObject.Find ( «Juego Manager») getComponent ();}. PrivatevoidOnTriggerEnter2D (Collider2D otra) {if (other.gameObject.tag == «obstáculo») {PlayerDeath (); } elseif (other.gameObject.tag == «elemento») {gameManagerObject.ScoreIncrement ();}}

    Guardar el guión, y abrir el Editor de la Unidad, el objeto del juego CurrScore en las necesidades de escena para ser puesta en el Game componente de administrador en la ventana de inspección en el lugar abierto Curr Puntuación de texto, sólo tienes que arrastrar el objeto CurrScore de la jerarquía al lugar abierto en el componente de juego Manager y después haga clic en Reproducir y la prueba de los cambios. Cada vez que el jugador ahora choca con el elemento de diamantes de la puntuación aumentará. No podemos olvidar llamar a la función Destruir en la pastilla del elemento para que una vez que el jugador choca con él, y luego los incrementos de puntuación, tenemos que destruir el juego de objeto en la escena por lo que no permanece más tiempo en el juego. Para ello, en virtud de la función gameManagerObject.ScoreIncrement en el guión de DVD, asegúrese de guardar el guión y la prueba de que el artículo de hecho está siendo destruido después que el jugador choca con el objeto en el juego. Guardar la escena y de proyectos.
    Destruye (other.gameObject); 1Destroy (other.gameObject);.

    eliminar el elemento de forma prefabricada la Jerarquía, estaremos instanciar este objeto junto con los obstáculos al azar a través de código siguiente

    Al azar obstáculo y recogida elemento infinita generación

    Un aspecto importante de Hyper juegos casuales es aumentar la capacidad de repetición-. Queremos mantener al jugador a volver a jugar a nuestro pequeño juego, así que una forma de hacerlo es mediante la adición de obstáculos colocados al azar y camionetas de elementos. De esta manera el jugador experimenta un juego algo diferente cada vez que se reinicia el juego. Hicimos nuestra recogida en un elemento prefabricado y ahora vamos a girar el SquareObstacle en una casa prefabricada, pero primero tenemos que añadir algunos más cuadrados a la GameObject SquareObstacle.

    Seleccione el GameObject obstáculo plaza en la jerarquía y duplicar la plaza cuatro veces, esto ahora le dará un total de 5 plazas que son niños a la SquareObstacle. Puede duplicar fácilmente un elemento pulsando Ctrl-D en el teclado.

    Algunos valores en los cuadros transforman las necesidades de componentes que ser ajustado. Vea las imágenes debajo de los valores ajustados:


    Hacer el elemento prefabricado juego de objetos a un niño del obstáculo Square. Duplicar la Diamond1 cuatro veces. Vea las imágenes debajo de los valores ajustados de componentes transformar:


    Hacer que el SquareObstacle en una casa prefabricada.

    Crear un objeto del juego vacío y restablecer su componente transformar. Cambiar el nombre de esta para arrastrar “RectangleObstacle” un sprite cuadrado de los sprites carpeta bajo la RectangleObstacle y hacer que un niño de la misma. Cambiar el nombre de la plaza para Rectángulo, ajustar el valor de X en la escala del componente de transformar a 3. Ajustar el valor Y de la posición en el transformar componente a 5. duplicados que rectángulo de 4 veces. Asegúrese de añadir la etiqueta “obstáculo” para cada uno de los rectángulos, de manera que cuando el jugador lo hace chocar con uno que funcione correctamente. Ver las capturas de pantalla para la transformada de valores de ajuste de componentes:


    Hacer que el objeto del juego RectangleObstacle en una casa prefabricada. Una nota rápida, aquí se debe ser lo suficientemente cómodo en este punto para ajustar cualquiera de la escala o posición incluso transformar los valores sobre los obstáculos a algunos vlaues puede favorecer más de la forma en que se establecen en este tutorial.

    eliminar tanto el RectangleObstacle y la forma SquareObstacle la jerarquía. Guardar la escena y de proyectos.

    Crea un objeto de juego vacía y restablecer la transformación de componentes. Cambiar el nombre de este objeto a “ObstacleGenerator.” Crear y añadir un nuevo guión a este juego de objeto y el nombre de la secuencia de comandos “ObstacleGenerator.” Este script va a controlar la creación de instancias infinita de todas nuestras casas prefabricadas de obstáculos. Esto va a ser hecho mediante la medición de la distancia entre el objeto y el jugador del juego de las casas prefabricadas de obstáculos. Cada vez que el jugador obtiene dentro de una distancia de 25 entre el obstáculo Prefabs un nuevo obstáculo se creará una instancia. Vamos a utilizar una matriz para contener las casas prefabricadas de obstáculos y luego utilizar la función Random.Range elegir un obstáculo al azar para crear una instancia cada vez que el jugador está dentro de la distancia de 25. Agregue el código siguiente a la secuencia de comandos ObstacleGenerator:
    ObstacleGenerator clase pública: MonoBehaviour {GameObject jugador pública; pública GameObject [] obstáculos; obstCount int privado; int playerDistance = -1; int obstcIndex = 0; int distanceBetweenObstc = 25; // Usar esto para la inicialización de inicio void () {obstCount = obstacles.Length; CreateObstacle (); } // actualización se llama una vez por trama de actualización void () {int PlayerDistance = (int) (Player.transform.position.y / (distanceBetweenObstc / 2)); si (playerDistance = PlayerDistance!) {CreateObstacle (); playerDistance = PlayerDistance; }} Public void CreateObstacle () {int RandomObstCounter = Random.Range (0, obstCount); GameObject newObstacle = instanciar (obstáculos [RandomObstCounter], nuevo vector3 (0, obstcIndex * distanceBetweenObstc), Quaternion.identity); newObstacle.transform.SetParent (transformar); obstcIndex ++; }} 12345678910111213141516171819202122232425262728293031323334353637383940publicclassObstacleGenerator: MonoBehaviour {publicGameObject jugador; publicGameObject [] obstáculos; privateintobstCount; intplayerDistance = -1; intobstcIndex = 0; intdistanceBetweenObstc = 25; // Usar esto para initializationvoidStart () {obstCount = obstacles.Length; CreateObstacle ();} / / actualización se llama una vez por framevoidUpdate () {intPlayerDistance = (int) (Player.transform.position.y / (distanceBetweenObstc / 2)); if (! = playerDistance playerDistance) {CreateObstacle (); playerDistance = playerDistance;}} publicvoidCreateObstacle () {intRandomObstCounter = Random.Range (0, obstCount); GameObject newObstacle = instanciar (obstáculos [RandomObstCounter], newVector3 (0, obstcIndex * distanceBetweenObstc), Quaternion.identity); newObstacle.transform.SetParent (transformar); obstcIndex ++;} }

    Guardar la secuencia de comandos y abrir el Editor de la Unidad y la exitosa obra para poner a prueba los cambios. Ahora debería ser capaz de ver las casas prefabricadas de obstáculos que se crean instancias como el jugador se mueve hacia arriba. A continuación, tenemos que asegurarnos de que estamos destruyendo los obstáculos y las recolecciones de artículos que se están instanciados para que no se quedan en la escena del juego y “cerdo” los recursos y la causa de estrellarse del juego. Podemos hacer esto mediante la creación de un objeto de juego vacía y por lo que es un hijo del jugador. Vamos a cambiar el nombre de este objeto “Obstáculo Collector”. Esto es esencialmente va a seguir detrás del jugador y como el jugador se mueve hacia arriba se sigue detrás de él desde su ahora un hijo del objeto jugador del juego. Como este obstáculo choca coleccionista con los objetos del juego etiquetados “obstáculos” y también “elemento” serán destruidos.

    Crea una casilla Colisionador 2D al obstáculo Conjunto de recopiladores de la IS de disparo a True y establezca el valor de desplazamiento Y en el colisionador cuadro a -12,41 ajustar el valor del tamaño de X a 54.63. Añadir un componente 2D cuerpo rígido, y establecer el tipo de cuerpo de cinemática. Tenemos que usar un cuerpo rígido en este modo que la colisión funciona correctamente, y estamos poniendo a cinemática, recordamos tipos de cuerpo cinemáticas no se ven afectados por las fuerzas o la gravedad. tipos de cuerpo cinemáticas también utilizan menos recursos. Crear y añadir un nuevo guión al obstáculo del colector y el nombre del ObstacleDestroyer guión.


    Añadir una función OnTriggerEnter2D vacío privada con el parámetro distinto. Dentro de esta función de crear una sentencia if que comprobará si las colisiona con cualquier obstáculo ObstacleCollector etiquetados “obstáculos” y también “elemento” y luego destruir el objeto del juego.
    OnTriggerEnter2D private void (Collider2D otra) {if (other.gameObject.tag == «obstáculo» && other.gameObject.tag == «artículo»); {Destruir (other.gameObject); }} 12345678910privatevoidOnTriggerEnter2D (Collider2D otra) {if (other.gameObject.tag == «obstáculo» && other.gameObject.tag == «artículo»); {Destruir (other.gameObject);}}

    Guardar la secuencia de comandos y abrir el Editor de la Unidad y la exitosa obra para probar los cambios. Ahora debería ver los obstáculos y los artículos que son retirados de la escena del juego como el obstáculo choca con ellos coleccionista como el jugador se mueve hacia arriba.

    Adición de rotación a los obstáculos

    un poco de dinamismo es necesario para nuestros obstáculos; podemos lograr esto mediante la adición de una secuencia de comandos simple rotación de los obstáculos de manera que giren en una dirección al azar. Esto añadirá un bonito efecto “jugoso” para el juego.

    Crear un nuevo guión y el nombre de la rotación, abrirlo para su edición. Añadir una variable pública llamada “RotSpeed” sin valor inicial.

    Crea una función void privada y el nombre de “ObstacleRot”. Dentro de esta función podemos rotar los obstáculos mediante el uso de transform.rotate Vector3.forward y multiplicando esta por Time.deltaTime y la RotSpeed. Tendremos que llamar a esta función en la función de actualización, pero también tenemos que hacer una comprobación de si para ver si el RotSpeed ​​no es igual a 0, a continuación, llamar a la función ObstacleRot.
    public int RotSpeed; // Usar esto para la inicialización de inicio void () {} // actualización se llama una vez por cuadro de actualización de vacío () {if (RotSpeed ​​= 0) {ObstacleRot (); }} Privada ObstacleRot void () {transform.rotate (Vector3.forward * * Time.deltaTime RotSpeed); 1234567891011121314151617181920publicintRotSpeed}; // Usar esto para initializationvoidStart () {} // actualización se llama una vez por framevoidUpdate () {if (RotSpeed ​​= 0) {ObstacleRot ();}} privatevoidObstacleRot () {transform.rotate (Vector3.forward * Time.deltaTime * RotSpeed);}

    Tutorial Conclusión

    Así que eso es todo! Ha creado un juego casual Hyper. Algunas formas de añadir un poco más de precisión a este pequeño juego son para agregar un elemento de movimiento de la cámara desencadenada por la muerte del jugador, o incluso cambiar el color de fondo al azar cada vez que se reinicie el juego. Algunos efectos de recogida podrían añadirse donde entran en juego los efectos de partículas, cuando el jugador choca con un elemento.

    Mensajes relacionados

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *