Una guía para la manipulación de enormes mundos de la Unidad – Parte 1 – GameDev Academia

En esta serie de tutoriales que vamos a aprender cómo manejar enormes mundos de la Unidad. Cuando usted tiene un juego con un mundo enorme (potencialmente infinito), que se puede enfrentar algunos problemas debido a los limitados recursos de los ordenadores. Por ejemplo, no es posible mantener la prestación de todo el mundo cada vez, ya que para ello se utiliza una gran cantidad de potencia de procesamiento y memoria. La idea de esta serie de tutoriales es mostrar cómo gestionar un mundo tan enorme, activando y desactivando las áreas del mundo según la proximidad del jugador.

En este primer tutorial vamos a construir un mundo enorme, importarlos en Unity y ejecutar la secuencia de comandos de desactivación de regiones que son distantes desde el reproductor. En el segundo tutorial vamos a añadir más cosas para el mundo, tales como árboles. También vamos a añadir una niebla para ocultar regiones distantes para que el jugador no puede ver que están desactivados.

Con el fin de seguir este tutorial, que se espera que esté familiarizado con los siguientes conceptos:


  • programación C #
  • conceptos unidad básica, como la importación de bienes, la creación de casas prefabricadas y la adición de componentes

    Antes de comenzar a leer el tutorial, crear un nuevo proyecto de la Unidad.

    Tabla de contenidos

    archivos de código fuente

    Puede descargar los archivos de código fuente (tutorial de los Activos estándar carpeta no se incluyó para reducir el tamaño del archivo) aquí.

    No se pierda! extremos 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 mundo

      Hay diferentes maneras de crear el mapa mundial de su juego. Dado que el objetivo de este tutorial es sobre cómo manejar tales mapa del mundo, y no en la forma de crearlo, vamos a utilizar una herramienta automatizada para crear el mapa.

      La herramienta que se va a utilizar se llama L3DT. Esta herramienta le permite generar enormes mapas del mundo, que se pueden importar en la unidad posterior. Comenzar por descargar e instalar el programa. A continuación, ábralo y seleccione Archivo -.> Nuevo proyecto


      Vamos a crear un mapa diseñables. Seleccione el tamaño del mapa lo prefiere.
      En este tutorial, voy a generar un mapa con tamaño de 512 × 512. Puede dejar los otros parámetros en sus valores por defecto.


      En la ventana de cola de cálculo, seleccione todos los mapas que se creen. Al final, sólo vamos a utilizar el mapa de altura y el mapa de textura, pero la generación de los otros mapas agregará información al mapa de textura en el final. Para cada mapa, puede dejar los parámetros por defecto.


      Al final, L3DT generará un mapa como éste.


      Lo que tenemos que hacer ahora es exportar el mapa de altura y el mapa de textura, de manera que podamos importarlos posteriormente en la Unidad. Con el fin de exportar el mapa de altura, seleccione la pestaña de alturas, a continuación, haga clic en el mapa y seleccione Exportar. La unidad sólo importa RAW, por lo que necesitamos para exportarlo en este formato. Voy a crear una carpeta llamada L3DT en los Activos carpeta de mi proyecto Unidad, de modo que pueda exportar los archivos de la L3DT allí.


      El mapa de textura se puede exportar de manera similar. Seleccione la pestaña de mapa de textura, haga clic en el mapa y seleccione Exportar. Vamos a exportar en el formato PNG.


      Importación de la correlación en la Unidad

      Ahora, vamos a importar este mapa en la Unidad. En primer lugar, abra el proyecto de la Unidad que ha creado. En este proyecto añadir un nuevo objeto Terreno (haga clic derecho en la jerarquía y seleccionar objetos 3D -> Terreno). Esto creará un nuevo objeto con el componente de terreno.


      Ahora, vamos a importar el mapa de altura y el mapa de textura en este terreno. Con el fin de importar el mapa de altura, seleccione la configuración del terreno, vaya a la sección alto del mapa y haga clic en Importar Raw. A continuación, seleccione el mapa de altura que tiene la exportación de L3DT. Es importante ajustar el tamaño del terreno a ser el mismo que el tamaño del mapa L3DT (512 × 512). El tamaño en el eje y define la altura de las montañas, por lo que puede probar diferentes valores hasta que encuentre el que se ve mejor en su juego. Voy a utilizar un tamaño de Y de 100.


      Con el fin de importar el mapa de textura, es necesario seleccionar la opción de pintura de textura en el componente de terreno. A continuación, haga clic en Editar texturas para añadir una nueva textura.
      Seleccione la textura L3DT exportado y ajustar su tamaño para ser el tamaño del mapa L3DT (512 × 512). Sin embargo, el aviso de que, debido a los diferentes sistemas entre L3DT y Unidad de coordenadas, el tamaño Y debe ser negativo (-512).


      Después de hacerlo, usted debe tener su mapa importado en la Unidad. Ahora, nuestro siguiente paso será cortar este mapa en baldosas.


      rebanar el mapa en baldosas

      Como ya he mencionado, vamos a activar las regiones de mapa que se acercan del jugador, mientras que la desactivación de los que están lejos de él. Con el fin de hacerlo, tenemos que cortar nuestro mapa del mundo en baldosas. En lugar de escribir nuestro propio código para cortar el mapa, vamos a utilizar una solución disponible en línea.

      Aquí puede descargar un paquete Unidad de terrenos divididos. Después de la descarga, simplemente abrirlo para que se importe en sí en su proyecto. Esto añadirá una pestaña llamada Dvornik en su proyecto Unity. Seleccionándolo puede dividir el terreno crean en cuatro azulejos.

      Sin embargo, una vez que se hace esto, se verá que la textura del terreno se repite para cada baldosa.


      Se puede arreglar eso haciendo clic en corrige la textura y la adición de las siguientes compensaciones para los azulejos:


      • Terrain 0: desplazamiento x = 0, offset y = 0
      • Terrain 1: desplazamiento x = 0, offset y = 256
      • Terrain 2: desplazamiento x = 256, offset y = 0
      • Terrain 3: desplazamiento x = 256, y = desplazamiento 256

        Podemos repetir el proceso para cada mosaico creado, dividiendo aún más el terreno en dieciséis azulejos. Una vez más, después de dividir cada baldosa, tenemos que ajustar las compensaciones en consecuencia. Sin embargo, en lugar de sumar un desfase de 256, ahora tenemos que añadir un desplazamiento de 128. Por ejemplo, el desplazamiento de los azulejos nuevos creados a partir de Terreno 1 son:


        • Terrain 1 0: desplazamiento x = 0, offset y = 256
        • Terrain 1 1: desplazamiento x = 0, offset y = 384
        • Terrain 1 2: desplazamiento x = 128, y = desplazamiento 256
        • Terrain 1 3: desplazamiento x = 128, y = desplazamiento 384

          Al final, usted debe tener un mapa con 16 fichas. Ahora que tenemos nuestras baldosas mundo, vamos a empezar a programar la secuencia de comandos, que se activan y desactivan terreno baldosas de acuerdo con el jugador de proximidad.

          Desactivación distante azulejos

          Queremos que nuestro juego para realizar un seguimiento de la posición del jugador y, cuando el jugador está muy lejos de una baldosa dado, para desactivar esta baldosa del juego con el fin de mejorar el rendimiento. De esta manera, no se brindará esta baldosa, y nuestro juego no estará malgastando la CPU y la memoria en este tipo de azulejos distantes.

          La primera cosa que necesitamos es crear un HideTilesScript. Este script se añadirá al objeto jugador, y se hará un seguimiento de los terrenos distantes con el fin de ocultarlos. Con el fin de hacerlo, necesitamos los siguientes atributos en este script:


          • tileTag:. La etiqueta de los objetos de cerámica, de modo que podamos identificarlos
          • tileSize:. El tamaño de cada baldosa (128 × 128 en nuestro caso)
          • maxDistance:. La distancia máxima que el jugador puede ser de la baldosa antes de que se desactiva
          • azulejos:. El conjunto de baldosas en el juego

            utilizando System.Collections; usando System.Collections.Generic; usando UnityEngine; HideTiles clase pública: MonoBehaviour {[SerializeField] cadena privada tileTag; [SerializeField] privada Vector3 tileSize; [SerializeField] int maxDistance privado; GameObject privada [] azulejos; // Usar esto para la inicialización de inicio void () {this.tiles = GameObject.FindGameObjectsWithTag (tileTag); DeactivateDistantTiles (); } DeactivateDistantTiles void () {Vector3 playerPosition = this.gameObject.transform.position; foreach (GameObject azulejo en azulejos) {Vector3 tilePosition = tile.gameObject.transform.position + (tileSize / 2f); flotar xDISTANCIA = Mathf.Abs (tilePosition.x – playerPosition.x); flotar zDistance = Mathf.Abs (tilePosition.z – playerPosition.z); Si (+ xDISTANCIA zDistance> maxDistance) {tile.SetActive (false); } Else {tile.SetActive (true); }}} void Update () {DeactivateDistantTiles (); }} 123456789101112131415161718192021222324252627282930313233343536373839404142434445usingSystem.Collections; usingSystem.Collections.Generic; usingUnityEngine; publicclassHideTiles: MonoBehaviour {[SerializeField] privatestringtileTag; [SerializeField] privateVector3 tileSize; [SerializeField] privateintmaxDistance; privateGameObject [] losetas; // utilizar esto para initializationvoidStart () {este. azulejos = GameObject.FindGameObjectsWithTag (tileTag); DeactivateDistantTiles ();} voidDeactivateDistantTiles () {Vector3 playerPosition = this.gameObject.transform.position; foreach (intiles baldosas GameObject) {Vector3 tilePosition = tile.gameObject.transform.position + (tileSize / 2f ); floatxDistance = Mathf.Abs (tilePosition.x-playerPosition.x); floatzDistance = Mathf.Abs (tilePosition.z-playerPosition.z), si (xDISTANCIA + zDistance> maxDistance) {tile.SetActive (false);} else {tile.SetActive (true);}}} voidUpdate () {DeactivateDistantTiles ();}}

            a continuación, en el método de inicio utilizamos el método FindGameObjectsWithTag para recuperar los azulejos en nuestro juego utilizando el tileTag. Esos azulejos se guardan en la matriz de azulejos, por lo que podemos llamar al método DeactivateDistantTiles.

            El método DeactivateDistantTiles, por su parte, se compruebe la distancia del jugador para cada baldosa en el juego. Tenga en cuenta que la posición del azulejo se añade con la mitad del tamaño de la baldosa. Esto se debe a que se quiere medir la distancia desde el reproductor al centro de la baldosa, y no su esquina inferior izquierda. Si la suma de las distancias en las direcciones X y Z índices es mayor que la distancia máxima, desactivamos la baldosa. De lo contrario, lo activamos. Por último, este método también se debe llamar al método Update, por lo que mantenemos la actualización del estado de las baldosas.

            Ahora, con el fin de poner a prueba nuestra escritura tenemos que añadir una etiqueta de azulejo y una objeto Player. Con el fin de agregar la etiqueta del azulejo, seleccionar un objeto, haga clic en el menú de etiquetas y seleccione Agregar comando. A continuación, cree una nueva etiqueta llamada del azulejo. Por último, se puede asignar esta etiqueta para todos los objetos de cerámica.


            Con el fin de crear el objeto del jugador, vamos a importar un paquete Unidad. Así, en el menú de Activos seleccione “Importar paquete -> Caracteres”. Puede importar todos los activos del paquete.


            Esto creará una carpeta Standard Los activos dentro de los Activos carpeta de su proyecto. Arrastre y suelte el FPSController (Standard Los activos / Personaje / Prefabs / FPSController) prefabricada en su juego. Este será el jugador en nuestro juego, así que vamos a cambiar el nombre a un reproductor y añadir la secuencia de comandos HideTiles a ella. Recuerde que debe configurar correctamente los atributos de escritura. En este tutorial voy a conjunto 256 como el atributo maxDistance.


            Ahora, puede intentar jugar el juego para ver si los azulejos distantes están siendo desactivadas correctamente. Usted puede poner la vista de escena en el lado izquierdo del editor de Unity (junto a la jerarquía de objetos) para que pueda ver su contenido mientras se mueve el jugador en el juego.


            Y con esto concluye este tutorial. En la siguiente, vamos a añadir más cosas a nuestro mundo, así como la adición de una niebla para ocultar los azulejos distantes que se están desactivados.

            Mensajes relacionados

Deja una respuesta

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