Unir formas en el juego

8

Estoy tratando de averiguar cómo juntar formas para que el jugador pueda moverse en un lienzo.

ingrese la descripción de la imagen aquí

A medida que el cuadrado se acerca al otro objeto, quiero atraer esa forma (dada una cierta proximidad) y hacer que encaje perfectamente a lo largo del borde de ese objeto.

Reglas:

  • Solo si los bordes son paralelos entre sí
  • Si un cuadrado secundario (que se arrastra) es la mitad del tamaño del cuadrado primario (que se aproxima), entonces el punto medio del borde del cuadrado primario puede determinar si el secundario se ajusta a la izquierda / derecha / arriba / abajo

ingrese la descripción de la imagen aquí

Alguien ha hecho algo como esto? Estoy usando c # y unity. Salud.

dolyth
fuente

Respuestas:

7

He escrito un prototipo de algo como esto. Creé algunos recursos que se veían así:

ingrese la descripción de la imagen aquí

Entonces, básicamente, este objeto "ShipPart" tiene puntos de ajuste predefinidos. Estos cuatro colisionadores ayudarán a determinar si está intentando colocar un objeto en su lugar o no.

Luego creé una clase ShipPart, que contiene algunas cosas como:

//Neighbor information
ShipPart Left, Right, Top, Bottom;

//current rotation
float Rotation;

//The ship core it is attached to
Ship Ship;

//The coordinates in references to the ship core
int X ;
int Y ;

También contiene funciones y propiedades para ayudar a arrastrar y soltar, y verificar el estado de los ShipParts vecinos.

Una función importante es la función Adjuntar (), que conectará este ShipPart a su Barco.

public void Attach(Ship ship, int x, int y)
{
    GetComponent<Rigidbody2D> ().isKinematic = true;

    Ship = ship;

    X = x;
    Y = y;

    transform.parent = Ship.transform;
    transform.position = Vector2.zero;
    transform.localPosition = new Vector2(x, -y);
}

Luego, finalmente, la clase Barco, realiza un seguimiento de su pieza principal, todas las partes adjuntas, todos los datos de los barcos se gestionan aquí. Puede emitir rayos para piezas de barcos en esta clase. Verifique la parte que está arrastrando actualmente para ver si alguno de los colisionadores está colisionando con otras partes.

Si hay una colisión, verifique si la rotación está dentro de su umbral especificado y luego ajústela en su lugar.

En realidad, esto es mucho más complicado de explicar de lo que pensé que sería. Avíseme si tiene preguntas y explicaré lo que necesite para obtener más ayuda.

ingrese la descripción de la imagen aquí

jgallant
fuente
Gracias por una respuesta bien ilustrada: tengo una pregunta :), los puntos de ajuste predefinidos, ¿son estos puntos de los que está comprobando la proximidad? Luego, cuando están cerca, aparece el cuadro verde ... lo que significa que si liberas ahora, ¿el ajuste está listo?
dolyth
1
Sí, los cuadros verdes son para indicar que hay un complemento disponible y dónde se ajustará. El colisionador existe en esta misma área, y es lo que se usa para determinar si puede ajustar o no. Emití cuatro puntos mientras movía activamente una parte para determinar si superponíamos un punto de ajuste o no, y si lo estamos, qué tan cerca estamos de ese objeto.
jgallant
¿Cómo haces que aparezcan los cuadros verdes cuando estás haciendo snap? ¿Tienes todos los scripts en github en alguna parte? Gracias, Melissa
MContributor