Yo logre detener el movimiento del personaje llamado a un método de su RigidBody2D
rigid.Sleep ();
El personaje y el controlador
Programación de Videojuegos en Unity con C#
Creación y organización de proyectos 2D en Unity
Uso de Sprite Atlas en Unity para Optimizar Recursos Visuales
Animación de Personajes en Unity: Creación y Control de Sprites
Transiciones de Animaciones en Unity para Videojuegos 2D
Creación de Prefabs y Física Básica en Unity 2D
Conceptos de Física en Videojuegos con Unity: Colliders y RigidBodies
Creación y Uso de Colliders y Scripts en Unity para Videojuegos
Métodos Awake y Start en Unity para Configuración Inicial
Detección de Colisión con Raycast en Unity para Saltos Precisos
Uso de Gizmos y Física en Unity para Desarrollo de Videojuegos
Cambio de Animaciones de Personaje con Animator en Unity
Animación de Salto en Videojuegos: Creación de Estados Dinámicos
Animaciones y Transiciones en Unity Mechanim
Movimiento automático y control del personaje en Unity
El manager del videojuego
Creación y Gestión de un Game Manager en Videojuegos
Implementación de Singletons en Programación de Videojuegos
Transición de Estados en Videojuegos con Unity: Menú a Juego
Configuración de Controles en Unity: Uso del Input Manager
Configuración de Input Manager en Unity para Juegos
Creación de Zonas de Muerte con Colliders y Triggers en Unity
Función de Reset en Videojuegos 2D: Reinicio y Corrección de Bugs
Corrección de Bugs en Reaparición y Reinicio en Unity
Diseño procedural de niveles 2D
Diseño de Niveles: Creación Manual y Procedural en Videojuegos
Diseño Procedural de Niveles en Videojuegos: Pixel Perfect en Unity
Gestión de Bloques de Nivel en Videojuegos con Unity
Implementación de ExitZone para Destrucción de Bloques en Videojuegos
Generación Procedural de Niveles en Unity: Object Pooling y Optimización
Implementación de Cámara Follow en Videojuegos 2D con Unity
Destrucción de Bloques y Generación Procedural en Videojuegos
Corrección de errores en el Game Manager de videojuegos
Sincronización de Cámara y Fondo en Videojuegos 2D
HUD, menús y gameplay
El canvas en Unity
Diseño de Menú de Inicio en Videojuegos con Canvas
Programación de Funcionalidades de Botones en Unity
Diseño de Canvas para Pantalla de Juego y Game Over
Programación de Script para Interfaz de Juego en Unity
Incorporación de Objetos Recolectables en Unity
Implementación de un sistema de recolección de monedas en Unity
Programación de Pociones de Vida y Maná en Videojuegos
Notificación de Recolección de Pociones en Unity
Diseño e Implementación de Barras de Vida y Maná en Unity
Cálculo de Puntuación y Persistencia en Videojuegos con Unity
Implementación de Super Salto en Unity con Uso de Maná
Enemigos y dificultad
Creación de Plataformas Móviles en Unity con Animaciones
Scripts y Triggers para Plataformas Móviles en Videojuegos 2D
Programación de Enemigos Móviles en Unity con C#
Implementación de Fixed Update para Movimiento de Enemigos en Unity
Programación de colisiones para enemigos en videojuegos
Corrección de Bugs en Colisiones y Vida de un Personaje en Videojuegos
Control de Vida y Muerte de Personaje en Videojuegos
Añadir Música de Fondo en Videojuegos con Unity
Implementación de Efectos de Sonido en Videojuegos con Unity
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
El Input Manager es una herramienta que nos proporciona Unity para expandir la entrada de controles y soportar y reaccionar correctamente a todas las posibles acciones de los jugadores en las plataformas disponibles. Unity nos enviará códigos especiales cuando el jugador oprima ciertos botones y nosotros devolveremos la acción que queremos realizar.
En esta clase vamos a trabajar con nuestros scripts controladores para cambiar entre los estados del juego por medio de esta nueva entrada de controles en vez de reaccionar por una tecla en particular.
El desafío de esta clase es evitar que nuestro personaje pueda saltar a menos que estemos en estado de ““In Game””, así como hemos evitado que nuestro personaje pueda avanzar en el resto de estados.
Aportes 29
Preguntas 3
Yo logre detener el movimiento del personaje llamado a un método de su RigidBody2D
rigid.Sleep ();
Mi código. Yo le tengo configurado para que no camine automáticamente, sino cuando yo presiono las flechas.
void Update () {
if(GameManager.sharedInstance.currentGameState == GameState.inGame){
if(Input.GetButtonDown("Jump")){
Jump();
}
}
animator.SetBool(STATE_ON_THE_GROUND, isTouchingTheGround());
Debug.DrawRay(this.transform.position, Vector2.down*1.4f, Color.red); // for debug purposes
}
void FixedUpdate() {
// if(rigidBody.velocity.x < runningSpeed){
// rigidBody.velocity = new Vector2(runningSpeed, rigidBody.velocity.y);
// }
if(GameManager.sharedInstance.currentGameState == GameState.inGame){
playerMovement();
}
}
void playerMovement(){
float isWalking = Input.GetAxisRaw("Horizontal");
if(isWalking != 0){ //is true
animator.SetBool(STATE_IS_QUIET, false);
animator.SetBool(STATE_IS_WALKING, true);
rigidBody.velocity = new Vector2(isWalking * runningSpeed,rigidBody.velocity.y);
spriteRenderer.flipX = (isWalking == -1) ? true : false;
//if the value returns -1 that means is walking to the left and we need to make a flip in X
}else{
animator.SetBool(STATE_IS_QUIET, true);
animator.SetBool(STATE_IS_WALKING, false);
}
}
Podemos encontrar la herramienta de Input Manager en Edit > Project Settings > Input
.
Solo hay que hacer eso para declarar que el personaje solo salte en modo juego, sin embargo al probarlo les recomiendo cambiar un momento la tecla de salto o intenten saltar con el mouse, ya que como tenemos designado que se cambie el estado del juego a inGame con la tecla Enter, unity me reconoce el spacebar tambien como enter, por ende al orpimir la barra espaciadora el personaje salta y me cambia el estado del juego automaticamente.
<if
(GameManager.sharedInstance.currentGameState == GameState.inGame) // solo puede saltar si esta en modo juego
{
if (Input.GetButtonDown("Jump")) //condicional para que se ejecute metodo jump al oprimir espacio o click derecho
{
Jump();
}
}>
Para los que lo están viendo en Diciembre 2021 la ruta es
Edit > Project Settings > Input Manager
Saludos. Activé el brinco solo si el estado del Juego está en “inGame”:
void Update()
{
if (GameManager.sharedInstance.currentGameState == GameState.inGame) {
if (Input.GetButtonDown("Jump")) { // Input manager action
Jump();
}
}
animator.SetBool(STATE_ON_THE_GROUND, IsTouchingTheGround());
}
por que me pasa que cuando presiono space mi game state cambia a ingame??
En el caso de que se quiera usar movimiento tanto horizontal como vertical controlado por el usuario. se debe usar la palabra “Horizontal” y “vertical” y para saber si es movimiento positivo o negativo, se debe usar el metodo GetAxisRaw.
// movimiento a la derecha
if(Input.GetButton("Horizontal") && Input.GetAxisRaw("Horizontal") > 0)
// movimiento a la izquierda
if(Input.GetButton("Horizontal") && Input.GetAxisRaw("Horizontal") < 0)
// movimiento hacia arriba
if(Input.GetButton("Vertical") && Input.GetAxisRaw("Vertical") > 0)
// movimiento hacia abajo
if(Input.GetButton("Vertical") && Input.GetAxisRaw("Vertical") < 0)
Yo lo solucione de esta forma
//saltara solo si se presiona la tecla designada por unity para el salto y si estamos en modo juego
if (Input.GetButtonDown("Jump") && Gamemanager.ShareInstance.currentGameState == GameState.inGame)
{
Jump();
}```
arregle el bug apagando el rigidbody en vez de modificando su velocidad, de esta manera no se ve afectado por las fisicas
En mi caso al teclear la barra espaciadora se iba a inGame porque en el input manager en el segundo submit lo tiene configurado con esa tecla
PlayerController:
void Update()
{
// Se gestionan las animaciones arriba para evitar bugs visuales in-game
anim.SetBool(STATE_GROUNDED, IsGrounded());
anim.SetBool(STATE_WALKING, rigidBody.velocity.x != 0);
// Se invierte este if para mejorar la legibilidad y reducir la complejidad cognitiva
if (GameManager.sharedInstanceGM.currentGameState != GameState.inGame) return;
if (Input.GetButtonDown("Jump"))
{
Jump();
}
Debug.DrawRay(this.transform.position - new Vector3(0, playerCollider.size.y / 2, 0), Vector2.down * gndRaycastLenght, Color.red);
}
void FixedUpdate()
{
// Se invierte este if para mejorar la legibilidad y reducir la complejidad cognitiva
if (GameManager.sharedInstanceGM.currentGameState != GameState.inGame) return;
float xAxis = Input.GetAxis("Horizontal");
if (xAxis != 0)
{
Walk(xAxis);
}
}
Finalmente se edita el Input Submit para que no se ejecute al presionar la barra espaciadora.
A mi me sale un error al tratar de cambiar el GameState.
Me sale este error:
NullReferenceException: Object reference not set to an instance of an object
Player_controler.FixedUpdate () (at Assets/Scripts/Player_controler.cs:46)
¿Qué debo de hacer?
copie lo mismo del profesor
if (GameManager.sharedInstance.currentGameState == GameState.inGame)
{
if (Input.GetButtonDown("Jump"))
{
Jump();
}
}
De hecho, al ver el juego en la primera clase ya imaginé cómo hacer los botones de juego
Solo hay que añadirle este if:
if (GameManager.sharedInstance.currentGameState == GameState.inGame)
A la función de getButtonDown(“jump”)
esat es mi solucion para JUMP
void Jump()
{
if(GameManager.sharedInstance.currentGameState == GameState.inGame)
{
if (IsTouchingTheGround()) //dependiendo del valor regresado del metodo, si es true pasara al salto
{
playerRB.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
}
}
}```
El salto no debería estar en el FixedUpdate?
Para congelar el personaje en el aire al poner pausa usé rigidBody.Sleep() dentro del PlayerController
private void FixedUpdate()
{
if(GameManager.sharedInstance.currentGameState == GameState.inGame)
{
if (rigidBody.velocity.x < runningSpeed)
{
rigidBody.velocity = new Vector2(runningSpeed, rigidBody.velocity.y);
}
} else
{
rigidBody.Sleep();
}
}
if (Input.GetButtonDown("Jump") && GameManager.SharedInstance.currentGameState == GameState.inGame)
{
Jump();
}
Lo mejor es de momento usar otra tecla para saltar y no el Space, porque esa tecla aparece como secundaria para el argumento “Jump”, así que al presionarla siempre va a saltar e inmediatamente va a cambiar a estado inGame. Ya luego de cambiar la tecla de salto se puede poner la condición if(GameManager.sharedInstance.currentGameState == GameState.inGame)
Ya sea en la propia función Jump() o en el Update.
Si alguien quiere implementar un menú de pausa este vídeo esta muy bueno.
https://www.youtube.com/watch?v=JivuXdrIHK0
Activar el auto completado del MonoDevelop es muy util
Este es el codigo de este video:
void FixedUpdate()
{
if (GameManager.sharedInstance.currentGameState == GameState.inGame)
{
if (rigidBody.velocity.x < runningSpeed)
{
rigidBody.velocity = new Vector2 (runningSpeed, rigidBody.velocity.y);
}
} else {
rigidBody.velocity = new Vector2(0, rigidBody.velocity.y);
}
}

{
animator.SetBool(STATE_ON_THE_GROUND, IsTouchingTheGround());
animator.SetBool(STATE_FALLING, IsFalling());
if (GameManager.sharedInstance.currentGameState == GameState.inGame)
{
if(Input.GetButtonDown("Jump"))
{
jumpKey = true;
}
move = Input.GetAxis("Horizontal");
if (move > 0)
{
spriteRenderer.flipX = false;
animator.SetBool(STATE_RUNNING, true);
}
else if (move < 0)
{
spriteRenderer.flipX = true;
animator.SetBool(STATE_RUNNING, true);
}
else
{
animator.SetBool(STATE_RUNNING, false);
}
}
else
{
jumpKey = false;
move = 0f;
}
Aqui mi código en FixedUpdate
void FixedUpdate()
{
if (jumpKey)
{
Jump();
jumpKey = false;
}
rigidBody.velocity = new Vector2(move * runningSpeed, //x
rigidBody.velocity.y); //y
}
Yo le deshabilite el animator también por que no me gustaba que terminará la animación
rigidBody.Sleep();
animator.enabled = false;
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?