Lo he querido hacer por que los que hay en YT o no te explican todo o fallan por alguna parte, se me ha hecho un poco largo pero si lo ves con calma seguro que te sirve. El próximo capítulo será para mejorar el tema de las escaleras y espero que sea mas corto que este. :D
Muchas gracias, poco a poco iré explicando cosas que iré incorporando al videojuego ( si el tiempo me lo permite, que tengo mis propios videojuegos bastante parados ). Espero que te sirva.
Hola amigo @Paco, regrese nuevamente por aquí, ya tengo las escaleras todo funciona bien y también la de "Escaleras mejoradas", de hecho esta tal cual y funcionando. El problema esta en que deseo implementar otro tipo de escaleras mas al juego, en el cual la escalera esta para que el Player este de perfil y lance una animación de subir escaleras de perfil o de costado y a parte de la que ya tiene en la que esta frente a la escalera y muestra la espalda al subir la escalera y no se como hacerlo de momento ya que podría repetir el código también para este nuevo tipo de escalera pero me late que se puede usar los 2 tipos de escaleras con el mismo código , no se tal vez agregando un tag "EscaleraPerfil" y aparte de tener la capa o layerMask "Escalera"... dame una pista porfa amigo @Paco... o También seria una buena idea para tu próximo tutorial... 😍😍😍👍👍👍👍👍👍👍
Hola Jack, la verdad es que vas bien encaminado, puedes hacerlo exactamente igual, pero si que tendrías que añadir un tag a la escalera para saber si tienes que subir pegado a la izquierda o la derecha, de esta forma sabes donde colocar el sprite, solo con eso y el mismo código que para las otras escaleras debería bastar, pero claro, haciendo otro solo para estas laterales
Muchas gracias León. Últimamente no encuentro tiempo ni para ver los comentarios. A ver si puedo sacar esta semana la segunda parte con la mejora de las escaleras.
Ola Sr Barba, gracias por su gran trabajo, tengo algunos aportes: en el método entroEscalera(): private void entroEscalera(GameObject escalera) { rigibodyPlayer.gravityScale = 0; isTocaSuelo = false; enEscalera = true; rigibodyPlayer.velocity = Vector2.zero; } se puede observar que se le quita la gravedad al Player, para que de esta manera cuando no se pulse nada el Player se quede inmóvil en medio de la escalera. Sin embargo en el método salgoEscalera(): private void salgoEscalera() { enEscalera = false; animatorPlayer.Play("quieto"); } no se le devuelve su gravedad original al Player, esto produce que al momento de salir de las plataformas el Player quede flotando y ya no respeten las físicas originales.. En mi caso comente la línea del código donde se le quita la gravedad, esto me quita el problema del la levitación del Player, pero obviamente en las escalera el player tiende a caer. Al menos de esa manera lo he hecho yo, espero que a alguien le ayude. Saludos
Viendo el siguiente video me di cuenta que ya existe una variable llamada gravedad en el Script de PlayerController, por lo que la solución definitiva en mi caso fue: Crear la variable gravedad: private float gravedad; Asignar en el método Start la gravedad inicial del Player: gravedad = rigibodyPlayer.gravityScale; Agregar en el método salgoEscalera la gravedad original del Player: rigibodyPlayer.gravityScale = gravedad; Con esas modificaciones me funciono todo perfecto
Hola, me ha costado revisar esta semana los comentarios. En mi caso, en el capítulo de las pendientes deje la siguiente función que se ejecuta en el update, por eso yo en cuanto estoy en una escalera estoy continuamente quitando al gravedad, pero antes de esa comprobación la activo siempre, es otra forma de hacerlo. private void CheckPendiente() { enPendiente = false; rPlayer.gravityScale = gravedad; Un saludo!
Hola @Paco, estoy que quiero arreglar la velocidad de subida y de bajada del Player dentro de la escalera para que ambas velocidades sean iguales y descubrí que falta un trozo del video, concretamente en el minuto 20:29 de este mismo videotutorial, podrías comentarnos que pusiste allí para tener mejor el código, por favor amigo @Paco. Tal vez me ayude a solucionar ese problemita, el Player cuando esta dentro de la escalera sube a una velocidad y cuando baja lo hace a otra velocidad mas rápido y quiero que sus velocidades de subida y bajada sean iguales.
Si lo tienes todo bien, ese movimiento se controla con rPlayer.position = new Vector2(objeto.transform.position.x, rPlayer.position.y + (v * 0.01f) ) Parece como si no hubiras colocado rPlayer.gravityScale = 0 cuando detectas que se entra en escalera
Nada, he intentado de muchas formas y hasta el minuto 10:50 todo igual y lo más que consigo es que pegue un "salto/tirón" al intentar subirla. Se pone una fracción de segundo en true el enEscalera y luego a false, y el personaje se queda suspendido en el aire sin gravedad. El fallo esta según creo en estas lineas: else if (enEscalera) SalgoDeEscalera(); if (enEscalera) { Debug.Log("intentando subir escalera"); velocidadEscalera = new Vector2(rPlayer.velocity.x, velocidad * v); rPlayer.MovePosition(rPlayer.position + velocidadEscalera * Time.deltaTime); } No se que hago mal, espero que sea alguna tonteria... *Edito: cree una variable a parte "velocidadEscalera" por si me daba algún problema la de "nuevaVelocidad". Y el mensaje de intentando subir escalera si me sale por consola.
Lo único que se me ocurre es que te esté sacando de la escalera por la primera línea que me pones "if (enEscalera) SalgoDeEscalera();". Yo colocaría un montón de Debug.Log para ver en que momento te está tirando. De todos modos esta semana quiero publicar la siguiente parte de las escaleras, que aunque no corrige nada, si que las mejora.
Me estoy volviendo loco Sr Paco xDDDDD, solamente entra en la escalera si salto, he comprobado el script mil veces, he puesto debug en los rayos, y me detectan la escalera, la variable V se pone en 1 y en -1 según voy dandole arriba u abajo, por lo que también va bien , he ajustado los colliders.... Y no encuentro la solución al problema .
Hola, he estado revisando mi código a ver si hubiera algo raro y lo único que se me ocurre es que conforme entres en la escalera se salga automáticamente por que detecte el suelo o algo así. Tal y como lo tengo y ajustando los colliders debería estar todo ok.
@@PacoBarba buenas tardes muchísimas gracias por responder, el suelo lo detecta por los pies del player , pero en tu vídeo también detecta el suelo , me estoy volviendo loco , he revisado el código de nuevo hoy mío veces jajjajajaja
He estado revisando de nuevo y creo que el fallo esta al darle arriba para subir la escalera, pero no se como solucionarlo, te dejo parte del código con los debugs, por si no te importa echarle un vistazo if (hitRayoDer || hitRayoMed) { if (hitRayoDer) { escaleraActiva = hitRayoDer.transform.gameObject; Debug.Log("TocandoEscaleras"); } if (hitRayoMed) { escaleraActiva = hitRayoMed.transform.gameObject; // Aquí entra ----> Debug.Log("TocandoEscaleras"); } if ((v >0) && (!enEscalera) && (rPlayer.velocity.y >= 0)) { //Aquí entra si salto y pulso arriba----> Debug.Log("estoy pulsando para entrar en escalera"); EntroEnEscalera(escaleraActiva); } } else if (enEscalera) { //Esto también lo hace ------> Debug.Log("Salgo de Escalera");+ SalgoDeEscalera(); } if (v < 0) { Vector2 posRayoAB = new Vector2(transform.position.x - (ccSize.x / 2), transform.position.y - (ccSize.y / 2) - 0.1f); RaycastHit2D hitRayoAB = Physics2D.Raycast(posRayoAB, Vector2.right, ccSize.x, capaEscalera); Debug.DrawRay(posRayoAB, Vector2.right * (ccSize.x), Color.red); if (hitRayoAB) { //Esto también lo hace ------>Debug.Log("Estoy Colisionando con escalera, debo entrar"); EntroEnEscalera(hitRayoAB.transform.gameObject); } else if (enEscalera && tocaSuelo) { SalgoDeEscalera(); //Esto también lo hace ------> Debug.Log("Saliendo De Escalera"); } } if (enEscalera) { if (v != 0) { //Esto no lo hace, solo lo hace si salto------> Debug.Log("Pulso para subir escaleras"); aPlayer.Play("SubeEscalera"); } else { //Esto también lo hace ------> Debug.Log("Estoy quieto en escaleras"); aPlayer.Play("QuietoEscalera"); } nuevaVelocidad = new Vector2(rPlayer.velocity.x, velocidadEscalera * v); rPlayer.MovePosition(rPlayer.position + nuevaVelocidad * Time.deltaTime); CompruebaSalidaLateral(); } }
Joder!!(perdon) llevo dos días vuelto loco con tutos de escaleras, ojalá me sirva cuando lo vea. Gracias Paco
Lo he querido hacer por que los que hay en YT o no te explican todo o fallan por alguna parte, se me ha hecho un poco largo pero si lo ves con calma seguro que te sirve. El próximo capítulo será para mejorar el tema de las escaleras y espero que sea mas corto que este. :D
gracias😃.esperaba este capitulo.te agradezco por el tiempo dedicado .sigue el éxito te lo estás ganando a pulso.
Muchas gracias, poco a poco iré explicando cosas que iré incorporando al videojuego ( si el tiempo me lo permite, que tengo mis propios videojuegos bastante parados ). Espero que te sirva.
Hola amigo @Paco, regrese nuevamente por aquí, ya tengo las escaleras todo funciona bien y también la de "Escaleras mejoradas", de hecho esta tal cual y funcionando. El problema esta en que deseo implementar otro tipo de escaleras mas al juego, en el cual la escalera esta para que el Player este de perfil y lance una animación de subir escaleras de perfil o de costado y a parte de la que ya tiene en la que esta frente a la escalera y muestra la espalda al subir la escalera y no se como hacerlo de momento ya que podría repetir el código también para este nuevo tipo de escalera pero me late que se puede usar los 2 tipos de escaleras con el mismo código , no se tal vez agregando un tag "EscaleraPerfil" y aparte de tener la capa o layerMask "Escalera"... dame una pista porfa amigo @Paco... o También seria una buena idea para tu próximo tutorial... 😍😍😍👍👍👍👍👍👍👍
Hola Jack, la verdad es que vas bien encaminado, puedes hacerlo exactamente igual, pero si que tendrías que añadir un tag a la escalera para saber si tienes que subir pegado a la izquierda o la derecha, de esta forma sabes donde colocar el sprite, solo con eso y el mismo código que para las otras escaleras debería bastar, pero claro, haciendo otro solo para estas laterales
Muchas gracias por seguir con los tutoriales
Muchas gracias León. Últimamente no encuentro tiempo ni para ver los comentarios. A ver si puedo sacar esta semana la segunda parte con la mejora de las escaleras.
Ola Sr Barba, gracias por su gran trabajo, tengo algunos aportes:
en el método entroEscalera():
private void entroEscalera(GameObject escalera)
{
rigibodyPlayer.gravityScale = 0;
isTocaSuelo = false;
enEscalera = true;
rigibodyPlayer.velocity = Vector2.zero;
}
se puede observar que se le quita la gravedad al Player, para que de esta manera cuando no se pulse nada el Player se quede inmóvil en medio de la escalera.
Sin embargo en el método salgoEscalera():
private void salgoEscalera()
{
enEscalera = false;
animatorPlayer.Play("quieto");
}
no se le devuelve su gravedad original al Player, esto produce que al momento de salir de las plataformas el Player quede flotando y ya no respeten las físicas originales..
En mi caso comente la línea del código donde se le quita la gravedad, esto me quita el problema del la levitación del Player, pero obviamente en las escalera el player tiende a caer.
Al menos de esa manera lo he hecho yo, espero que a alguien le ayude.
Saludos
Viendo el siguiente video me di cuenta que ya existe una variable llamada gravedad en el Script de PlayerController, por lo que la solución definitiva en mi caso fue:
Crear la variable gravedad:
private float gravedad;
Asignar en el método Start la gravedad inicial del Player:
gravedad = rigibodyPlayer.gravityScale;
Agregar en el método salgoEscalera la gravedad original del Player:
rigibodyPlayer.gravityScale = gravedad;
Con esas modificaciones me funciono todo perfecto
Hola, me ha costado revisar esta semana los comentarios.
En mi caso, en el capítulo de las pendientes deje la siguiente función que se ejecuta en el update, por eso yo en cuanto estoy en una escalera estoy continuamente quitando al gravedad, pero antes de esa comprobación la activo siempre, es otra forma de hacerlo.
private void CheckPendiente() {
enPendiente = false;
rPlayer.gravityScale = gravedad;
Un saludo!
Suscrito!!! Gracias por el contenido 🙏
Muchas gracias y bienvenido!
Hola @Paco, estoy que quiero arreglar la velocidad de subida y de bajada del Player dentro de la escalera para que ambas velocidades sean iguales y descubrí que falta un trozo del video, concretamente en el minuto 20:29 de este mismo videotutorial, podrías comentarnos que pusiste allí para tener mejor el código, por favor amigo @Paco. Tal vez me ayude a solucionar ese problemita, el Player cuando esta dentro de la escalera sube a una velocidad y cuando baja lo hace a otra velocidad mas rápido y quiero que sus velocidades de subida y bajada sean iguales.
Si lo tienes todo bien, ese movimiento se controla con
rPlayer.position = new Vector2(objeto.transform.position.x, rPlayer.position.y + (v * 0.01f) )
Parece como si no hubiras colocado rPlayer.gravityScale = 0 cuando detectas que se entra en escalera
Nada, he intentado de muchas formas y hasta el minuto 10:50 todo igual y lo más que consigo es que pegue un "salto/tirón" al intentar subirla. Se pone una fracción de segundo en true el enEscalera y luego a false, y el personaje se queda suspendido en el aire sin gravedad.
El fallo esta según creo en estas lineas:
else if (enEscalera) SalgoDeEscalera();
if (enEscalera)
{
Debug.Log("intentando subir escalera");
velocidadEscalera = new Vector2(rPlayer.velocity.x, velocidad * v);
rPlayer.MovePosition(rPlayer.position + velocidadEscalera * Time.deltaTime);
}
No se que hago mal, espero que sea alguna tonteria...
*Edito: cree una variable a parte "velocidadEscalera" por si me daba algún problema la de "nuevaVelocidad". Y el mensaje de intentando subir escalera si me sale por consola.
Lo único que se me ocurre es que te esté sacando de la escalera por la primera línea que me pones "if (enEscalera) SalgoDeEscalera();". Yo colocaría un montón de Debug.Log para ver en que momento te está tirando. De todos modos esta semana quiero publicar la siguiente parte de las escaleras, que aunque no corrige nada, si que las mejora.
@@PacoBarba seguiré probando cosas, gracias por responder!
Me estoy volviendo loco Sr Paco xDDDDD, solamente entra en la escalera si salto, he comprobado el script mil veces, he puesto debug en los rayos, y me detectan la escalera, la variable V se pone en 1 y en -1 según voy dandole arriba u abajo, por lo que también va bien , he ajustado los colliders.... Y no encuentro la solución al problema .
Hola, he estado revisando mi código a ver si hubiera algo raro y lo único que se me ocurre es que conforme entres en la escalera se salga automáticamente por que detecte el suelo o algo así. Tal y como lo tengo y ajustando los colliders debería estar todo ok.
@@PacoBarba buenas tardes muchísimas gracias por responder, el suelo lo detecta por los pies del player , pero en tu vídeo también detecta el suelo , me estoy volviendo loco , he revisado el código de nuevo hoy mío veces jajjajajaja
He estado revisando de nuevo y creo que el fallo esta al darle arriba para subir la escalera, pero no se como solucionarlo, te dejo parte del código con los debugs, por si no te importa echarle un vistazo
if (hitRayoDer || hitRayoMed)
{
if (hitRayoDer)
{
escaleraActiva = hitRayoDer.transform.gameObject;
Debug.Log("TocandoEscaleras");
}
if (hitRayoMed)
{
escaleraActiva = hitRayoMed.transform.gameObject;
// Aquí entra ----> Debug.Log("TocandoEscaleras");
}
if ((v >0) && (!enEscalera) && (rPlayer.velocity.y >= 0))
{
//Aquí entra si salto y pulso arriba----> Debug.Log("estoy pulsando para entrar en escalera");
EntroEnEscalera(escaleraActiva);
}
}
else if (enEscalera)
{
//Esto también lo hace ------> Debug.Log("Salgo de Escalera");+
SalgoDeEscalera();
}
if (v < 0)
{
Vector2 posRayoAB = new Vector2(transform.position.x - (ccSize.x / 2), transform.position.y - (ccSize.y / 2) - 0.1f);
RaycastHit2D hitRayoAB = Physics2D.Raycast(posRayoAB, Vector2.right, ccSize.x, capaEscalera);
Debug.DrawRay(posRayoAB, Vector2.right * (ccSize.x), Color.red);
if (hitRayoAB)
{
//Esto también lo hace ------>Debug.Log("Estoy Colisionando con escalera, debo entrar");
EntroEnEscalera(hitRayoAB.transform.gameObject);
}
else if (enEscalera && tocaSuelo)
{
SalgoDeEscalera();
//Esto también lo hace ------> Debug.Log("Saliendo De Escalera");
}
}
if (enEscalera)
{
if (v != 0)
{
//Esto no lo hace, solo lo hace si salto------> Debug.Log("Pulso para subir escaleras");
aPlayer.Play("SubeEscalera");
}
else
{
//Esto también lo hace ------> Debug.Log("Estoy quieto en escaleras");
aPlayer.Play("QuietoEscalera");
}
nuevaVelocidad = new Vector2(rPlayer.velocity.x, velocidadEscalera * v);
rPlayer.MovePosition(rPlayer.position + nuevaVelocidad * Time.deltaTime);
CompruebaSalidaLateral();
}
}