Hoy en día, estaremos terminando arriba en el juego que hemos comenzado a hacer en la parte 1 y parte 2. Por lo tanto, para recapitular sobre lo que tenemos que hacer para terminar el juego es añadir la música, la tabla de posiciones, pantalla de inicio, juego sobre la pantalla, y la pantalla de visualización de la tabla de posiciones. Espero que ustedes están listos, ésta pasará con bastante rapidez y le dará la información restante que necesita para terminar este juego y hacer otros juegos.

Descargar el archivo zip proyecto aquí

Tabla de contenidos
convertirse en un desarrollador de juegos vr profesional con la unidad

Pre-Order The Complete Realidad Virtual desarrollo del juego con Unity y aprender a crear juegos y experiencias de inmersión mediante la construcción de 10 juegos de realidad virtual. El curso asume ninguna experiencia previa Unidad o VR – Te enseñaremos C #, la Unidad y la programación 3D de la tierra-para arriba

comprobarlo en Zenva Academia y obtener acceso temprano!

Para empezar, vamos a solucionar un problema que no pude dirección y el aviso con la parte 2. La cuestión radica en la caja colisionador hemos creado. El parámetro es de disparo debe ser dejado sin marcar y modificar los parámetros para el tamaño de la caja para adaptarse mejor al chorro. Para centro de x debe ser 0, y debe ser de 9, y z debe ser 0. El tamaño debe ser cambiado, así, x es 70, y es 10, y z es 70.
JetFix

También debe hacer una ligera corrección al código también. Vamos a eliminar la línea que se ocupa de fijar el componente de cuerpo rígido para todos y cada misil. Sin embargo, esto causa problemas (problemas internos al motor de la Unidad).
utilizando UnityEngine; utilizando System.Collections; public class MissileController: MonoBehaviour {peligro GameObject pública; flotador privada spawnWait = 1f; void start () {StartCoroutine (SpawnWaves ()); } IEnumerator SpawnWaves () {while (true) {var xMinMax = Random.Range (-15F, 20f); Vector3 spawnPosition = nuevo Vector3 (xMinMax, 10f, 25f); Quaternion spawnRotation = Quaternion.Euler (nuevo Vector3 (90f, 0f, 0f)); Instantiate (peligro, spawnPosition, spawnRotation); retorno rendimiento nuevos WaitForSeconds (spawnWait); spawnWait – = 0.01f; si (spawnWait <0.05f) spawnWait = 0.05f; }}} 12345678910111213141516171819202122232425262728usingUnityEngine; usingSystem.Collections; publicclassMissileController: Riesgo de MonoBehaviour {publicGameObject; privatefloatspawnWait = 1f; voidStart () {StartCoroutine (SpawnWaves ());} SpawnWaves IEnumerator () {while (true) {varxMinMax = Random.Range (-15F , 20f); Vector3 spawnPosition = newVector3 (xMinMax, 10f, 25f); Quaternion spawnRotation = Quaternion.Euler (newVector3 (90f, 0f, 0f)); Instantiate (peligro, spawnPosition, spawnRotation); returnnewWaitForSeconds rendimiento (spawnWait); spawnWait- = 0.01f; si (spawnWait <0.05f) spawnWait = 0.05f;}}}

Esto debería solucionar el problema con los misiles y no siempre chorro de registro como ser golpeado. En otras palabras, la detección de colisiones era extremadamente buggy.

código de fondo

El siguiente, que debe crear la parte de atrás de la tabla de clasificación. Para empezar, lo primero que debe decidir qué formato se utilizará para ello. Yo he optado por ir con XML, ya que es el método más fácil de usar. Vamos a empezar por la construcción del código de fin de vuelta, sobre todo porque la parte delantera es la parte más fácil de hacer y debe ser guardado para el final.

