DEV Community

Cover image for Creando mecánicas: rotar una caja
Jorge Acosta
Jorge Acosta

Posted on

Creando mecánicas: rotar una caja

Queremos construir una mecánica que nos permita poder mover una caja, pero rotándola de un punto de referencia (pivot), esto se quiere conseguir para lograr mecánicas de puzzles en las cuales los personajes deberán mover las cajas formando cierto patrón, esquivando obstáculos o para que la orientación de la caja exponga un elemento que permita avanzar en el escenario, como una escalera.

Image description

para lograr esto, usaremos un método de transform:

transform.RotateAround(Vector3, Vector3, float);
Enter fullscreen mode Exit fullscreen mode

el primer parámetro es la dirección en la que queremos girar, imagina que quieres empujar una caja con tus manos, la dirección de tus manos es el vector que deberá ir aquí.

el segundo parámetro es la posición del pivot, es decir, el punto en el que nuestra caja se ancla y donde está el eje de giro, que es perpendicular al de la dirección.

Finalmente, el ultimo parámetro es la cantidad de giro que queremos.

void turningBox(){

    if(isTurning){

        float currentAmount = speed * Time.deltaTime;
        amount += currentAmount;

        if(amount >= 90.0f){
            isTurning = false;
            amount = 0.0f;
            return;
        }

        transform.RotateAround(pivot, direction, currentAmount);

    }
}

Enter fullscreen mode Exit fullscreen mode

como lo que queremos es girar en 90 grados nuestra caja en algún sentido, cuando la variable booleana isTurning esta en true la variable amount va acumulando giro, hasta llegar a los 90, es en ese momento que paramos el giro.

el método turningBox lo ejecutamos en cada frame

void Update(){
    turningBox();
}
Enter fullscreen mode Exit fullscreen mode

Ahora debemos preguntarnos cómo calcular el pivot y la dirección

Image description

void TurningToDirection(Vector3 pivotVector, Vector3 forceDirection){
    if(isTurning) return;
    pivot = transform.position  + (pivotVector - Vector3.up) * size;
    direction = forceDirection;
    isTurning = true;
}
Enter fullscreen mode Exit fullscreen mode

Dependiendo de donde queramos empujar, debemos calcular el pivot de esta forma:

transform.position  + (Vector3.right - Vector3.up) * size;
Enter fullscreen mode Exit fullscreen mode

desde la posición de nuestra caja, sumamos el vector de donde vamos a empujar (en el ejemplo right) y siempre restamos Vector3.up, para que sea nuestra fondo, eso lo multiplicamos por el size (que en realidad es la mitad del tamaño de la caja).

finalmente, tengo 4 métodos que mueven la caja en la dirección deseada, pasándole sus respectivos vectores.

void TurningToRight(){
    TurningToDirection(Vector3.right, Vector3.back);
}

void TurningToLeft(){
    TurningToDirection(Vector3.left, Vector3.forward);
}

void TurningToFront(){
    TurningToDirection(Vector3.forward, Vector3.right);
}

void TurningToBack(){
    TurningToDirection(Vector3.back, Vector3.left);
}
Enter fullscreen mode Exit fullscreen mode

Happy Coding!!

Top comments (0)