Implemente la detección de visitas con mapas de teselas

Actualización de la página :
Fecha de creación de la página :

Entorno de verificación

Windows
  • Ventanas 11
Unity Editor
  • 2021.3.3F1
Paquete del sistema de entrada
  • 1.3.0

Requisitos previos para esta sugerencia

Los siguientes ajustes se han realizado de antemano como premisa para la descripción de este consejo.

¿Cuáles son los requisitos previos para este consejo?

Acerca del préstamo de materiales de mapas

Procesamos préstamos de los siguientes sitios.

Implementación de personajes andantes

Primero, implemente un mapa y un personaje que realice la detección de golpes. Este carácter se puede mover con las teclas del cursor en el teclado. Sin embargo, si implementas una caminata adecuada, será larga y lejos de la esencia de los consejos del libro, por lo que esta vez solo moveré una sola imagen.

Si desea implementar animaciones para caminar, consulte los siguientes consejos:

Después de crear el proyecto, agregue una imagen de sprite del objeto que desea mover al proyecto.

Seleccione la imagen y establezca los píxeles por unidad en 32 en el inspector. Esto se debe a que el tamaño de un cuadrado del mapchip es de 32 píxeles, por lo que se ajusta a eso. Una vez configurado, haga clic en el botón "Aplicar" a continuación.

Coloca el sprite en la vista.

Cree un script para mover el sprite. Esto es similar a los siguientes consejos:

Deje el nombre Player del script como .

Codifique de la siguiente manera:

using UnityEngine;
using UnityEngine.InputSystem;

public class Player : MonoBehaviour
{
  // 一定時間ごとに呼ばれます
  void FixedUpdate()
  {
    // キーボードの情報を取得
    var keyboard = Keyboard.current;

    // スプライトの移動処理
    if (keyboard.leftArrowKey.isPressed)
    {
      transform.Translate(-0.1f, 0, 0, Space.World);
    }
    if (keyboard.rightArrowKey.isPressed)
    {
      transform.Translate(0.1f, 0, 0, Space.World);
    }
    if (keyboard.upArrowKey.isPressed)
    {
      transform.Translate(0, 0.1f, 0, Space.World);
    }
    if (keyboard.downArrowKey.isPressed)
    {
      transform.Translate(0, -0.1f, 0, Space.World);
    }
  }
}

Conéctalo al sprite que quieres mover.

Ejecuta el juego y comprueba si quieres moverlo con el teclado.

Preparación de MapTips

En primer lugar, prepararemos un mapchip y crearemos un mapa. Este procedimiento es similar a los siguientes consejos: MapTips con 2D Tilemap Extras también son capaces de detectar colisiones, pero no se utilizarán en este artículo porque el procedimiento será largo.

Prepare la imagen original del MapTip y agréguela a su proyecto. Para que la operación sea más fácil de entender, prepare un "lugar transitable" y un "lugar no transitable" para el material del chip del mapa.

Configúrelo para MapChips en el Inspector y haga clic en el botón Aplicar. Una vez configurado, abra el Editor de Sprite.

Es un maptip de 32 píxeles, así que lo dividiré en 32.

Seleccione la pestaña Paleta de mosaicos. Si no, muéstrelo con "Window > 2D -> Tile Palette" en el menú. Crea una nueva paleta. El nombre es arbitrario, pero por ahora lo llamaremos "MapChipPalette".

Cree una carpeta MapChipPalette en Escenas y especifíquela.

Agregue una información de mapa arrastrándola a la paleta. Guárdelo en la carpeta MapChipPalette que creó anteriormente.

Crear un mapa

Esta vez, el juicio de acierto del mapa se realizará en unidades de "Tilemap". Por lo tanto, crearemos dos Tilemaps, "Tilemap sin detección de visitas" y "Tilemap con detección de visitas".

En primer lugar, cree dos mapas de teselas en la jerarquía. Puede crear dos en la cuadrícula. Los nombres son "TilemapObeject" y "TilemapGround" para mayor claridad.

Primero, cree un "TilemapGround". Dado que es un rango móvil, simplemente puede sentar el suelo. Si está en el suelo, puede cambiar el patrón.

Por cierto, si el carácter está oculto, seleccione el objeto de carácter y establezca el orden de capas del Sprite Renderer inspector en 2. El orden de las capas es 0 por defecto y el Tilemap es 0, por lo que si lo aumenta por encima de este valor, se mostrará en primer plano.

A continuación, seleccione TilemapObject y coloque la información de mapa que desea dejar inmóvil. Establezca primero el orden de las capas en 1. Esto es para que aparezca frente al suelo.

Así es como se ve si escondes el suelo.

Por supuesto, en este punto, no hay configuraciones relacionadas con la detección de colisiones, por lo que puede conducir en terrenos elevados normalmente. Después de esto, estableceremos la detección de colisiones.

Configuración de detección de colisiones

Primero, configuremos el personaje. Esta configuración es casi la misma que los consejos a continuación, por lo que omitiré los detalles y explicaré brevemente el procedimiento.

Seleccione un objeto de carácter de la jerarquía y seleccione Física 2D -> Colisionador circular 2D en Agregar componente. Si la forma del objeto es rectangular, "Box Collider 2D" está bien.

Del mismo modo, agregue "Física 2D -> Rigidbody 2D".

