Puede descargar los activos utilizados en este tutorial de:
modelo de personaje 3D se ha creado usando Autodesk generador de caracteres
sprites 2D se me dio libre de Kennynl en Kenney • Tanques

Los archivos de origen tutoriales se encuentran aquí.
Hoy, vamos a hablar de raycasting. Para aquellos no familiarizados con el término raycasting, vamos a darle un poco de una explicación de lo que es antes de empezar.

Tabla de contenidos
convertirse en un desarrollador de juegos vr profesional con la unidad

Pre-Order The Complete Realidad Virtual desarrollo del juego con Unity y aprender a crear juegos y experiencias de inmersión mediante la construcción de 10 juegos de realidad virtual. El curso asume ninguna experiencia previa Unidad o VR – Te enseñaremos C #, la Unidad y la programación 3D de la tierra-para arriba

comprobarlo en Zenva Academia y obtener acceso temprano!

¿Qué es raycasting?

“raycasting es el proceso de disparar un rayo invisible desde un punto, en una dirección especificada para detectar si cualquier colisionadores yacían en la trayectoria del rayo.”
Esto es útil con los tiradores de desplazamiento lateral, fps, videojuego de disparos en tercera persona, infierno de balas, y los juegos de aventura pares. Ser capaz de dejar rastro, donde una bala o el láser va a viajar desde el principio hasta medios de acabado que sabemos exactamente cómo debe comportarse. Podemos ver físicamente y manipularlo en el mundo del juego.

raycasting en Unity3D se divide en dos partes bien diferenciadas, 2D y 3D. Ambos de los cuales son objetos de la física. Ellos tienen su propia documentación de los métodos que proporcionan; 3D y 2D respectivamente, sin embargo, ambos de los cuales utilizan el mismo objeto juego (el procesador de línea) para ambos juegos en 2D y 3D.

Introducción

Antes de empezar, vamos a crear un proyecto vacío 3D. Dado que este proyecto utilizará tanto en 2D como en 3D, es bastante sencilla para la conversión de 2D para una escena más adelante.

Crea 5 carpetas en total en el Activo carpeta. Modelos , Escenas y Scripts . Dentro de la carpeta de modelos, crear 2 carpetas llama Arte 2D y 3D Art .


Importar el arte en sus respectivas carpetas.


Ahora, crear y guardar escenas de 2. Nombrarlos 2D y 3D respectivamente.


Carga de la escena 2D y deja que comience la lección para raycasting en Unity3D para juegos 2D.

raycasting en 2D

Para empezar, retire la luz direccional. Hacemos clic en 2D en la vista de escena y cambiar la cámara de Perspectiva ortográfico.


El spritesheet tanque debe tener la tipo de textura situado en Sprite (2D y UI) y Modo de Sprite se define en Múltiple. Ahora selecciona solicite.


Haga clic en el Editor de Sprite y ahora podemos empezar a cortar el spritesheet en objetos de sprites individuales.

Haga clic en División . Se coge una pronta, vamos a mantener el tipo de sector a ser Automático y División en el menú. El último paso es hacer clic en Aplicar.


ejemplo de una imagen estática:

Se nos llevará de nuevo a la interfaz de usuario estándar de Unity3D. El spritesheet tanques tendrá muchos sprites individuales en el subsprite en tanks_spritesheetRetina . Vamos a utilizar tanks_spritesheetRetina_0 .


Arrastre el sprite que queremos utilizar en la vista de escena. La posición x debe ser -7.91 y la posición y debe ser 0,75.


componente complemento , el componente que desea agregar es un Línea Procesador . Línea Procesador se encuentra en Efectos .


Crear un script llamado TwoDRayCasting y adjuntarlo al objeto tanques. Asegúrese de que el Línea Procesador tiene un Ancho de 0,25


