¿Cómo calibramos los controles del mouse en Unity?
La calibración y gestión adecuada del mouse en Unity son elementos esenciales para garantizar una experiencia de usuario fluida y personalizada. A través del código en Unity, podemos ajustar cómo se reciben y procesan los movimientos del mouse. Esto es particularmente útil cuando se desarrollan juegos o aplicaciones inmersivas en 3D. Empezamos configurando la sensibilidad del mouse, que puede ser ajustada al gusto del jugador gracias a la creación de interfaces de usuario (UI), posibilitando una experiencia adaptada y personalizada.
¿Qué papel juega el componente 'transform' en Unity?
El juego de transformaciones es vital en el desarrollo de videojuegos, especialmente en Unity, ayudando a manejar los movimientos y rotaciones de los objetos en 3D. El componente transform es una poderosa herramienta que nos permite manipular la posición, rotación y escala de los objetos dentro del espacio tridimensional del juego. Es fundamental para mover o rotar la cámara y para desplazar a los personajes, haciendo que todo se sienta natural y responda correctamente a las interacciones del jugador.
En el ejemplo anterior, utilizamos Input.GetAxis para obtener la posición del mouse y su transformación en el eje 'X', lo que posteriormente permite rotar al personaje o cámara.
¿Cómo funciona Input.GetAxis en Unity?
Unity facilita el manejo de entradas de usuario a través de la función Input.GetAxis, que nos entrega un valor que representa el movimiento en un eje específico, sin tener que implementar manualmente cálculos sobre el desplazamiento del mouse. Esto es extremadamente valioso porque Unity se encarga del cálculo del desplazamiento del mouse, ahorrándonos la necesidad de crear funciones personalizadas para identificar la posición del mouse y cuánto se ha movido.
¿Qué es el clamping y cómo se aplica en las rotaciones?
El clamping es una técnica utilizada para limitar los valores de una variable dentro de un rango específico. En el contexto de rotaciones en Unity, es útil para evitar que la cámara gire demasiado y rompa la ilusión de realidad visual del entorno. Específicamente, en nuestro ejemplo, ajustamos la rotación de la cámara para asegurarnos de que se mantenga dentro de un rango adecuado, como de -90 a 75 grados.
¿Cómo se enlaza un 'script' al 'player' en Unity?
Para permitir que el script funcione correctamente, es necesario arrastrarlo al objeto deseado en el entorno Unity. Primero, aseguramos que nuestra cámara está adeudamente ubicada dentro del objeto 'player'. Luego, arrastramos el script hacia nuestro 'player', confirmando que el componente transform requerido esté vinculado.
Tip: Uso del candado en el inspector
Para facilitar la gestión de elementos en Unity y prevenir cambios no deseados mientras navegamos por el inspector, podemos utilizar el ícono de candado. Esto permite bloquear el inspector en el elemento actual sin alterar las configuraciones actuales mientras cambiamos entre distintos objetos del ambiente.
¿Cómo solucionamos un error de rotación en el eje Y?
Encontrar y solucionar errores de lógica en el código es fundamental. Uno de los errores comunes es la incorrecta aplicación de operaciones aritméticas al calcular las rotaciones. En este caso, detectamos un error en la función que calcula el desplazamiento de la cámara en el eje Y debido a una operación incorrecta. Tras corregir la ecuación, probamos el comportamiento en Unity y verificamos que ahora la rotación lateral sea correcta y fluida.
Con estas correcciones, la experiencia visual del juego se mejora, y el jugador puede explorar su entorno debidamente sin sufrir problemas visuales o de control.
¿Qué sigue después de configurar la cámara y el mouse?
El siguiente paso lógico en el desarrollo del juego es programar el movimiento básico del personaje: adelante, atrás, izquierda y derecha. Este movimiento crea la base del movimiento del personaje en cualquier entorno de juego. Posteriormente, se avanzará a programar elementos interactivos como disparos y enemigos, integrando aún más elementos que harán el juego dinámico y emocionante para el jugador.
Con todo lo que hemos abordado, es evidente que ya estás en el camino correcto al explorar el mundo de la programación en Unity. ¡Sigue adelante con curiosidad y entusiasmo, y observa cómo tus ideas cobran vida en el mundo virtual!
La clase anterior lo vimos. pero algo de programación . en cualquier lenguaje lo tenes los que derivan de c. vas a tener que repasar programación básica.
Amo que siempre repasemos las cosas (como en los if, si solo es una línea de código, se pueden omitir los "{ }", a veces se me olvida)
Espero que no se tome a mala interpretación la imagen
Un consejo para encontrar y solucionar errores más fácilmente:
Tenia este error Assets\Scripts\Mira.cs(26,62): error CS1003: Syntax error, ',' expected.
Para encontrar el fallo simplemente hay que fijarse en los números dentro del paréntesis (26,62).
El primer número indica la línea donde se encuentra el error, que en este caso es la línea 26.
El segundo número muestra el caracter donde esta el error, que es el caracter 62.
Espero les sirva :)
Muchas Gracias es super útil :D
Me sucedía que no podía girar a los lados a pesar de tener el código igual y de probar el código que mis compañeros compartían. Estuve probando y me di cuenta que con la misma función de localRotation se puede lograr el mismo resultado, sin embargo hay que crear otra variable de rotación. aquí les dejo el código de como me quedo:
using System.Collections;using System.Collections.Generic;using UnityEngine;publicclassmira:MonoBehaviour{public float Sensitivity=0.1f;publicTransform player1; float xRotation = 0f; float yRotation = 0f;// Start is called before the first frame updatevoidStart(){Cursor.lockState=CursorLockMode.Locked;}// Update is called once per framevoidUpdate(){ float mouseY =Input.GetAxis("Mouse Y")*Sensitivity; float mouseX =Input.GetAxis("Mouse X")*Sensitivity; xRotation -= mouseY; yRotation += mouseX; xRotation =Mathf.Clamp(xRotation,-90f,75f); transform.localRotation=Quaternion.Euler(xRotation,yRotation,0f);}}
Estuve buscando por todos lados y no encontraba por qué podría ser ese problema. Mil gracias!
Cuando le damos a play el cursor desaparece debido a la instrucción que le dimos en el script, para que vuelva a aparecer solo presiona la tecla esc
La computadora de Ricardo parece ser muy bueno, pero en los videos parece que se le traba un poco, ¿Si se le traba un poco o es una falsa percepción mía?
Cuando usas un motor 3D junto con un programa que te grabe la pantalla es normal que suceda eso, pues genera una sobrecarga de memoria.
Gracias por la aclaración!
Un aporte pequeño :
Si van a Edit > Project settings > Input manager > Axes pueden ver los inputs que tenemos disponibles , aquie es de donde tomamos "Mouse X" y "Mouse Y". :D
using System.Collections;using System.Collections.Generic;using UnityEngine;publicclassMira:MonoBehaviour{public float Sensitivity= 100f;publicTransform player1; float xRotation = 0f;// Start is called before the first frame updatevoidStart(){//Cursor.lockState=CursorLockMode.Locked;//bloquea el cursor al centro de la ventana del juego }// Update is called once per framevoidUpdate(){ float mouseX =Input.GetAxis("Mouse X")*Sensitivity*Time.deltaTime;// float mouseY =Input.GetAxis("Mouse Y")*Sensitivity*Time.deltaTime; xRotation -= mouseY; xRotation =Mathf.Clamp(xRotation,-90f, 75f); transform.localRotation=Quaternion.Euler(xRotation, 0f, 0f);//Quaternion se ocupa para almacenar rotaciones player1.Rotate(Vector3.up* mouseX);}}```
Corregí todo, puedo mover la cámara pero solo para arriba y para abajo (en el eje X) :( no puedo ir a los costados.
hola Franco! debe ser un typo en tu código
podrías bajarte el mío y comparar?
Hola María! al final pude corregirlo, estuve renegando tanto con esos errores que despuúes (este error que comenté arriba) era porque no arrastré al player al script para que tome el transform. Vos pudiste hacerlo funcionar a la primera? Ya terminé el curso y lo aprobé.
Porque cuando le doy play, la camara queda mirando para arriba? por ejemplo acomodo la camara en Scene (sin el boton de play activado) y cuando le doyu play la camara gira 180 grados
me parece esto al arrastrar
Creo que eso pasa cuando crear un archivo y lo llamas de una manera y luego lo renombras.Trata de crearlo otra vez y fijate que el nombre de tu archivo es el mismo con el que te refieres a él dentro de tu código.
tambien me pasa
por favor ayudenmeee nose poque no puedo moverlo para los costados auxilio ?
🟢 Hello!
¿Podrías subir una captura de pantalla para guiarte de una manera precisa? 🤗
Un abrazo de gol! 🦾
eddie10 muchisimas gracias estaba esperando q alguien me pudiera ayudar
using System.Collections;using System.Collections.Generic;using UnityEngine;publicclassMira:MonoBehaviour{//sensibilidad de la mira del mousepublic float Sensitivity= 100f;//Transform clase de unity nos permite desplazar el personajepublicTransform player1;//guardamos nuestros movimientos en el eje x float xRotation = 0f;// Inicia la primera escenavoidStart(){Cursor.lockState=CursorLockMode.Locked;//bloquea el cursor para que siempre este en el centro de la camara}// se actualiza por cada framevoidUpdate(){//el tiempo que ha ocurrido desde el cuadro anterior float mouseX =Input.GetAxis("Mouse X")*Sensitivity*Time.deltaTime;//input.GetAxis siempre recuperara donde esta elmouse float mouseY =Input.GetAxis("Mouse Y")*Sensitivity*Time.deltaTime;//xRotation = xRotation - mouseY nos trae la rotacion de el eje y xRotation -= mouseY;//que tanto sube la camara o baja xRotation =Mathf.Clamp(xRotation,-90f, 75f);//limites para el mouse//Quaternion se ocupa para almacenar rotaciones transform.localRotation=Quaternion.Euler(xRotation, 0f, 0f);//rotacion horizontal player1.Rotate(Vector3.up* mouseX);//va directo al player1 que se encarga de rotar}};
Hola, estoy intentando que la camara gire de izquierda a derecha pero se queda trabada. Es como que el clamp estuviera afectando el giro. Alguien sabe el ¿por qué?
using System.Collections;using System.Collections.Generic;using UnityEngine;publicclassMira:MonoBehaviour{//sensibilidad de la mira del mousepublic float Sensitivity= 100f;//Transform clase de unity nos permite desplazar el personajepublicTransform player1;//guardamos nuestros movimientos en el eje x float xRotation = 0f;// Inicia la primera escenavoidStart(){Cursor.lockState=CursorLockMode.Locked;//bloquea el cursor para que siempre este en el centro de la camara}// se actualiza por cada framevoidUpdate(){//el tiempo que ha ocurrido desde el cuadro anterior float mouseX =Input.GetAxis("Mouse X")*Sensitivity*Time.deltaTime;//input.GetAxis siempre recuperara donde esta elmouse float mouseY =Input.GetAxis("Mouse Y")*Sensitivity*Time.deltaTime;//xRotation = xRotation - mouseY nos trae la rotacion de el eje y xRotation -= mouseY;//que tanto sube la camara o baja xRotation =Mathf.Clamp(xRotation,-90f, 75f);//limites para el mouse transform.localRotation=Quaternion.Euler(xRotation, 0f, 0f);//rotacion horizontal player1.Rotate(Vector3.up* mouseX);//va directo al player1 que se encarga de rotar}}
Esto cada vez se pone mejor.
Muy buen repaso y corrección de Bug. A Ricardo Izquierdo le hubiera gustado mucho esta clase.
using System.Collections;using System.Collections.Generic;using UnityEngine;publicclassMouse:MonoBehaviour{public float Sensitivity= 100f;publicTransform player1; float xRotation = 0f;// Start is called before the first frame updatevoidStart(){Cursor.lockState=CursorLockMode.Locked;}// Update is called once per framevoidUpdate(){ float mouseX =Input.GetAxis("Mouse X")*Sensitivity*Time.deltaTime; float mouseY =Input.GetAxis("Mouse Y")*Sensitivity*Time.deltaTime; xRotation -= mouseY; xRotation =Mathf.Clamp(xRotation,-90, 75f); transform.localRotation=Quaternion.Euler(xRotation, 0f, 0f); player1.Rotate(Vector3.up* mouseX);}}
no se si es por la version de unity pero segun unity "TIME" does not contain a definition for "deltatime"
Si estas viendo el curso en versiones nuevas de unity no utilices lo que sale en la clase, es algo mas antiguo, tuve problemas con eso y esta fue la solucion:
Desde Unity 2020.1 el uso de Input.GetAxis() quedó como algo viejo (legacy), antes se leía el mouse así float mouseX = Input.GetAxis("Mouse X"), lo que dependía del Input Manager y podía fallar si el eje no existía, mientras que ahora se usa el New Input System, leyendo el movimiento real del mouse con Vector2 mouseDelta = Mouse.current.delta.ReadValue(), y aplicando la sensibilidad de forma directa, por ejemplo float mouseX = mouseDelta.x * mouseSensitivity * Time.deltaTime, lo que da más control, precisión y menos errores en proyectos modernos,
No utilizo unity hace mucho, pero solía pasarme a veces que se me rompía la metadata de los objetos y por ejemplo se desasignaban los transform de los scripts. Por lo que a la larga termine asignando todo por código directamente(buscando por tag por ej). Quería saber si esto es correcto hacerlo así, o hay una mejor manera?
Es correcto asignar los transform de los objetos por código si la metadata se rompe con frecuencia. Otra opción es utilizar referencias directas a los objetos en lugar de buscar por tag, lo cual puede ser más eficiente.