En tutoriales anteriores creamos el protagonista de un juego FPS con primitivas; en una pequeña superficie rodeada de muros por donde podía desplazarse y reaccionar a colisiones.
Hoy explicaremos como añadir al player la funcionalidad de disparar mediante la creación de un script en C#.
Todas las partes del tutorial: Tutorial Unity 3D
Disparar en Unity
A la hora de disparar usaremos la técnica Raycast (Emisión de rayos). Este sistema consiste básicamente en la proyección de un rayo desde la cámara hacia un punto de la pantalla para determinar si ha colisionado con algún objeto por el camino.
Empezaremos por desarrollar un script en C# “RayCamera”, que añadiremos a la cámara del player. Al inicio creamos una variable de tipo Camera “cam”. En el método Start() accedemos al componente cámara con GetComponent<>.
private Camera cam; void Start() { cam = GetComponent<Camera>(); }
Dentro del método Update escuchamos la interacción del usuario con el botón izquierdo del ratón (Input.GetMouseButtonDown(0)). Definimos un Vector que representa un punto en el centro de la pantalla. Y con el método ScreenPointToRay() de la cámara creamos un rayo a través de esa posición.
A Physics.Raycast(ray, out hit) le pasamos el rayo y un objeto RaycastHit , este último guardará información de lo que el rayo ha interceptado.
Si el rayo ha detectado algo lanzamos StartCoroutine() pasándole el método MarkBullet()con la posición del impacto.
void Update() { if (Input.GetMouseButtonDown(0)){ Vector3 halfScreen = new Vector3(cam.pixelWidth / 2, cam.pixelHeight / 2, 0); Ray ray = cam.ScreenPointToRay(halfScreen); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { StartCoroutine(MarkBullet(hit.point)); } } }
MarkBullet crea una esfera en el lugar donde colisionó el disparo. La palabra clave yield pausa el método y cede el control al método Update. Una vez retomado el control eliminamos la esfera y limpiamos su memoria con Destroy().
private IEnumerator MarkBullet(Vector3 point) { GameObject bullet = GameObject.CreatePrimitive(PrimitiveType.Sphere); bullet.transform.position = point; yield return new WaitForSeconds(0.5f); Destroy(bullet); } }
Ocultar el cursor del ratón
Finalmente bloqueamos el puntero del ratón en el centro de la pantalla y también lo ocultamos. De este modo no nos molesta a la hora de jugar. Para salir del modo juego deberás presionar la tecla escape.
void Start() { ... Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; ...
Código completo
El archivo RayCamera.cs que añadimos a la cámara del player:
public class RayCamera : MonoBehaviour { private Camera cam; void Start() { cam = GetComponent<Camera>(); Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; } void Update() { if (Input.GetMouseButtonDown(0)){ Vector3 halfScreen = new Vector3(cam.pixelWidth / 2, cam.pixelHeight / 2, 0); Ray ray = cam.ScreenPointToRay(halfScreen); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { StartCoroutine(MarkBullet(hit.point)); } } } private IEnumerator MarkBullet(Vector3 point) { GameObject bullet = GameObject.CreatePrimitive(PrimitiveType.Sphere); bullet.transform.position = point; yield return new WaitForSeconds(0.5f); Destroy(bullet); } }
4 comentarios
John · 25 de julio de 2022 a las 08:57
Muy agradecido con su tutorial. Porque saldra un error en la linea del cam = GetComponent();?
Admin · 17 de noviembre de 2022 a las 20:49
Un fallo del editor de texto. Corregido.
Dariel · 1 de marzo de 2024 a las 07:19
Me pasa que puse en la programación
Input.GetkeyDown.(Keycode.mouse0);
newbullet;
newbullet.intiation(newbullet,spawpoint, spawpoint.rotation);
Me dispara pero no puedo hacer nada con el mouse dispara como si fuera una manguera pinchada.
kevin · 3 de enero de 2024 a las 23:10
Mira Como Cambio La Esfera Por una imagen de disparo y le pongo sonido a la pistola