Ahora, podemos escribir nuestro código.
utilizando System.Collections; usando UnityEngine; TwoDRayCasting clase pública: {MonoBehaviour línea LineRenderer; Inicio private void () {line = gameObject.GetComponent (); line.enabled = false; } Private void Update () {if (Input.GetButtonDown ( «Fuego 1»)) {StopCoroutine ( «fireLazer»); StartCoroutine ( «fireLazer»); }} Privada IEnumerator fireLazer () {line.enabled = true; while (Input.GetButton ( «Fire1»)) {line.SetPosition (0, nuevo Vector3 (transform.position.x + .92f, transform.position.y + 0.41f)); line.SetPosition (1, nuevo Vector3 (transform.position.x + 10f, transform.position.y + 0.41f)); rendimiento nulo de retorno; } Line.enabled = false; }} 123456789101112131415161718192021222324252627282930313233343536usingSystem.Collections; usingUnityEngine; publicclassTwoDRayCasting: MonoBehaviour {line LineRenderer; privatevoidStart () {line = gameObject.GetComponent (); line.enabled = false;} privatevoidUpdate () {if (Input.GetButtonDown ( «fire1» )) {StopCoroutine ( «fireLazer»); StartCoroutine ( «fireLazer»);}} privateIEnumerator fireLazer () {line.enabled = true; while (Input.GetButton ( «Fire1»)) {line.SetPosition (0, newVector3 ( transform.position.x + .92f, transform.position.y + 0.41f)); line.SetPosition (1, newVector3 (transform.position.x + 10f, transform.position.y + 0.41f)); returnnull rendimiento;} line.enabled = false;.}}

Vamos a diseccionar el código para que sea mucho más comprensible
// Esto nos permite acceder a la línea LineRenderer componente Línea Renderizador; 12 // Esto nos permite acceder a la línea Línea Procesador componentLineRenderer; Inicio vacío privado () {// Desde el procesador de línea es un objeto privado, debemos hacer // seguro de que podemos acceder al componente más adelante. A fin de obtener el componente // para estar seguro. Línea = gameObject.GetComponent (); // Queremos que el LineRenderer es falsa para manipular manualmente // cuando se enciende y se apaga. line.enabled = false; } 12345678privatevoidStart () {// Desde el procesador de línea es un objeto privado, debemos hacer // seguro de que podemos acceder al componente más adelante. Así obtener la // componente a safe.line = gameObject.GetComponent (); // Queremos que el LineRenderer es falsa para manipular manualmente // cuando está encendido y off.line.enabled = false;} privada IEnumerator fireLazer () {// conjunto de la línea que se habilite al comienzo del método. line.enabled = true; // queremos que este código único trabajo, mientras que la condición es verdadera. // En este caso, se construyó en el ratón 0 evento click. mientras que (Input.GetButton ( «Fuego 1»)) {// posición Conjunto para la línea. Se necesita un índice y posición Vector3. // Hemos establecido que el índice sea 0, ya que es el primero en la matriz. // Establecemos el vector 3 x ser del tanque y la posición y + un desplazamiento. // Dado que estamos trabajando en 2D, no necesitamos un valor para Z por lo que se asume como 0. // line.SetPosition (0, nuevo Vector3 (transform.position.x + .92f, transform.position. y + 0.41f)); line.SetPosition (1, nuevo Vector3 (transform.position.x + 10f, transform.position.y + 0.41f)); // próxima declaración de rendimiento nos. ¿Por qué? Debido a que funciona de manera diferente de la manera estándar en C #. // La sentencia yield es un tipo especial de retorno, que asegura que la función comenzará a partir de la línea después de la sentencia yield próxima vez que se llama. rendimiento nulo de retorno; } // próxima desactivamos la línea de nuevo. line.enabled = false; } 12345678910111213141516171819202122232425privateIEnumerator fireLazer () {// establecer la línea esté habilitado en el inicio de la method.line.enabled = true; // queremos que este código único trabajo, mientras que la condición es true.// En este caso se trata del construido en el ratón 0 clic event.while (Input.GetButton ( «Fuego 1»)) {// posición Conjunto para la línea. Se necesita un índice y Vector3 position.// Hemos establecido que el índice sea 0, ya que es el primero en el array.// Hemos establecido el vector de 3 a ser x e y la posición del depósito + un offset.// Como nos están trabajando en 2D, no necesitamos un valor para Z lo que se supone // para ser 0. line.SetPosition (0, newVector3 (transform.position.x + .92f, transform.position.y + 0.41f)) ; line.SetPosition (1, newVector3 (transform.position.x + 10f, transform.position.y + 0.41f)); // próxima declaración de rendimiento nos. ¿Por qué? . Debido a que funciona de manera diferente de la manera estándar en C # // La sentencia yield es un tipo especial de retorno, que asegura que la función comenzará a partir de la línea después de la sentencia yield próxima vez que se called.yield returnnull;} // próxima desactivamos la línea again.line.enabled = false;} actualización de private void () {// Sólo queremos la línea de render cuando se pulsa el botón de disparo. si (Input.GetButtonDown ( «Fuego 1»)) {// vigilará para asegurarse de que la línea no está encendida y apagarla si es StopCoroutine ( «fireLazer»); // a su vez en la línea. StartCoroutine ( «fireLazer»); }} 1234567891011privatevoidUpdate () {// Sólo queremos la línea de hacer cuando el botón de disparo es pressed.if (Input.GetButtonDown ( «Fuego 1»)) {// vigilará para asegurarse de que la línea no está encendida y apagarla si que isStopCoroutine ( «fireLazer»); // a su vez en el line.StartCoroutine ( «fireLazer»);}}

