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

En el último tutorial que creó un mundo enorme con la función L3DT e importado en la Unidad. También tenemos dividir el mundo en baldosas, de modo que podamos desactivar dinámicamente los azulejos distantes de acuerdo con la posición del jugador.

Ahora, vamos a añadir las siguientes cosas en nuestro juego:


  • Adición de árboles en el mundo, con múltiples niveles de detalles.
  • Desactivación de otros objetos que están dentro de la baldosa cuando la propia baldosa se desactiva.
  • Adición de una niebla para ocultar las fichas desactivadas.

    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, abra el proyecto de la Unidad del tutorial anterior.

      Tabla de contenidos

      Activos de derechos de autor

      Los activos utilizados en este tutorial fueron creados por djonvincent y puesto a disposición a través de la licencia de A0, cosa que permite un uso comercial. Puede descargarlos en https://opengameart.org/content/mage-tower o descargando el código fuente.

      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

        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í.

        Niveles múltiples de datos

        En el desarrollo del juego, hay un concepto llamado nivel de detalle (LOD o, para abreviar). Esta es una técnica de optimización que consiste en reducir el número de triángulos en una malla de objeto si el objeto está muy lejos de la cámara. Esto se puede hacer porque si el objeto está muy lejos de la cámara, el jugador probablemente no puede ver todos sus detalles, por lo que la reducción del nivel de malla de datos no afectará a la experiencia del jugador.

        Por suerte para nosotros, la unidad proporciona una característica integrada de LOD, que vamos a usar, mientras que la adición de árboles en el mundo del juego.

        En primer lugar, vamos a importar otro paquete de la unidad con los modelos de árboles. Así, en el menú seleccione la unidad Activos -> Importar paquete -> Medio Ambiente. A continuación, vamos a importar todos los activos del paquete.


        Esto creará una carpeta llamada Medio Ambiente dentro de la carpeta Standard Los activos. Dentro de esta carpeta hay otra que se llama SpeedTree, donde se pueden encontrar las casas prefabricadas de árboles.

        La forma en que se puede utilizar en la Unidad de LOD es realmente simple, y se puede ver mirando en cualquiera de las casas prefabricadas de árboles. Por ejemplo, si selecciona la Broadleaf_Desktop prefabricada, y lo abre, para que pueda ver todos sus hijos, se verá que hay tres niños llamados Broadleaf_Desktop_LOD0, Broadleaf_Desktop_LOD1 y Broadleaf_Desktop_LOD2. Esos son los modelos de árboles con diferentes niveles de detalle. Por lo tanto, con el fin de utilizar la función de límite de detección de la unidad, es necesario crear diferentes modelos de su objeto, una para cada nivel de detalle, y nombrarlos añadiendo LODX al nombre del modelo, donde X reprsents el grupo LOD.



        Además de crear los múltiples modelos, también tenemos que decirle a la unidad de la que las distancias que debe cambiar el grupo de LOD y reducir la calidad de imagen. Esto se puede hacer mediante el componente del grupo del límite de detección. Por ejemplo, si se abre la Broadleaf_Destkop prefabricadas verá un control deslizante con los grupos LOD. Si mueve este control, puede cambiar los puntos en los que la unidad se cambiará entre grupos LOD.


        Por último, vamos a añadir algunos árboles a nuestro juego, para ver este trabajo cosas. El terreno Componet nos permite añadir fácilmente los árboles en nuestro juego. Esto se puede hacer mediante la selección de la herramienta Coloque los árboles en el componente de terreno.

        En primer lugar, tenemos que añadir las casas prefabricadas de árboles, árboles seleccionando Editar -> Añadir árbol y luego seleccionando una de las casas prefabricadas de árboles. Voy a utilizar el prefabricada Broadlef_Destkop. Una vez que se haya agregado, aparecerá en la herramienta Coloque los árboles.


        Ahora, basta con seleccionar el árbol prefabricada y pintarlo con el terreno. Si cambia el zoom de la cámara, se notó que el nivel de detalle de los árboles se reduce automáticamente.


        También se dará cuenta de que los árboles están desactivando automáticamente cuando se desactiva el objeto de baldosas (por ser distante para el jugador). Eso es porque hemos añadido los árboles utilizando el componente de terreno. Ahora, vamos a añadir otros objetos y asegúrese de que también se desactivan con el azulejo.

        Adición de otros objetos para la azulejos

        En primer lugar, hay dos tipos de objetos que podemos añadir a nuestro juego:


          objetos

        1. estática: esos son los más fáciles, ya que son básicamente como los árboles. Se crean dentro de un azulejo y no lo dejan.
        2. Objetos dinámicos:. Esos son objetos que se pueden mover en todo el mundo, por lo que no pertenecen a una sola teja

          Empecemos añadiendo un objeto estático. Si ha descargado el código fuente, se encuentra un modelo de torre en el Activo / carpeta Modelos (el modelo original se puede encontrar aquí). Ahora vamos a añadir una torre para nuestro juego. Dado que los objetos estáticos no se mueven, podemos simplemente añadirlo como un hijo de uno de los azulejos mundo. De esta manera, cuando se desactiva el azulejo se desactivará automáticamente sus hijos también. Por ejemplo, aquí estoy añadiendo la torre como un niño de 1 Terreno 1.


          Eso es todo por objetos estáticos, pero las cosas son un poco más complicado con objetos dinámicos, que pueden moverse entre las baldosas. Para esos objetos, es necesario hacer un seguimiento de la Baldosa el objeto es actualmente. Entonces, si se activa esta baldosa / desactivado, tenemos que hacer lo mismo para el objeto.

          Lo que vamos a necesitar es una secuencia de comandos para administrar los objetos que están dentro de una baldosa dado. Vamos a empezar por la creación de un nuevo script llamado HideObjectsInTile, que mantendrá un registro de los objetos dentro de cada baldosa para desactivarlos.

          Este script necesitará los siguientes atributos:


          • objectsTag:. La etiqueta de los objetos que necesitamos para realizar un seguimiento
          • objectsToCheck:. La matriz de objetos con la etiqueta dada
          • tileBounds: los límites de la baldosa. Esto será necesario para comprobar si un objeto dado está dentro de la baldosa.
          • currentActivation:. Una variable booleana que define si la ficha se activa o desactiva la actualidad

            En el método de inicio que guardar los objetos con una determinada etiqueta y guardarlos en la matriz de objectsToCheck. Esos son los objetos que vamos a comprobar si se encuentran dentro de los azulejos más tarde. También ahorramos los tileBounds, en base a la posición de azulejos y dimensiones. Tenga en cuenta que la tilePosition es la posición del centro de la baldosa,
            y por las dimensiones de las baldosas estamos estableciendo una dimensión máxima Y (1000), eso es porque queremos que todo en el aire para estar dentro de la baldosa.

            A continuación, añadimos un método llamado ActivateTile, que recibirá parámetro booleano. Además de activar / desactivar la propia baldosa basan en este parámetro,
            este método iterar a través de cada objeto de la matriz objectsToCheck y activación / desactivación de los que están dentro de la baldosa. Por último, el aviso de que este se llamará sólo el parámetro de activación es diferente del atributo currentActivation. De esta manera podemos evitar llamar a este método varias veces sin cambiar nada.
            utilizando System.Collections; usando System.Collections.Generic; usando UnityEngine; HideObjectsInTile clase pública: MonoBehaviour {[SerializeField] cadena privada objectsTag = «TileObject»; privada GameObject [] objectsToCheck; tileBounds Bounds privadas; currentActivation private bool = true; void Awake () {objectsToCheck = GameObject.FindGameObjectsWithTag (objectsTag); Terreno tileTerrain = getComponent (); Vector3 tileDimensions = nuevo Vector3 (tileTerrain.terrainData.heightmapWidth, 1000, tileTerrain.terrainData.heightmapHeight); Vector3 tilePosition = nuevo Vector3 (this.gameObject.transform.position.x + tileDimensions.x / 2f, 0, this.gameObject.transform.position.z + tileDimensions.z / 2f); this.tileBounds = nuevos límites (tilePosition, tileDimensions); ActivateTile} public void (bool activar) {if (Activar = currentActivation!) {This.gameObject.SetActive (activar); foreach (GameObject objectInGame en objectsToCheck) {Vector3 objectPosition = objectInGame.transform.position; si (tileBounds.Contains (objectPosition)) {objectInGame.SetActive (Activar); }} CurrentActivation = activate; }}} 12345678910111213141516171819202122232425262728293031323334353637usingSystem.Collections; usingSystem.Collections.Generic; usingUnityEngine; publicclassHideObjectsInTile: MonoBehaviour {[SerializeField] privatestringobjectsTag = «TileObject»; privateGameObject [] objectsToCheck; privateBounds tileBounds; privateboolcurrentActivation = true; voidAwake () {objectsToCheck = GameObject.FindGameObjectsWithTag ( objectsTag); Terrain tileTerrain = getComponent (); Vector3 tileDimensions = newVector3 (tileTerrain.terrainData.heightmapWidth, 1000, tileTerrain.terrainData.heightmapHeight); Vector3 tilePosition = newVector3 (this.gameObject.transform.position.x + tileDimensions. x / 2f, 0, this.gameObject.transform.position.z + tileDimensions.z / 2f); this.tileBounds = newBounds (tilePosition, tileDimensions);} publicvoidActivateTile (boolactivate) {if (Activar = currentActivation) {esto!. gameObject.SetActive (Activar); foreach (GameObject objectInGame inobjectsToCheck) {Vector3 objectPosition = objectInGame.transform.position; si (tileBounds.Cont AINS (objectPosition)) {objectInGame.SetActive (activar);}} = Activar currentActivation;}}}

            Ahora tenemos que añadir este script para todas las fichas. Voy a establecer el atributo ObjectsTag ser “TileObject”.


            Así que, antes de la prueba que necesitamos para crear esta etiqueta TileObject y añadir un objeto con esta etiqueta. El modelo que voy a utilizar aquí será importado de otro paquete Unidad. Esta vez vamos a importar el paquete de Vehículos (Activos -> Importar paquete -> Vehículos). Una vez más, vamos a importar todos los activos.


            Ahora, vamos a añadir un objeto de coches para nuestro juego (de Standard Los activos -> Vehículos -> Coches -> Prefabs). Este objeto tiene algunas secuencias de comandos que no se va a utilizar, así que vamos a eliminar todos ellos, dejando sólo la transformación y los componentes de cuerpo rígido. Además, la etiqueta de este objeto coche debe ser TileObject.


            Ahora, podemos probar nuestro juego y comprobar si el coche está siendo desactivado una vez que su mosaico se desactiva también.


            Hay todavía un problema con nuestro mundo. Cuando se activan los nuevos azulejos, el jugador puede ver realmente los azulejos que se muestran, que no debería suceder. Podríamos resolver esto aumentando la distancia de las baldosas se activa / desactiva. Sin embargo, esto aumentaría el número de baldosas que se queden durante el juego. Otra solución (y la que vamos a usar) es añadir una niebla en nuestro juego, que ocultaría regiones distantes y, en consecuencia, se esconden las nuevas baldosas.

            Para ello, seleccione la pestaña de la ventana del Editor de la Unidad. A continuación, seleccione Lighthing -> Configuración. En el panel Otros ajustes, puede activar la configuración de niebla.
            A continuación, sólo tiene que seleccionar un color para la niebla, como a continuación.


            Todavía tenemos que cambiar el fondo de la cámara que ser del mismo color que la niebla.
            El personaje en primera persona hemos añadido en nuestro juego tiene su propia cámara, por lo que primero retire la cámara principal de su proyecto, a continuación, seleccione el objeto FirstPersonCharacter, que tiene una cámara de componentes (que es un hijo del jugador). En este componente de la cámara, cambiar los avisos se borran atribuyen a ser color sólido, y el fondo sean del mismo color que la niebla.


            Por último, se puede jugar el juego de nuevo y la niebla debe ocultar los azulejos distantes.


            Y con esto concluye esta serie de tutoriales. Dime en secciones comments sus opiniones y sugerencias!

            Mensajes relacionados

Deja una respuesta

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