Jump to content
Sign in to follow this  
R3N3

Problemas juego puzzle

Recommended Posts

Hola comunidad, tengo un problema que me viene jodiendo bastante hace un tiempo. Estoy creando un juego de puzzles en el  que es necesario tener mecáninicas tan simples  como mover una caja o subir en plataformas q se mueven.

Lo de mover cajas lo tengo resuelto de la siguiente manera, el personaje entra  en contacto con la caja, presiona el botón de acción y en ese momento hago la caja hija del player. De esta forma ya puedo arrastrarla, ahora, si empujo la caja contra una pared y sigo haciendo fuerza el player atraviesa la caja esta se mueve de su posición (un desastre), lo resolví de la siguiente forma:

//si el personaje tiene la caja agarrada
else{
                float h = Input.GetAxis("Horizontal");

                if(izqDeLaCaja){  //leo de la caja un ray q marca cuando choca a su izquierda
                    if (h < 0) {  //si choca y continúo empujando en esa dirección hace la fuerza = 0
                        h *= 0;
                    } else {
                        h*=1;
                    }
                }else if(derDeLaCaja){ //igual q arriba pero para el lado derecho
                    if (h > 0) {
                        h *= 0;
                    } else {
                        h*=1;
                    }
                }
                moveDirection2D = new Vector2(h, 0);
                moveDirection2D = transform.TransformDirection(moveDirection2D);
                moveDirection2D *= speed;

                moveDirection2D.y -= gravity * Time.deltaTime;
                controller.Move(moveDirection2D * Time.deltaTime);
            }

 Lo que quisiera saber es si hay una forma más óptima de hacer esto, porque cuando el jugador es en 3d la cosa se complica y queda u bloque de código un poco grande.
         En cuanto a lo del player sobre las plataformas, también lo resuelvo haciendo hijo al jugador de la plataforma que se mueve, pero la plataforma padre me afecta la escala del player al hacerlo su hijo, no se por qué puñetera razón:        
        

Cita

OnCollisionStay(parametros){
         hago al player hijo de la plataforma;
         }
         OnCollisionExit(parametros){
         le quito el player a la plataforma dejándolo libre;
         }

 

Share this post


Link to post
Share on other sites
6 hours ago, R3N3 said:

En cuanto a lo del player sobre las plataformas, también lo resuelvo haciendo hijo al jugador de la plataforma que se mueve, pero la plataforma padre me afecta la escala del player al hacerlo su hijo, no se por qué puñetera razón:

Por que así funciona el hacer enparentamiento, si querés evitar eso podés usar el SetParent,

https://docs.unity3d.com/ScriptReference/Transform.SetParent.html

el segundo argumento está para eso, si está en falso y el padre tiene 0.5 / 0.5 / 0.5 de escala y tu hijo 1 / 1 / 1, al final tendrá lo mismo pero el padre lo tocará entonces quedará encogido ... en cambio, si le das true hará a la escala del hijo tal de que quede visiblemente igual (debería figurar en el hijo una escala de 2 / 2 / 2), esto es lo que vos querés.

Te digo, si empezás a controlar todo así, sin usar físicas, el hacer padres e hijos no es la mejor forma de resolver esto de las plataformas. El primer paso sería encontrar el delta de posición, es tan simple como registrar en el momento del contacto con la plataforma una delta (que será cero), en el cuadro siguiente haces la resta de la pos de dicho cuadro vs la del cuadro anterior, este es tu delta, luego te queda aplicar el movimiento.

El segundo punto es ver como es que movés a tu personaje, ya que si la plataforma va derecho y se choca contra una pared tu personaje pasará de largo, algo que en teoría no querés, pero bueno, quizás sea demasiado para lo querés hacer, quizás no, no lo se.

7 hours ago, R3N3 said:

Lo que quisiera saber es si hay una forma más óptima de hacer esto, porque cuando el jugador es en 3d la cosa se complica y queda u bloque de código un poco grande.

Es algo engañoso, pero podés hacer un truco que yo usaba, segun el código que pusiste supongo que tenés un Character controller, podés meterle un Capsule Collider con un rigidbody (mmm creo que si o si dinámico, si es así freezá rotaciones), pero, el capsule collider DEBE ser un poquito mas grande que el CharacterController. Lo que va a pasar cuando te muevas es que el CapsuleCollider (en si el RB) va a aplicar fuerzas a las cajas, que deberían tener o no sus limitaciones a la hora de rotar, si querés, si no está bien también.

Si querés hacerlo mucho más exacto, aca ya te tenes que meter mucho en los raycast, es decir, tu personaje entra en contacto con la caja, podés sacar la direccion de fuerza, disparar un ray de la caja, si tiene lugar para moverse bien, si no ignorar movimiento. Esto te funciona en 2D y 3D. Si querés evitar la parte del contacto y la dir de fuerza podés usar ComputePenetration, (necesitás > 5.6 y solo en 3D, que en tu caso está bien) y aplicar el vector de penetración, fijate el ej que es muy completo.

https://docs.unity3d.com/ScriptReference/Physics.ComputePenetration.html

Saludos

Share this post


Link to post
Share on other sites
On 2/12/2018 at 18:37, lightbug said:

Por que así funciona el hacer enparentamiento, si querés evitar eso podés usar el SetParent,

...

Gracias por tu ayuda, interesante lo del Physics.ComputePenetration, he decidido volver empezar de cero para hacer todo de mejor forma y usar esto. Como no encontré referencia muy clara sobre el tema y la no entendí muy bien la documentación de Unity decidí probarlo por mí mismo. Me funcionó en parte, no entiendo q sucede, en las imgs adjuntas puedes ver, los cubos azules serían objetos de la escena y el blanco mi caja a mover. El cubo azul señalado con la palomita verde funciona perfectamente, detecta la superposición de objetos por todas las caras. En cambio los otros dos, clonados de este, no lo hacen igual, como puedes ver en las imágenes, si lo toco por un borde si lo detecta; pero si lo hago de forma completa no. No entiendo por qué no interactúan igual los objetos. Qué puede ser?    

1.jpg

3.jpg

4.jpg

Caja3d.cs

Share this post


Link to post
Share on other sites
Sign in to follow this  

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...