Pulse el botón de reproducción y probarlo. Para controlar el láser, presione el botón izquierdo del ratón.

Animación 2D ejemplo:

El siguiente, vamos a crear una animación horrible y hacer lo raycasting con él. Multi clic en las imágenes número 0, 1, 5 y 6; Arrastre en el lienzo. Se abrirá una parada rápida. Me quedé con el nombre como nueva animación y se guarda en la carpeta de arte 2D.


La posición del nuevo tanque debe ser -7,91, -0,3, 0. Añadir el componente Line Renderizador y cambiar la anchura de la línea de renderer a 0,25.


Una el script para el tanque como antes.


ejecutarlo, prepararse para una crisis epiléptica de la animación.

raycasting en 3D

Ahora podemos llegar a la parte Sé que ustedes han estado esperando siempre tan pacientemente, raycasting 3D. Éste es un poco más complicado, pero no mucho más complicado. Voy a ir más raycasting como si estuviera construyendo un juego de plataformas de desplazamiento lateral con el rodaje mecánica y un shooter en primera persona en el que disparar una ráfaga como que están construyendo un cómic / juegos de anime héroe.

En primer lugar en el tajo es que vamos a escribir el guión, tanto para el desplazamiento lateral y el modo de primera persona. Sé que es un cambio en el ritmo de cómo hago las cosas con normalidad, que hará que sea mucho más fácil para mostrar las tareas rutinarias de unir los objetos del juego vacías y una instancia del procesador de manera apropiada.

Las secuencias de comandos:

secuencia de comandos de desplazamiento lateral
utilizando System.Collections; usando System.Collections.Generic; usando UnityEngine; ThreeDRayCastingSideScrollMode clase pública: {MonoBehaviour línea LineRenderer; Inicio private void () {line = gameObject.GetComponent (); line.enabled = false; } Privada IEnumerator FireShot () {line.enabled = true; while (Input.GetButton ( «Fire1»)) {Ray ray = new Ray (transform.position, transform.right); line.SetPosition (0, ray.origin); line.SetPosition (1, ray.GetPoint (-10) * .24f); rendimiento nulo de retorno; } Line.enabled = false; } Private void Update () {if (Input.GetButtonDown ( «Fuego 1»)) {StopCoroutine ( «FireShot»); StartCoroutine ( «FireShot»); }}} 12345678910111213141516171819202122232425262728293031323334353637383940usingSystem.Collections; usingSystem.Collections.Generic; usingUnityEngine; publicclassThreeDRayCastingSideScrollMode: MonoBehaviour {line LineRenderer; privatevoidStart () {line = gameObject.GetComponent (); line.enabled = false;} privateIEnumerator FireShot () {line .enabled = true; while (Input.GetButton ( «Fire1»)) {Ray ray = NewRay (transform.position, transform.right); line.SetPosition (0, ray.origin); line.SetPosition (1, ray. GetPoint (-10) * 24f);. returnnull rendimiento;} line.enabled = false;} privatevoidUpdate () {if (Input.GetButtonDown ( «Fire1»)) {StopCoroutine ( «FireShot»); StartCoroutine ( «FireShot») ;}}}