Así que, para empezar tenemos que hacer la clase de la tabla de posiciones. Echemos un vistazo a todo el guión y descomponerlo a partir de ahí.
utilizando UnityEngine; usando System.Collections; using System.Xml; usando UnityEngine.UI; public class Clasificación: MonoBehaviour {text Texto pública; GameObject contenido público; vacío Inicio () {String path = Application.dataPath + «/Data/Leaderboard.xml»; XmlDocument doc = new XmlDocument (); Si {debug.log ( «Archivo no encontrado») (System.IO.File.Exists (Path)!); } Else {doc.Load (Path); XmlNodeList elemList = doc.GetElementsByTagName ( «SurvivalTime»); for (int i = 0; i (texto); text.transform.SetParent (content.transform, false); text.text = elemList [i] .InnerXml; }}} Public void writeToXML () {text = FindObjectOfType (); String path = Application.persistentDataPath + «/Leaderboard.xml»; XmlDocument doc = new XmlDocument (); Si {declaración XmlDeclaration = doc.CreateXmlDeclaration ( «1.0», «UTF-8», «sí») (System.IO.File.Exists (Path)!); XmlComment comentario = doc.CreateComment ( «Este es un archivo XML generado»); XmlElement la tabla de posiciones = doc.CreateElement ( «tabla de posiciones»); XmlElement survivalTime = doc.CreateElement ( «SurvivalTime»); survivalTime.InnerText = text.text; doc.appendChild (declaración); doc.appendChild (comentario); doc.appendChild (la tabla de posiciones); Leaderboard.AppendChild (survivalTime); // Guardar el documento doc.Save (Path); } Else // si el archivo ya existe {doc.Load (Path); // Obtener la raíz de la raíz elemento XmlElement = doc.DocumentElement; XmlElement survivalTime = doc.CreateElement ( «SurvivalTime»); // valores a los nodos survivalTime.InnerText = text.text; // Documento de construcción doc.appendChild (raíz); // Agregar elemento raíz a root.AppendChild elemento denominativo (survivalTime); // Anexar valores escrita a la palabra como elemento secundario // Guardar el documento doc.Save (Path); }}} 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788usingUnityEngine; usingSystem.Collections; usingSystem.Xml; usingUnityEngine.UI; publicclassLeaderboard: MonoBehaviour {text publicText; contenido publicGameObject; voidStart () {stringPath = Application.dataPath + «/ Data / Leaderboard.xml»; doc XmlDocument = newXmlDocument ( ); si) {debug.log ( «archivo no encontrado»);} (System.IO.File.Exists (Ruta!) else {doc.Load (Path); XmlNodeList elemList = doc.GetElementsByTagName ( «SurvivalTime»); para (INTI = 0; i (texto); text.transform.SetParent (content.transform, false); text.text = elemList [i] .InnerXml;} }} publicvoidwriteToXML () {text = FindObjectOfType (); stringPath = Application.persistentDataPath + «/ Leaderboard.xml»; XmlDocument doc = newXmlDocument (); (! System.IO.File.Exists (Path)) {si XmlDeclaration declaración = doc.CreateXmlDeclaration ( «1.0», «UTF-8», «sí»); XmlComment comentario = doc.CreateC omment ( «Este es un archivo XML generado»); XmlElement tabla de posiciones = doc.CreateElement ( «Clasificación»); XmlElement survivalTime = doc.CreateElement ( «SurvivalTime»); survivalTime.InnerText = text.text; doc.appendChild (declaración) ; doc.appendChild (comentario); doc.appendChild (Clasificación); Leaderboard.AppendChild (survivalTime); // Guardar documentdoc.Save (Path);} else // si el archivo ya existe {doc.Load (Path); // Obtener la raíz de la raíz elementXmlElement = doc.DocumentElement; XmlElement survivalTime = doc.CreateElement ( «survivalTime»); // los valores a la nodessurvivalTime.InnerText = text.text; // Documento Constructiondoc.AppendChild (raíz); // Agregar elemento raíz de elementroot.AppendChild palabra (survivalTime); // Anexar valores escrito a la palabra como elemento secundario // Guardar el documentdoc.Save (Path);}}}

lectura y escritura de datos XML

Como queremos que los datos del contador de tiempo que vamos a construir, tenemos que asegurarnos de que el elemento de texto de nuestra temporizador. Nuestro contador de tiempo será un objeto de texto en 3D, en el código que está representado por un objeto TextMesh. Tenemos dos métodos aquí, carga XML y escribir en XML.

Carga del XML es un método muy simple. La primera cosa que el método hace es cargar el archivo XML. El siguiente, declaramos lo que realmente queremos elemento de los datos de. La última cosa que hace es recorrer todos los elementos con la etiqueta de supervivencia y mostrar los resultados.
vacío Inicio () {String path = Application.dataPath + «/Data/Leaderboard.xml»; XmlDocument doc = new XmlDocument (); Si {debug.log ( «Archivo no encontrado») (System.IO.File.Exists (Path)!); } Else {doc.Load (Path); XmlNodeList elemList = doc.GetElementsByTagName ( «SurvivalTime»); for (int i = 0; i (texto); text.transform.SetParent (content.transform, false); text.text = elemList [i] .InnerXml; }}} 12345678910111213141516171819202122232425voidStart () {stringPath = Application.dataPath + «/ datos / Leaderboard.xml»; XmlDocument doc = newXmlDocument (); if (! System.IO.File.Exists (Path)) {debug.log ( «El archivo no encontrado «);} else {doc.Load (Path); XmlNodeList elemList = doc.GetElementsByTagName (» SurvivalTime «); for (Inti = 0; i (texto) ; text.transform.SetParent (content.transform, false); text.text = elemList [i] .InnerXml;}}}

a continuación, tenemos la escritura de código XML. En definitiva, es un código más mucho que el código de carga. En esencia, el código contiene una gran cantidad de placa de la caldera que especifica exactamente cómo queremos que el archivo XML que se genere, así como la ubicación. Vamos a entrar en ella y la descomponen.

A continuación, se especifica que el objeto de texto tiene que encontrar el objeto del tipo de texto de malla. Esto nos permitirá llamamos mucho más fácilmente este código en otro ramo, si es necesario. Creamos una cadena denominada ruta. Asignamos el camino para ser la ruta de datos de la aplicación, y añadimos que queremos que el nombre del archivo a ser la tabla de posiciones y es un archivo XML.
Voy a explicar exactamente lo que es. Contiene la ruta de carpeta de datos que alberga el del juego. Que es 100% diferente de la ruta de datos persistentes de la aplicación. Más sobre esto más adelante.
Por último, se define como un nuevo doc documento XML.
pública writeToXML void () {text = FindObjectOfType (); String path = Application.persistentDataPath + «/Leaderboard.xml»; XmlDocument doc = new XmlDocument (); Si {declaración XmlDeclaration = doc.CreateXmlDeclaration ( «1.0», «UTF-8», «sí») (System.IO.File.Exists (Path)!); XmlComment comentario = doc.CreateComment ( «Este es un archivo XML generado»); XmlElement la tabla de posiciones = doc.CreateElement ( «tabla de posiciones»); XmlElement survivalTime = doc.CreateElement ( «SurvivalTime»); survivalTime.InnerText = text.text; 123456789101112131415publicvoidwriteToXML () {text = FindObjectOfType (); stringPath = Application.persistentDataPath + «/ Leaderboard.xml»; XmlDocument doc = newXmlDocument (); if (! System.IO.File.Exists (Path)) {declaración XmlDeclaration = doc.CreateXmlDeclaration ( «1.0», «UTF-8», «sí»); XmlComment comentario = doc.CreateComment ( «Este es un archivo XML generado»); XmlElement tabla de posiciones = doc.CreateElement ( «Clasificación»); XmlElement survivalTime = doc.CreateElement ( «survivalTime»); survivalTime.InnerText = text.text;

Si el archivo y la ruta no existe, entonces tenemos que construir toda la estructura XML. Declaración crea la cabecera del archivo XML. Comentario, mientras que no se necesita tener un archivo XML válido, se añade a decir que no lo construimos con la mano. Tabla de posiciones es el elemento principal que tenemos que utilizar. El tiempo de supervivencia es el elemento secundario que albergará los datos del contador de tiempo.

Vamos a establecer el texto interno del tiempo de supervivencia a ser lo que el texto de la malla es de texto. a continuación, añadimos el niño para el doc como la declaración, comentario, y la tabla de clasificación. Tabla de clasificación tendrá su propio elemento hijo del tiempo de supervivencia. Entonces, podemos guardar el documento en la ruta especificada.
doc.appendChild (declaración); doc.appendChild (comentario); doc.appendChild (la tabla de posiciones); Leaderboard.AppendChild (survivalTime); // Guardar el documento doc.Save (Path); } Else // si el archivo ya existe {doc.Load (Path); // Obtener la raíz de la raíz elemento XmlElement = doc.DocumentElement; XmlElement survivalTime = doc.CreateElement ( «SurvivalTime»); // valores a los nodos survivalTime.InnerText = text.text; // Documento de construcción doc.appendChild (raíz); // Agregar elemento raíz a root.AppendChild elemento denominativo (survivalTime); // Anexar valores escrita a la palabra como elemento secundario // Guardar el documento doc.Save (Path); 123456789101112131415161718192021222324252627282930313233doc.AppendChild (declaración); doc.appendChild (comentario); doc.appendChild (Clasificación); Leaderboard.AppendChild (survivalTime); // Guardar documentdoc.Save (Path);} else // si el archivo ya existe {doc.Load (Path); // Obtener la raíz elementXmlElement root = doc.DocumentElement; XmlElement survivalTime = doc.CreateElement ( «survivalTime»); / / los valores a la nodessurvivalTime.InnerText = text.text; // Documento Constructiondoc.AppendChild (raíz); // Agregar elemento raíz de la palabra elementroot.AppendChild (survivalTime); // Anexar valores escrito a la palabra como elemento secundario // Guardar el documentdoc.Save (Path);

Si el archivo y la ruta existe, a continuación, coloque el documento. Tenemos que recuperar el elemento raíz que en nuestro caso es el elemento principal del documento (en nuestro caso es la tabla de posiciones) y también queremos asegurarnos de que podemos añadir más elementos de supervivencia.
de nuevo nos propusimos texto interno del tiempo de supervivencia a ser texto de la malla de texto. A continuación, establecemos que el elemento raíz del documento se puede agregar a. Finalmente, podemos añadir o agregar más al tiempo de supervivencia del elemento de la tabla de posiciones. El último paso consiste en guardar el documento en la ruta especificada.

No es demasiado difícil, sólo muy tediosa en la forma en que decidí ir con la creación y modificación de la clasificación con XML. Hay maneras más fáciles de manejar esta situación, pero siempre es una buena idea para saber exactamente lo que está pasando detrás de las escenas con XML y / o JSON.

El tiempo y temporizador

Vamos a empezar el código de temporizador. Es bastante simple y directo. Vamos a empezar por la creación de un texto público de malla, un flotador privado y dos enteros privados. Debe tener un aspecto como el siguiente código
scoreText Texto pública; int minutos privadas; int segundos privadas; flotador privada Score; 123456publicText scoreText; privateintminutes; privateintseconds; privatefloatScore;

El único método que tendremos es un método de actualización. La razón de esto es porque es más fácil para consolidar en un único método que se encarga de esta tarea uno.
El valor flotante de puntuación debe ser de suma y asignado al delta de tiempo.
El int de minutos se debe asignar a la clase Mathf y derribó a int la puntuación dividido por 60.
El int del segundo debe ser asignado a la clase Mathf y derribó a int la puntuación sustraído por los minutos multiplicado por 60.
A continuación formato a la cadena de valor de tener los minutos y segundos de visualización.
Por último, el texto del texto de malla debe tener el texto “de supervivencia:“. Y directamente debajo de ella el valor de cadena con formato creamos
vacío Update () {Score + = Time.deltaTime; minuto = Mathf.FloorToInt (Puntuación / 60F); segundos = Mathf.FloorToInt (Score – minutos * 60f); cadena formatedTime = string.Format ( «{0: 0}: {1:00}», minutos, segundos); scoreText.text = «de supervivencia:» + System.Environment.NewLine + formatedTime; } 12345678voidUpdate () {Score + = Time.deltaTime; minuto = Mathf.FloorToInt (Puntuación / 60F); segundo = Mathf.FloorToInt (Score-minutos * 60f); stringformatedTime = string.Format («{0: 0}: {1 : 00} «minutos, segundos); scoreText.text =» tiempo de supervivencia: «+ + System.Environment.NewLine formatedTime;}

Modificación de eventos de colisión y escribir datos XML

El siguiente en el último bit de código que hay que hacer por ahora es modificar la clase de misiles destruir. Vamos a cambiarlo de entrar en el gatillo para entrar en colisión y crear un nuevo método llamado guardar los resultados. Vamos a llamar a la clase de líderes, nombrarlo líder, y objetivo del juego añadir tabla de clasificación de componentes en él. Líder debe entonces tener la capacidad de llamar a la escritura con el método xml de esa clase.
void OnCollisionEnter (Collision otra) {Destruir (other.gameObject); SaveResults (); Destruye (GameObject); SceneManager.LoadScene (2); SaveResults} void () {líder tabla de posiciones = gameObject.AddComponent (); leader.writeToXML (); } 12345678910111213voidOnCollisionEnter (Collision otra) {Destruir (other.gameObject); SaveResults (); Destruye (GameObject); SceneManager.LoadScene (2);} voidsaveResults () {líder tabla de posiciones = gameObject.AddComponent (); leader.writeToXML ();}

Escena Transitions

La última parte del código que hay que discutir es la clase de transición de escenas. Esto es relativamente fácil de escribir y utilizar. Llamamos a la clase de manejo de la escena desde el interior de la unidad de motor. A continuación, llamar a la escena que desea cargar, utilizamos la clase Director de escena y llamamos al método Escena de carga.
Debo señalar que esto puede tomar un valor entero o una cadena como parámetro. Me suelen utilizar el método de número entero y hay que asegurarse de que usted vaya a la configuración de construcción y montaje de las escenas de manera apropiada. Si mezcla los valores enteros, las escenas se cargan pero estarán en el orden incorrecto.
utilizando UnityEngine; usando UnityEngine.SceneManagement; SceneController clase pública: MonoBehaviour {public void startGame () {// Nuevo juego SceneManager.LoadScene (1); } Public void tabla de posiciones () {// Juego sobre la tabla de posiciones con SceneManager.LoadScene (2); } Public void EndGame () {// Salir del juego Application.Quit (); }} 1234567891011121314151617181920212223using UnityEngine; usando UnityEngine.SceneManagement; publicclassSceneController: MonoBehaviour {publicvoidStartGame () {// Nueva GameSceneManager.LoadScene (1);} publicvoidLeaderboard () {// Juego sobre la tabla de posiciones con SceneManager.LoadScene (2);} publicvoidEndGame () {// Salir GameApplication.Quit ();}}

Juego Escena de inicio de construcción

Esta escena será la utilización de nuestras casas prefabricadas Jet y el plano, así como otros componentes. Asegúrese de que la escena es una escena 3D y añadir el chorro y el plano de la escena. La posición del chorro debe ser (x = 0, y = 3,7, z = 24,75) y debe ser escalado correctamente sin embargo, en caso de que no lo hizo; Los valores correctos de escalado es (x = 0,3, y = 0,3, z = 0,3). Se puede quitar el guión jugador, cuadro colisionador, y el cuerpo estriado del jet en esta escena si le gustaría.
El plano debe tener los valores de escala establecidos como (x = 100, y = 100, z = 100). La posición del plano debe ser (x = 0, y = -38,23, z = 545,27).
Añadir un objeto de juego vacío y llamarlo controlador. Añadir un lienzo, el panel, y 2 botones para la escena. La tela debe ser el objeto principal primario, el panel debe ser un hijo directo de la tela, y los dos botones son un elemento secundario directo del panel. Nombrar los botones de inicio y salida, respectivamente.
GameStartEndHierarchyPane

Una el script del controlador escena para el objeto controlador de juego que acabamos de crear. A continuación, conecte el objeto del juego a cada secuencia de comandos botón desde dentro del botón en el panel de jerarquías. Asignar o bien iniciar o salir de sus respectivos botones.

GameStartEndButtonInspector

Guardar la escena y el nombre del juego Inicio Final, y hemos completado la escena.

Juego escena una construcción

Añadir un lienzo, el panel, Scroll View, objetos del juego vacío, y 2 botones para la escena. El lienzo es el objeto principal, los 2 botones, objetos del juego vacío y el Panel son objetos secundarios directos a la lona, ​​y el rollo View es un objeto secundario directo al panel.

GameOverSceneLook

Renombrar el objeto del juego vacío para ser controlador como lo hicimos en la última escena. Fije la gestión de escenas y secuencias de comandos Leaderboard a él.

Crear un texto prefabricada y colocarlo en las casas prefabricadas carpeta, vamos a necesitar esto para el siguiente paso.

Vaya a la vista de desplazamiento y el aspecto de un objeto dentro de contenido llamada.
25.08.2016 00_15_11-unidad personal (64 bits) - GameOver.unity - Create_A_Game_Part_3 - PC , Mac y Linux

El siguiente paso es asegurarse de que se añade un grupo de disposición vertical con el objeto de contenido. Esto nos permitirá estructurar el texto que se muestra la forma en que queremos en lugar de la forma en la Unidad exhibiría por defecto. La única cosa que queremos sin control es la fuerza del niño a ampliar la anchura. El resto de las propiedades debe ser como está escrito aquí: Izquierda = 0, derecha = 0, Top = 0, inferior = 0, Espacio = 30, y el niño alineación = centro medio
.

Con el guión de posiciones que adjuntamos, podrá darse cuenta de que requiere dos objetos del juego; Un contenido y texto objeto. El objeto de contenido vamos a utilizar es el objeto de contenido desde dentro de la voluta Vista, y el texto es del objeto de texto que acabamos de crear una casa prefabricada de.

El nuevo juego y Salir Botones de juego debe tener sus respectivos guiones unidos a ellos como lo hicimos en la escena delante de él.

La finalización del juego escena del juego

Añadir un lienzo a la escena y crear un objeto secundario de texto. El lienzo se debe establecer en la cámara espacio en la pantalla al igual que las otras escenas. El texto debe tener la posición de x = 45,13, ​​Y = 27, z = 0, width = 160, y la altura = 30.

Ahora hemos completado la escena del juego.

Como se puede ver, la elaboración de todos los pequeños aspectos para crear un juego es muy sencillo de hacer con Unity3D, la única cosa que no hemos hecho es la música complemento. Por lo tanto, vamos a seguir adelante y hacer que de acuerdo?

clic derecho en el panel de jerarquías, de audio más destacado, a continuación, haga clic en la fuente de audio.

Ahora que tenemos la fuente añadido a la escena de audio, vamos a echar un vistazo a algunas de las propiedades que están disponibles para nosotros de manipular.
AudioSourceInspector

Tenemos la fuente del sonido, opción para especificar el dispositivo de salida,, efectos de derivación de silencio, los efectos de derivación del oyente, zona de derivación de reverberación, juego de despierto, el lazo, la prioridad, el volumen, tono, balance estéreo, mezcla espacial y la mezcla zona de reverberación . Tenemos una caída hacia abajo para la manipulación de sonido 3D que podemos hacer así.

querrá asegurarse de que el juego de Awake y Loop se comprueban. La prioridad se establece en 128, el volumen es 0,4, Pitch es 1, Stereo Pan es 0, Blend espacial es de 0,5, y Reverb Zona de mezcla es 1.

Completado audio Listener

Felicitaciones, usted tiene un juego que tiene la música, la posibilidad de guardar y cargar datos, el carácter controlable, y la detección de colisiones. Espero que hayan disfrutado de esta serie en la construcción de un juego en Unity3D, tengo mucho más para enseñarle en el futuro. Hasta entonces, puede ser el código libre de errores; Jesse cierre de sesión.

Mensajes relacionados

Deja una respuesta

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