Establezca la escala de gravedad en 0 para evitar Rigidbody 2D caídas automáticas.

Marque Z en Restricciones para evitar que el sprite gire al chocar.

A continuación, seleccione "TilemapObject" que desea presionar y seleccione "Tilemap -> Tilemap Collider 2D" de "Agregar componente".

Eso es todo lo que hay que hacer. Ni siquiera necesitas programación. Ejecuta el juego e intenta golpear el objeto que se convierte en la pared. Creo que puedes asegurarte de que se detenga correctamente.

Sin embargo, cuando realmente lo golpeas, creo que habrá puntos de preocupación en el comportamiento. Aquí hay algunas soluciones:

Comportamiento inconveniente de detección de golpes con el mapa y las soluciones

Cuando golpeas una pared, puedes encontrar algunas cosas que te molestan.

Si te mueves contra la pared, quedarás atrapado en el medio

Box Collider 2D Creo que sucederá si estás usando un objeto.

Por ejemplo, desde la escena siguiente, cuando presiona la tecla en la parte inferior izquierda, desea que se mueva hacia la izquierda a lo largo de la pared. Sin embargo, después de algunos progresos, creo que se quedará atascado en algo y se detendrá.

Reconocer abolladuras en las paredes por posición

Circle Collider 2D Creo que es fácil de entender si adjuntas . La pared debe ser plana, pero si la mueves contra la pared, verás que la pared se mueve como si fuera desigual.

Causas y soluciones a enganches y golpes

La razón por la que estos ocurren parece ser que "la determinación de golpes se realiza sobre una base de mapchip". De hecho, cuando selecciona TilemapObject, aparece una línea verde en el lugar donde se encuentra la detección de golpes, y puede ver que se trata de una línea dibujada en unidades MapTip.

Por lo tanto, si el objeto en movimiento está en una línea equivalente a exactamente un chip de mapa, se juzgará como un éxito con un chip de mapa. Si chocas en el límite de los chips del mapa, dos fichas de mapa serán golpeadas y juzgadas, por lo que la fuerza del rebote aumentará.

Creo que la mejor manera de resolver este problema es combinar la detección de golpes con los mapchips adjuntos. A continuación, le indicamos cómo hacerlo:

SeleccioneTilemap Collider 2D "TilemapObject" con detección de golpes del inspector y marque "Usar en compuesto" en .

Como se indica en la advertencia, esto por sí solo no tiene ningún efecto, así que seleccione "Physics 2D -> Composite Collider 2D" de "Agregar componente".

Se agrega Rigidbody 2D junto con Composite Collider 2D.

Es un poco confuso, pero creo que puedes confirmar que la línea verde en el límite entre los mapchips con detección de golpes ha desaparecido.

No quiero que el mapa de mosaico se mueva, así que dejaré Rigidbody 2D el tipo de cuerpo del componente como "estático".

Ahora ejecuta el juego e intenta que se mueva. Creo que incluso si te mueves diagonalmente a lo largo de la pared, no quedará atrapado y podrás moverte suavemente sin movimientos irregulares.

Elimina los empujes de carácter hacia atrás de las paredes

Puedes ver que si mueves al personaje para empujar la pared y luego dejas de moverse, se comportará un poco como si rebotara de la pared.

Para resolver esto,Rigidbody 2D seleccione el objeto de carácter y cambie "Detección de colisión" a "Continuo" del componente.

La diferencia entre "discontinuo" y "continuo" es la siguiente.

Discontinuo

La detección de colisiones es un mecanismo que piensa después de moverse. Es una forma que realiza la detección de colisiones desde el estado donde se mueve e incrusta en la pared. Es fácil de entender si lo asocias con trampolines y caucho, pero cuanto más incrustado, más repulsiva aumentará la fuerza y el rebote será más fuerte. En cambio, el cálculo se realiza después de moverse, por lo que el costo de procesamiento es bajo.

Continuo

Se procesa mientras se determina lo que está en camino. Determine si hay una pared entre la posición antes y después del movimiento, Si hay un muro, juzgará la colisión allí y se detendrá, por lo que prácticamente no hay repulsión. En cambio, el costo de procesamiento aumenta un poco porque el cálculo se incluye en medio del movimiento.

Atrapado en la esquina de un objeto de mapa

Dependiendo del programa y la ubicación, algunos son capturados y otros no, y la causa no ha cambiado mucho. Por cierto, sucede con esquinas angulares como Box Collider 2D, y no con círculos redondeados.

Incluso si ocurre un fenómeno tan misterioso, es bueno tener esquinas redondeadas del colisionador para evitar inconvenientes. Está limitado a Box Collider 2D, pero para hacerlo redondo, el componente Box Collider 2D del objeto de personaje tiene un "radio de borde" y pones un valor allí. Si introduce 1 como unidad numérica, se producirá un redondeo para el tamaño del objeto. Depende del tamaño, pero es bueno poner alrededor de 0.1.

Por cierto, el juicio de acierto aumenta solo por el tamaño de la redondez, así que ajústelo si es grande. Box Collider 2D tiene un botón Collider Edit que le permite cambiar su tamaño directamente en la vista haciendo clic en el botón. Dado que la línea verde exterior es la detección de aciertos real, establezca el tamaño para que no sea antinatural.

Después de eso, ejecuta el juego para asegurarte de que no se raye y haz ajustes.