Aviso la única diferencia entre este guión y el guión 2D es que estamos utilizando SetPosition en un contexto diferente al de la versión 2D. Vamos a echar un vistazo más de cerca a lo que estamos haciendo con éste.
Ray ray = nuevo Ray (transform.position, transform.right); 1Ray ray = NewRay (transform.position, transform.right); line.SetPosition (0, ray.origin); line.SetPosition (1, ray.GetPoint (-10) * .24f); 12line.SetPosition (0, ray.origin); line.SetPosition (1, ray.GetPoint (-10) * 24f.);

ray.origin es el punto en el que se origina ray.
ray.GetPoint devuelve un punto en unidades de distancia a lo largo del camino.

Hemos establecido el Ray para ser sede fuera de la posición transform del objeto que atribuimos a, y la dirección es hacia la derecha de la transformación del objeto adjunto. Hemos establecido el primer elemento de la matriz a estar en el punto de origen para el rayo. Hemos establecido el segundo elemento del rayo a ser un punto específico multiplicado por un número arbitrario para la manipulación de la curva de base de la ubicación del modelo y la ubicación.
utilizando System.Collections; usando System.Collections.Generic; usando UnityEngine; ThreeDRayCastingFirstPersonMode clase pública: {MonoBehaviour línea LineRenderer; Inicio private void () {line = gameObject.GetComponent (); line.enabled = false; } Privada IEnumerator FireShot () {line.enabled = true; while (Input.GetButton ( «Fire1»)) {Ray ray = nuevo Ray (transform.position, Vector3.forward); line.SetPosition (0, ray.origin); line.SetPosition (1, ray.GetPoint (100)); rendimiento nulo de retorno; } Line.enabled = false; } Private void Update () {if (Input.GetButtonDown ( «Fuego 1»)) {StopCoroutine ( «FireShot»); StartCoroutine ( «FireShot»); }}} 12345678910111213141516171819202122232425262728293031323334353637383940usingSystem.Collections; usingSystem.Collections.Generic; usingUnityEngine; publicclassThreeDRayCastingFirstPersonMode: MonoBehaviour {line LineRenderer; privatevoidStart () {line = gameObject.GetComponent (); line.enabled = false;} privateIEnumerator FireShot () {line .enabled = true; while (Input.GetButton ( «Fire1»)) {Ray ray = NewRay (transform.position, Vector3.forward); line.SetPosition (0, ray.origin); line.SetPosition (1, ray. GetPoint (100)); returnnull rendimiento;} line.enabled = false;} privatevoidUpdate () {if (Input.GetButtonDown ( «Fire1»)) {StopCoroutine ( «FireShot»); StartCoroutine ( «FireShot»);}}}

a continuación tenemos el guión fps, que trabaja con primera / tercera / y de arriba hacia abajo puntos de vista.
Ray ray = new Ray (transform.position, Vector3.forward); 1Ray ray = NewRay (transform.position, Vector3.forward); line.SetPosition (1, ray.GetPoint (100)); 1line.SetPosition (1, rayo .GetPoint (100));

también establece el rayo estar basada fuera de la posición de la transformada del objeto que está unido a, y también establece la dirección para ser hacia adelante. Tan sólo hay que poner el punto a ser de 100 unidades de distancia del punto de origen.

Uf, ahora que todo eso está fuera del camino, podemos comenzar a construir la escena.

Side Escena de desplazamiento

exención de responsabilidad: He creado una casa prefabricada que ya ha modificado el modelo de la T-pose a la pose que queremos usar para esta parte de la lección. Otra lección adelante en el camino va a hablar más en profundidad acerca de las animaciones de modelos 3D dentro de la unidad y cómo construirlos.

