En mi anterior tutorial GearVR, hemos aprendido a configurar la Unidad, el SDK de Android, y un teléfono para el desarrollo de engranajes VR. También hemos creado una escena sencilla, con formas básicas y la interacción mirada-Based.

En este tutorial, vamos a utilizar este conocimiento para crear un juego de disparos. Vamos a sustituir las formas básicas con modelos más complejos para un aspecto más realista, y vamos a añadir la interacción basada en haga clic para disparar Simulación. También vamos a llegar más trabajo con la práctica retículas.

Tabla de contenidos

Fuente archivos de código

Puede descargar el proyecto completo aquí. He creado este proyecto en la Unidad 5.6.1.
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

    Creación del proyecto

    Vamos a crear una primera persona, espacio de temática juego de disparos basado en el clásico juego de arcade asteroides. El jugador está flotando casi sin poder hacer nada en una vaina en un cinturón de asteroides, con los asteroides que vienen en ella desde todas las direcciones. Todo lo que puede hacer es apuntar y disparar a los asteroides destruirlos antes de que la golpearon.

    En primer lugar, vamos a crear nuestro proyecto. Abrir la unidad, y seleccionar “Nuevo”. En “Nombre del proyecto”, introduzca un nombre para su juego. Estoy usando el nombre de “cinturón de asteroides”. Asegúrese de que se selecciona 3D, y haga clic en el botón “Crear proyecto”.


    Una vez que el proyecto está abierto, vaya a Archivo-> configuración de generación. Asegúrese de que Android se ha seleccionado como la plataforma de destino. Haga clic en el botón “Configuración del reproductor” para cargar la configuración del jugador en la pestaña inspector. Marque “Realidad virtual compatible”. Si Oculus no aparece como un SDK de realidad virtual, haga clic en el signo “+” y seleccionarlo. Esto le permitirá construir su proyecto de engranaje VR.


    También tendrá que copiar el archivo de firma Oculus en su proyecto, en los Activos de la carpeta / plugins / Android / activos. En la pestaña Project, usted debería ser capaz de seleccionar esta carpeta y ver un archivo oculussig.


    Este archivo oculussig es única para su teléfono. Puede encontrar las instrucciones para crear un nuevo archivo oculussig en este enlace. Usted tendrá que registrarse para obtener una cuenta Oculus.

    Juego Activos

    En el desarrollo del juego, los activos de juego puede hacer referencia a los gráficos, iconos, efectos de sonido y secuencias de comandos. Para hacer nuestro juego de disparos apelando, los principales activos que necesitaremos son modelos para los asteroides que se parezcan más realistas que las formas básicas de Unity. Podemos hacer nuestros propios modelos en programas como Blender y importarlos en la Unidad, o podemos utilizar los activos que ya han sido creados. El Activo de la Unidad tienda, disponible dentro de la Unidad, ofrece dos paquetes de activos gratuitos y de pago que se pueden utilizar en sus propios juegos. Nosotros vamos a usar la libre Asteroides Pack, que incluye un par de diferentes casas prefabricadas de asteroides y un palco que podemos utilizar como fondo.

    En la Unidad, haga clic en la pestaña de Activos tienda. La etiqueta se encuentra junto a la vista del juego. Una vez que el almacén de activos se ha conectado, introduzca “asteroides” en la caja de búsqueda. Desplazamiento hacia abajo hasta encontrar la libre Asteroides paquete y haga clic en él.


    A continuación, haga clic en el botón “Importar” para importar el paquete en su proyecto. Una nueva ventana se abrirá mostrando todos los activos en este paquete. Haga clic en el botón Importar en esta ventana.


    “Los asteroides Pack” aparecerá ahora en la carpeta de activos, visibles en la vista Proyecto. Abrir Asteroides Paquete / Activos / casas prefabricadas. Verá tres casas prefabricadas de asteroides diferentes. Estos son lo que vamos a estar arrastrando a la vista de jerarquía o escena vista para crear asteroides. Cada prefabricada ya está configurado con una secuencia de comandos de rotación, asteroides Paquete / Activos / scripts / RandomRotator.cs, que hace girar el asteroide con una velocidad angular aleatoria.

    Configuración del Prefabs

    Para manejar las colisiones con los asteroides, incluyendo con el retículo, necesitaremos añadir colisionadores.

    Seleccione Activos / Asteroides Paquete / Activos / casas prefabricadas en el panel Proyecto, haga clic en el asteroide y 1 para cargar el prefabricada en el Inspector. Haga clic en “Agregar componente” e introducir y seleccionar “Esfera colisionador.”


    Ahora tenemos que cambiar el tamaño del colisionador. Arrastre el asteroide 1 prefabricada desde la ventana de proyecto a la ventana de la escena para crear temporalmente un asteroide. Haga clic en “Editar Colisionador” en el Inspector. Aparecerá una esfera verde, destacando el colisionador. Mover las categorías en el contorno de la esfera para cambiar el tamaño del colisionador. Si el colisionador es demasiado pequeño, sólo se detectó la retícula cuando se superpone con el centro exacto del asteroide. Que sea demasiado grande, y la retícula será detectado incluso cuando no es realmente en el asteroide. Vamos a cambiar el tamaño del colisionador para abarcar todo el asteroide. En el Inspector, haga clic en el botón Aplicar junto a la palabra “prefabricada” para aplicar estos cambios a la casa prefabricada. Esto significa que la siguiente se crea un asteroide del asteroide 1 prefabricada, que tendrá un colisionador esfera con el tamaño que ha establecido.

    Eliminar el asteroide de la escena. Añadimos sólo para cambiar el tamaño del colisionador. Repetir los pasos anteriores con el asteroide 2 y 3 asteroide casas prefabricadas.

    También vamos a añadir un nuevo guión a las casas prefabricadas. En la ventana de proyecto, seleccione Activos / Scripts. Haga clic derecho y seleccione Create-> C # Script. Nombre sus nuevos AsteroidController.cs script. Por ahora, no añada nada al código fuente todavía. Sólo tiene que añadir AsteroidController.cs como un componente de cada una de las casas prefabricadas de asteroides. También añadir los VRInteractiveItem.cs script a los activos / VRStandardAssets / Scripts. Sin este guión, que no sería capaz de interactuar con los asteroides a través de la retícula, que se tratarán en la próxima sección.


    El retículo

    En VR, que son la cámara, y una retícula, o en forma de cruz de orientación, programas que, precisamente, en el que está buscando. En mi último tutorial, se utilizó la retícula de muestras de realidad virtual, un paquete de activos útiles para aplicaciones de realidad virtual de la tienda de Activos Unidad. Vamos a utilizar los mismos activos en este proyecto, pero organizado un poco mejor, y vamos a armar la cámara a nosotros mismos con los guiones a partir de muestras de realidad virtual en lugar de arrastrar y soltar el prefabricada. Esto nos ayudará a entender lo que está pasando.

    El proyecto se incluye con este tutorial ya contiene todos los archivos necesarios Muestras de realidad virtual en la carpeta Activos / VRStandardAssets. Copia VRStandardAssets directamente en la carpeta de los activos de su propio proyecto.

    Debido a que el jugador es la cámara, crear un objeto de juego vacía en la vista de jerarquía llamada jugador. Nido de la cámara principal bajo el objeto del jugador arrastrándolo al jugador en la ventana de jerarquía.


    Restablecer las posiciones tanto de la cámara del jugador y principal al origen haciendo clic en el icono del engranaje al lado de “Transform” en el panel Inspector y seleccionando “Reset”. Desde la cámara principal se anida bajo jugador, las coordenadas de la cámara principal son en relación con jugador y no al mundo.

    Añadir las siguientes secuencias de comandos a la cámara principal: VREyeRayCaster.cs, VRInput Cs, VRCameraUI.cs y Reticle.cs. Estos scripts son parte de las muestras de VR y se encuentran en Activos / VRStandardAssets / Scripts. añadir también los DragCamera.cs de guión de los Activos / carpeta de scripts.

    Cuando se ejecuta el juego en el modo de reproducción en el editor de Unity, este script te puede mantener pulsado el botón derecho del ratón y arrastre para mover el punto de mira alrededor de la escena. Las pruebas se hace más fácil porque usted ya no tendrá que cargar su juego en un teléfono para mover el punto de mira. Si nos fijamos en el código, verá que la mayor parte del código está encerrado entre “#if UNITY_EDITOR” y #endif”. Esto significa que el código sólo se ejecutará en el Editor de la unidad, no cuando la aplicación se ejecuta en un engranaje real VR.

    Ahora haga clic derecho en la ventana de jerarquía y seleccione UI-> Imagen de crear una nueva imagen. La imagen se anida automáticamente bajo un nuevo objeto Canvas. Arrastre el lienzo en una cámara principal para anidar en los términos de la cámara principal. Cambiar el nombre de la imagen en el retículo y lienzo a lienzo retículo.

    Haga clic en el retículo para cargarlo en el panel Inspector. En la sección Imagen, haga clic en el círculo al lado de “Fuente de la imagen” y seleccione GUIReticle, que es uno de los sprites que venían con muestras de VR. Esta es la imagen que representará a la retícula. Haga clic en el campo de color para elegir un color para la retícula. Haga clic en el círculo al lado de material y seleccione UIShaderMaterial. Este es un shader que venía con muestras de VR y evitará la retícula sea bloqueado por otros objetos.


    cambiar el ancho y la altura de la retícula 1. De lo contrario, la imagen del retículo serán muy grandes.

    Arrastre algunas casas prefabricadas de asteroides en la escena, y presione el botón de reproducción para previsualizar el juego. Si el jugador / la cámara está en el origen, establecer las coordenadas de sus asteroides a entre (-5, 0, 10) y (5, 0, 10) se asegurará de que están a la vista. El círculo rojo es la retícula.


    Campos de tiro y de puntuación

    Cuando la retícula está dirigido a un asteroide y se hace clic en el botón de pantalla táctil, que quiere que el asteroide a desaparecer y una puntuación que se debe actualizar. Vamos a necesitar secuencias de comandos adicionales para lograr esto.

    Para entender lo que vamos a hacer, vamos a echar un vistazo al código de VRInteractiveItem.cs, que hemos añadido a nuestras casas prefabricadas de asteroides. Tenga en cuenta el siguiente código:
    acto público de acción OnClick; // código adicional …. public void Click () {if (OnClick! = null) OnClick (); } 123456789publiceventAction OnClick; // código adicional …. publicvoidClick () {if (OnClick! = Null) OnClick ();}

    Cuando se hace clic en un VRInteractiveItem, Click () método se llama, que llama OnClick () como un método. Vamos a añadir un método para AsteroidController que se suscribe a OnClick (), lo que significa que se llama a este método cada vez que se llama OnClick ().

    Añadir un código código Vamos a AsteroidController.cs para que se vea como esto:
    AsteroidController clase pública: MonoBehaviour {VRInteractiveItem vr; // Inicializar el GameController // y VRInteractiveItem. vacío Awake () {// Cuando se crea este objeto, asigne el VRInteractiveItem // componente para vr. vr = getComponent (); } void OnEnable () {// handleClick () se suscribe a vr.OnClick. vr.OnClick + = handleClick; } Void OnDisable () {// Darse de baja cuando este AsteroidController está desactivado. vr.OnClick – = handleClick; } // reaccionar a un clic mediante la destrucción de este asteroide. handleClick vacío () {Destruir (GameObject); }} 12345678910111213141516171819202122232425publicclassAsteroidController: MonoBehaviour {VRInteractiveItem vr; // // Inicializar el GameController y VRInteractiveItem. voidAwake () {// Cuando se crea este objeto, asigne el VRInteractiveItem // componente de VR. vr = getComponent ();} voidOnEnable () {// handleClick () se suscribe a vr.OnClick.vr.OnClick + = handleClick;} voidOnDisable () {// Darse de baja cuando este AsteroidController es disabled.vr.OnClick- = handleClick;} // reaccionar a un clic mediante la destrucción de este asteroide. voidHandleClick () {Destruir (GameObject);}}

    Cuando se hace clic en un asteroide, handleClick () llama a la función Destruir a destruir el objeto del juego. Cuando se habilita un asteroide, handleClick () está suscrito al evento OnClick del VRInteractiveItem. Cada suscripción debe tener un darse de baja cuando el objeto está desactivada.

    Hasta ahora, nuestro código destruye un asteroide cuando se hace clic (es decir, inyección), pero no llevar la cuenta. Tendremos que añadir un dispositivo de juego que mantiene un registro de estado de todo el juego, como la puntuación, y modificar AsteroidController.cs para llamar al dispositivo de juego cada vez que un asteroide se destruye.

    En la ventana de jerarquía, haga clic derecho y seleccione Crear vacío. Nombre del GameController objeto vacío. En el panel Proyecto, cree un nuevo C # script en el Activo / scripts llamados GameController.cs, y añadir esta secuencia de comandos para el objeto GameController. Sólo por la consistencia, restablecer la posición de GameController al origen. GameController es un objeto vacío con ninguna manifestación física. En el Inspector, etiqueta del objeto como GameController.


    Abrir GameController.cs en MonoDevelop. Crear un miembro de número entero de datos, partitura, que se inicializa a 0. crear un método público denominado UpdateScore que acepta un valor de punto entero como argumento y se incrementa la puntuación por este valor, y una DestroyHazard método que llama. DestroyHazard tendrá más lógica añadió más tarde. Aquí está mi código:
    GameController clase pública: MonoBehaviour {int puntuación = 0; UpdateScore pública vacío (int incrValue = 1) {score + = incrValue; } public void (DestroyHazard puntos int = 1) {UpdateScore (puntos); ShowScore (); } Public void ShowScore () {debug.log (puntuación); } Public int getScore () {score de retorno; }} 1234567891011121314151617181920publicclassGameController: MonoBehaviour {intscore = 0; publicvoidUpdateScore (intincrValue = 1) {score + = incrValue;} publicvoidDestroyHazard (intpoints = 1) {UpdateScore (puntos); ShowScore ();} publicvoidShowScore () {debug.log (puntuación); } publicintGetScore () {returnscore;}}

    ShowScore () registra la puntuación en la consola y el pie de página del editor de Unity. GetScore () permite que otros objetos para acceder a la cuenta.

    Cada instancia de AsteroidController necesitará una referencia a GameController. En AsteroidController.cs, añadir un miembro de datos:
    controlador GameObject;.

    En el método de Awake (), añadir código para asignar el controlador
    // Inicializar el GameController y VRInteractiveItem.void Awake () {vr = getComponent (); // Desde el GameController no es parte de la casa prefabricada de asteroides, // tendremos que encontrar el objeto GameController primero. Tuvimos // marcamos como GameController cuando lo creamos. GameObject controllerObject = GameObject.FindGameObjectWithTag ( «GameController»); si (controllerObject! = null) {// A continuación, obtener el componente de secuencia de comandos GameController. controller = controllerObject.GetComponent (); } Else {debug.log ( «No se pudo obtener el objeto GameController»); } If (controlador == null) {debug.log ( «no pudo conseguir GameController»); 123456789101112131415161718 // Inicializar el GameController y VRInteractiveItem.voidAwake () {vr = getComponent (); // desde la GameController no es parte de la casa prefabricada de asteroides, // que tendrá que encontrar el objeto GameController primero. Habíamos // etiquetados como GameController cuando creamos it.GameObject controllerObject = GameObject.FindGameObjectWithTag ( «GameController»); if (! ControllerObject = null) {// Entonces conseguimos el guión GameController component.controller = controllerObject.GetComponent ();} else {debug.log ( «No se pudo obtener el objeto GameController»);} if (controlador == null) {debug.log ( «No se pudo obtener GameController»);

    estamos utilizando la etiqueta que ponemos en el objeto GameController localizarlo, y nos estamos el componente GameController, que hace referencia a una instancia de la clase definida en GameController.cs.

    Modificar handleClick () para llamar al método GameController.DestroyHazard, lo que incrementará la puntuación.
    void handleClick () {if (controlador = null) {controller.DestroyHazard (pointValue); } Else {debug.log ( «Controller es nulo»); } Destruye (GameObject);} 123456789voidHandleClick () {if {controller.DestroyHazard (pointValue) (controlador = null!);} Else {debug.log ( «Controller es nulo»);} Destruye (GameObject);}

    El desove Asteroides

    Hemos estado arrastrando asteroides manualmente en la escena, pero realmente gustaría que los asteroides para desovar de forma automática y se mueven por su cuenta.

    En GameController.cs, añadir dos nuevos miembros de datos pública: un array de GameObjects que contendrá las casas prefabricadas que pueden generar, y el número de objetos que queremos para desovar. Seremos capaces de establecer estos valores en el panel Inspector.
    // Los peligros que pueden ser spawned.public [] peligros GameObject; // El número de peligros a spawn.public numHazards int = 5; 12345 // Los peligros que pueden ser spawned.publicGameObject [] peligros; // El número de peligros para la spawn.publicintnumHazards = 5;.

    En el panel, arrastre el prefabricadas de asteroides a los campos de peligros, y establecer el tamaño de la matriz peligros a 3. numHazards según lo que usted quiere

    Configuración de los peligros en el inspector

    Crear un SpawnHazards () que se llama en el método Start ():
    void start () {SpawnHazards ();} SpawnHazards public void () {for (int i = 0; i SpawnHazards () se ejecuta un bucle numHazards veces a los peligros de la freza (asteroides en nuestro caso). A prefabricada azar se elige del array peligros. Instantiate método de la unidad se llama a clonar el objeto prefabricada en una muestra aleatoria de coordenadas. He fijado el rango de valores x e y para ser entre -10 y 10, y el rango de z a ser de 0 a 50. El jugador se encuentra en un valor z de 0.

    Ahora, vamos a hacer el movimiento asteroides. En AsteroidController.cs, añadir los siguientes miembros y métodos de datos:
    la velocidad de flotación = 0.25f pública; flotación pública maximumDistanceToPlayer = 50; // Actualización de cada frame.// Mover el asteroide. Si un asteroide se mueve fuera de rango, destruyen actualización it.void () {MoveAsteroid (); CheckRange ();} // Comprobar si el asteroide está más allá de una cierta distancia de la player.// Si es así, destruirla para evitar que el palo de asteroides around.void CheckRange () {if (GetDistanceToPlayer ()> maximumDistanceToPlayer) { debug.log ( «Out-of-cubre la autodestrucción de asteroides.»); // indicarle al controlador para destruir el peligro, pero no // aumentar la puntuación. controller.DestroyHazard (0); Destruye (GameObject); }} // Calcular la distancia entre este asteroide y el jugador. flotar GetDistanceToPlayer () {GameObject playerObject = GameObject.FindGameObjectWithTag ( «Jugador»); si (playerObject! = null) {return Vector3.Distance (playerObject.transform.position, transform.position); } Else {debug.log ( «No se pudo encontrar el objeto del jugador.»); volver -1; }} // Mueva el asteroide lo largo de la z-axis.void MoveAsteroid () {transform.Translate (-1 * Vector3.forward * velocidad * Time.deltaTime, Space.World);} 1234567891011121314151617181920212223242526272829303132333435363738publicfloatspeed = 0.25f; publicfloatmaximumDistanceToPlayer = 50; // actualizar cada frame.// Mover el asteroide. Si un asteroide se mueve fuera de rango, destruyen it.voidUpdate () {MoveAsteroid (); CheckRange ();} // Comprobar si el asteroide está más allá de una cierta distancia de la player.// Si es así, destruirla para evitar tener el palo de asteroides around.voidCheckRange () {if (GetDistanceToPlayer ()> maximumDistanceToPlayer) {debug.log ( «fuera de la gama de asteroides autodestrucción.»); // Envía el controlador para destruir el peligro, pero no lo hacen / / aumentar la score.controller.DestroyHazard (0); Destruye (GameObject);}} // Calcular la distancia entre este asteroide y la player.floatGetDistanceToPlayer () {GameObject playerObject = GameObject.FindGameObjectWithTag ( «Player»), si (playerObject ! = null) {returnVector3.Distance (playerObject.transform.position, transform.position);} else {debug.log ( «no se pudo encontrar el objeto del jugador.»); return-1;}} // Mover el asteroide a lo largo del z-axis.voidMoveAsteroid () {transform.Translate (-1 * Vector3.forward * velocidad * Time.deltaTime, Space.World);}

    Cada cuadro, que mover el asteroide a lo largo del eje z con una velocidad. También estamos comprobando hasta qué punto el asteroide es del jugador. Si la distancia es superior a maximumDistanceToPlayer, el asteroide se destruye automáticamente sin incrementar la puntuación. Esto evita que los asteroides desde existiendo por siempre ya que la deriva en el espacio.

    asteroides aleatoriamente generados

    Adición de un Skybox

    En este momento, nuestro juego se ve poco realista con los asteroides volando de un sólido azulado fondos agregaciones de sky.Let que hacen que nuestra mirada juego como estamos en el espacio.

    Juegos lograr el efecto de entornos 3D mediante el uso de un palco, un cubo que encierra la cámara. Cada una de las seis caras del cubo tiene una textura en él. En conjunto, las texturas nos hacen sentir que estamos en una escena real, si se trata de una playa, una selva, o en el espacio profundo.

    El paquete incluye un palco Asteroides temática espacial. En la ventana de proyecto, seleccione Paquete de asteroides / Activos / materiales / palco. En la ventana de inspección, verá seis texturas, una por cada cara. Si hace clic en una textura, la ventana de proyecto y cambiará a resaltar el archivo de textura.

    material de Skybox cargado en la Inspector
    archivos de textura en el panel Proyecto

    Para añadir un palco a la escena, Ventanilla abierta> Iluminacion-> Configuración haciendo clic en el menú de la ventana en la parte superior de su screen.Make de que la lengüeta de escena está resaltado. En Entorno, haga clic en el círculo al lado de Skybox material y seleccione palco.

    Configuración skybox

    Trate de jugar el juego. Ahora se ve un fondo del cielo oscuro con estrellas en lugar de la tierra y el cielo Unidad por defecto.


    Si giro de 180 grados con el auricular, verá un sol brillante.


    Para hacer que la iluminación más realista, cambiar las coordenadas de luz direccional a un valor z positiva para que la luz viene de la dirección general del sol.

    Finalización del juego

    Cuando todos los asteroides han sido destruidos, o los asteroides restantes han viajado fuera de rango, tenemos que dejar que el jugador sabe que el juego ha terminado. Lo haremos mediante la visualización de las palabras “Game over” y la puntuación.

    En el panel Jerarquía, haga clic derecho y crear un lienzo. Cambiar el nombre a la interfaz de usuario de la lona. Haga clic en el botón “Agregar componente” y seleccione “Grupo de mano”. Establecer modo Render a “espacio de pantalla – mundo”. Esto asignará el lienzo a un plano fijo en el espacio, en lugar de conectarlo a la cámara. He encontrado que el otro render modos no funcionan en la realidad virtual. Asimismo, establecer las coordenadas de la tela a (0, -10, 200). Esta ubicación es de aproximadamente centrada sobre la posición de partida de la retícula.


    Ahora, haga clic derecho en la interfaz de usuario de la lona en el panel Jerarquía y elija UI-> Texto. Nombre de este objeto Juego encima del texto. En el panel Inspector, establecer el texto a “GAME OVER”, y establecer el color del blanco. Un color más oscuro no será visible en nuestro espacio de fondo. Ajuste el tamaño de la fuente a 14, y el conjunto de alineación a centrada haciendo clic en el botón central por la palabra “alineación”.


    En GameController.cs, añadir miembros de datos adicionales para la lona de la interfaz de usuario, el campo de texto, y el grupo de la lona:
    pública uiCanvas lienzo; Texto pública gameOverText; CanvasGroup canvasGroup; 123publicCanvas uiCanvas; publicText gameOverText; CanvasGroup canvasGroup;

    uiCanvas y gameOverText se asignan en el Inspector, ya que son públicos. Crear una Awake () que asigna canvasGroup y establece su transparencia a 0 hacer todos los elementos en el grupo de lona invisibles:
    void Awake () {canvasGroup = uiCanvas.GetComponent (); canvasGroup.alpha = 0;} 1234voidAwake () {canvasGroup = uiCanvas.GetComponent (); canvasGroup.alpha = 0;}

    No queremos que el texto sea visible hasta el final del juego

    Crear un método adicional que se llamará cuando el juego termina:
    pública EndGame void () {gameOverText.text + = » n» + System.String.Format ( «Puntuación: {0}», puntuación); canvasGroup.alpha = 1;} 1234publicvoidEndGame () {gameOverText.text + = » n» + System.String.Format ( «Puntuación: {0}», puntuación); canvasGroup.alpha = 1;}

    La puntuación es añadido a gameOverText en una nueva línea. System.String.Format le permite insertar números y dar formato a una cadena. El operador “+” concatena cadenas. canvasGroup.alpha está listo para hacer el texto visible.


    En DestroyHazard (), añadir lógica adicional para disminuir el número de peligros cada vez que se llama. Si el número de peligros disminuye a 0, llamada EndGame ().
    public void (DestroyHazard puntos int) {UpdateScore (puntos); ShowScore (); if (numHazards> 0) {numHazards–; } If (numHazards == 0) {Final de partida (); }} 1234567891011publicvoidDestroyHazard (intpoints) {UpdateScore (puntos); ShowScore (); si (numHazards> 0) {numHazards -;} Si (numHazards == 0) {Final de partida ();}}

    Finalmente, GameController carga en el inspector, y arrastrar la interfaz de usuario de la lona al campo “Ui lienzo” y GameOverText al campo “Juego en el texto”.


    Ahora que tiene una manera de terminar el juego, que haya completado un juego de disparos en el espacio VR reproducible.

    Mensajes relacionados
    > <img src =

Deja una respuesta

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