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.
para lograr esto, usaremos un método de transform:
transform.RotateAround(Vector3, Vector3, float);
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);
}
}
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();
}
Ahora debemos preguntarnos cómo calcular el pivot y la dirección
void TurningToDirection(Vector3 pivotVector, Vector3 forceDirection){
if(isTurning) return;
pivot = transform.position + (pivotVector - Vector3.up) * size;
direction = forceDirection;
isTurning = true;
}
Dependiendo de donde queramos empujar, debemos calcular el pivot de esta forma:
transform.position + (Vector3.right - Vector3.up) * size;
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);
}
Happy Coding!!
Top comments (0)