Para empezar, crear una nueva escena llamada 3DSideScroll.


La cámara principal debe estar en el modo Perspectiva con una posición de 0, 0,33, -3,38 para este ejemplo. A pesar de que puede y debe hacer el modo ortográfico.


Ahora vamos a importar el prefabricada que he creado para esta parte de la lección en la escena.
Su posición debe ser -3.26, -1.15, 0. También debe tener una rotación de 0,75,0.


Añadir el guión ThreeDRayCastingSideScrollMode al personaje. Navegué en la jerarquía del personaje, todo el camino a la derecha.


Esta es la parte divertida, la adición de un procesador de línea al personaje. Asegúrese de que la caja para el procesador de línea no está marcada. Exactamente debajo de donde se une el guión es donde voy a colocar el procesador. Asegúrese de que el ancho de la línea es de 0,05 Procesador (aunque se puede jugar con la anchura hasta que encuentre uno que le guste más).


Me puso el Procesador de línea y del script en el lado derecho de la casa prefabricada, ya que es la trayectoria Quiero que el procesador de la línea a seguir. Fácilmente se podría poner el procesador de línea en un objeto de juego vacía en un lugar de su elección y llevar a cabo la misma hazaña. La forma en que lo hizo permite que el motor para encontrar dónde está el punto de partida para el procesador de línea se basa en la ubicación del carácter sin necesidad de código adicional.

Puede ejecutar la escena y probarlo por ti mismo ahora.

3D Escena

En este ejemplo, voy a hacer las dos primera persona y tercera persona sobre el hombro vista.

tercera persona por la espalda

Empecemos con la tercera persona sobre la opinión del hombro. La razón de esto es porque todo lo que necesitamos hacer para modificar ésta a la primera persona está literalmente cambiando la posición del modelo de personaje.

Una vez más, ya he creado una casa prefabricada del modelo, ya que he cambiado desde la T representan para la pose que desee mediante las articulaciones dentro de la unidad.

Carga de la escena 3D para empezar.


Añadir el prefabricada a la escena y ajusta la posición del modelo a -0.22, -1.36, 0.


Una vez más, he añadido el procesador de línea con un ancho de 0,15 y el guión ThreeDRayCasting al índice de la mano derecha 1 dentro de la jerarquía del modelo.



Puede ejecutar la escena y probarlo por ti mismo ahora. Que no era demasiado duro con 3D tercera persona sobre el hombro vista era? Ahora, vamos a ir a la vista en primera persona.

primera persona Ver

En realidad, la única diferencia entre la 3ª persona Vista por la espalda y la primera opinión de la persona realmente es la posición del carácter y un cambio muy menor a la propia cámara.

Para empezar, vaya a la cámara principal. Cambiar el plano de recorte de cerca de 0,12.


A continuación, cambie la posición del modelo. Puede jugar con él hasta que encuentre lo que te gusta, fui con un simple 0, -0.28, -3.44. Tiene que la vieja escuela FPS tacto con cómo se ve, otorgada sin el material de interfaz de usuario o el hecho de que no hay arma en este ejemplo.


Puede ejecutar la escena y probarlo por ti mismo ahora.

Consideraciones finales

Como se puede ver, la creación de Renderizadores Line es una tarea muy sencilla que se puede realizar con bastante rapidez y eficacia. Estos pueden tomar el lugar de efectos de partículas y actuar como un rayo láser, rifle láser, y muchas cosas más. Ellos trabajan muy bien con la física y otros efectos.

Con todo, creo que fue muy digno de él para mostrarle algunas cosas muy importante que usted podría hacer con la línea Renderizadores porque nunca se sabe, se les pueda necesitar en algún momento en el futuro.

espero que este tutorial ayudó a aprender algo nuevo y te verá toda la próxima vez. Que su código de estar limpia y libre de errores. Te voy a atrapar en el siguiente tutorial.

Mensajes relacionados

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *