¿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.
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.
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.
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.
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
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().
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.
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.