¿Listo para darle sentido a la barra de maná? Aquí verás cómo añadir un supersalto en Unity que consume maná y multiplica la altura del salto con un factor configurable. Todo con C#, reutilizando tu método de salto y manteniendo el control del juego claro y equilibrado.
¿Cómo activar el supersalto con maná en Unity?
Para potenciar el salto sin romper tu arquitectura, se crean constantes para el coste y la fuerza del supersalto, se configura un input alternativo en el Input Manager y se refactoriza el método Jump con un parámetro bool. Así, con un clic derecho (o la tecla que elijas), el personaje salta más alto solo si tiene maná suficiente.
¿Qué constantes y parámetros definen el supersalto?
Define el coste en maná con public const int.
Define el multiplicador de altura con public const float.
Usa valores placeholder que podrás ajustar luego.
// Coste y fuerza del supersaltopublicconstint SuperJumpCost =5;// consume 5 puntos de manápublicconstfloat SuperJumpForce =1.5f;// salta un 50 % más alto
Claves de código: el modificador public permite acceder desde otros scripts; const evita cambios en tiempo de ejecución; tipos int y float representan coste y factor de fuerza, respectivamente.
¿Cómo se configura el input alternativo en Unity?
Abre Project Settings > Input Manager.
Duplica el último eje y renómbralo a SuperJump.
En PositiveButton, asigna Mouse1 para el botón derecho.
Opcional: añade una tecla cercana a la barra espaciadora, por ejemplo, la tecla M.
Así podrás capturar tanto Jump (espacio) como SuperJump (clic derecho) sin conflictos.
¿Cómo se modifica el método jump para aplicar fuerza variable?
Primero, diferencia el input estándar del alternativo con GetButtonDown.
Luego, añade el parámetro bool al método y calcula un jumpForceFactor local. Si hay maná suficiente, se descuenta y se multiplica la fuerza por el factor del supersalto.
voidJump(bool superJump){// jumpForce es la fuerza estándar ya definida en tu controladorfloat jumpForceFactor = jumpForce;if(superJump && manaPoints >= SuperJumpCost){ manaPoints -= SuperJumpCost;// resta maná jumpForceFactor *= SuperJumpForce;// aplica multiplicador}// Aplica la fuerza al Rigidbody usando el factor calculado rb.AddForce(Vector2.up * jumpForceFactor);}
Detalles útiles: emplea operadores compuestos para escribir más claro y seguro: += para sumar, -= para restar y *= para multiplicar por un factor.
¿Qué validaciones de maná mantienen el balance?
El supersalto solo se ejecuta si el personaje tiene recursos. La comprobación de manaPoints >= SuperJumpCost evita consumos negativos y mantiene la coherencia del sistema.
Validación previa: no se resta maná si no alcanza el coste.
Consumo explícito: manaPoints -= SuperJumpCost cuando procede.
Potencia controlada: jumpForceFactor *= SuperJumpForce solo con maná suficiente.
Fallback seguro: si no hay maná, se ejecuta el salto normal.
Feedback inmediato: la barra de maná disminuye al activar el supersalto y, al agotarse, ya no potencia el salto.
¿Qué habilidades y conceptos refuerzas al implementarlo?
Esta mejora consolida prácticas de programación y diseño de juego centradas en claridad, control y escalabilidad.
Diseño con constantes para costes y factores ajustables.
Tipos int y float para representar recursos y multiplicadores.
Parámetro bool en Jump para alternar comportamientos sin duplicar código.
Configuración de entradas en Input Manager con PositiveButton en Mouse1.
Refactorización del controlador del jugador para separar input, lógica y física.
Operadores compuestos +=, -=, *= para expresividad y mantenimiento.
Integración con Rigidbody aplicando un factor de fuerza local.
Uso de valores placeholder que se calibran según el nivel y el diseño.
¿Ya lo probaste con distintos costes y factores? Comparte qué combinaciones te dieron mejor flujo de juego y qué teclas te resultaron más cómodas para el SuperJump.
Muy buen curso! Se recomienda ver el curso de programación básica o saber algoritmos básicos antes de incursionar en módulos mas avanzados de programación como este, para evitar la confusión.
Si presentan el problema de agregar el superjump al input manager y este no reacciona, deben fijarse que en los select del final (type, axix, joy num) tengan estos valores:
Type: Key or Mouse ButtonAxis: X axis
Joy Num: Get Motion from all Joy
Esto hace que se detecten los botones del teclado y mouse.
Gracias!
Yo utilice la mana para hacer que el personaje pudiera ir a mayor velocidad apretando Shift Izquierdo, siempre y cuando el mana sea mayor a cero.
Buena mecánica.
yo hare lo mismo jajaja se me habia ocurrido hace rato e imagina los 2 a la vez algo asi para un super aceleron y hacer speed runs jajjaa
Hola me gustaría hacer que mi personaje corra alguien sabe como se hace?
Podrías aumentar la fuerza de velocidad
Esto lo pones dentro del Update, es el movimiento del personaje
Esto siguiente dentro del FixedUpdate, es para que el sprite del personaje voltee al cambiar de direccion (ignora lo de sprintar, no es necesario)
Asi lo hice yo.
En las ultimas instancias se convierte en confusión absoluta lograr entender la lógica y las explicaciones del profesor. 😦
hola Alejo! Me podrias pasar mas detalles y con gusto te ayudamos!
Ricardo cordial saludo. En este momento solamente sigo los pasos e instrucciones del profesor (modo automático).
La cosa es que se han utilizado mas de 10 Scripts de programación y se ha convertido en un asunto de confusión absoluta. De Donde se invoca una cantidad de información abrumadora, la cual se torna complicada de digerir pues en ocasiones no explica muy bien la funcionalidad de algunos elementos.
Pero resalto es buen docente. Solo que se apresura en el curso.
Agradezco ayuda.
Lo que hice yo fue permitir un doble salto dependiendo del mana
voidJump(){//jump is a impulse force :Dif(IsTouchingFloor()&& isInGame){ rigidBody.AddForce(Vector2.up* jumpForce,ForceMode2D.Impulse);}elseif(!IsTouchingFloor()&& isInGame && manaPoints >SUPERJUMP_COST){ rigidBody.AddForce(Vector2.up* jumpForce,ForceMode2D.Impulse); manaPoints -=SUPERJUMP_COST;}}
El codigo tiene un error que no se noto porque usaste dos botones distintos, pero te das cuenta si tocas los dos al mismo tiempo, que aunque no tengas mana va a saltar el doble. Para solucionar este problema tenes que poner un else entre la condicion del supersalto y la del salto normal.
para practicar también hice un sistema de daño
hice una mecanica de corren y para la gestion de mana
Algo que tuve que hacer fue limitar el máximo en el eje "Y" a cierto valor dado que, al contar en mi versión con plataformas que te dan un rebote, permitían al jugador saltar infinitamente y salir de la cámara sin ninguna referencia. La solución que aplique fue colocar una variable de "MAX_Y_POSITION" y luego ponerle un máximo con la siguiente línea de codigo:
public float
MAX_Y_POSITION;
if (this.transform.position.y >= MAX_Y_POSITION)
{
playerRigidBody.position = new Vector2(transform.position.x, MAX_Y_POSITION);
}
Esta solución podría ser cambiada en los niveles con las diferentes opciones de "collider2d" con las que contamos sin embargo si deseamos cambiar la altura a todo el juego tendríamos que cambiar los prefabs o límites uno por uno y con esa línea de codigo lo que ahorramos en tiempo de diseño de niveles es bastante :D
Adicionalmente cree una variable de "maxForce" para que el salto y limitar esta magnitud con la linea de codigo:
esto dentro del FixedUpdate, ahora tendremos limitadas tanto la altura como la fuerza máxima (de no ser así podríamos quedarnos pegados un rato al techo ya que la fuerza nos sigue impulsando hacia arriba independientemente de que sigamos subiendo o no.
Pero por que salta infinitamente?, para eso pusimos en código la función de IsTouchingTheGround y el LayerMask para que sepamos si esta tocando el suelo o no...si lo esta tocando poder brincar y para poder brincar otra vez volver a tocar el suelo
El cáculo de jumpForceFactor mejor colocarlo dentro del ámbito de la condición IsTouchingTheGround().
Por cierto, IsTouchingTheGround se puede llegar a calcular dos veces en el método Update. Mejor refactorizar la dupla Update()<->Jump().
Mana recarga de manera automatica un punto cada 2.5 seg
Deja un rastro de polvo cuando salta y cuando hace la habilidad de mana
Cambie el supersalto, por un ataque frontal
Agregado el menu principal (pantalla de muerte esta implementada pero sin mostrar aun)
Hola que tal saben porque se duplica el valor SUPERJUMP_COST?
Es porque el botón de saltar llama dos veces al método. Pero como la función está fuera del if IsTouchingTheGround, se ejecuta incluso si no está en el suelo.
Como solución, el if que creó el profesor, déjalo dentro del if de salto y solucionado.
Para crear y configurar un nuevo botón de entrada (así como el Jump, SuperJump, Fire, etc) entramos a Edit > Project Settings > Input y aumentamos la cantidad de entradas con la opción Size.
Para abrir la pestaña de animaciones entramos a Window > Animation > Animation.
El super salto debe ejecutarse solo si está tocando el suelo y el estado del juego es inGame
Muchas gracias al profesor al agregar esa lógica de añadir una variable la cual se modifica según el estado del condicional, me parece un razonamiento que puede ayudar a solucionar varios tipos de problemas que conllevan en repetición de código.