En esta sección Understanding the View Frustum, fue explicado que cualquier punto en la vista de la cámara corresponde a una linea en el espacio del mundo. Algunas veces es útil tener una representación matemática de esa linea y Unity puede provee esto en la forma de un objeto Ray. El Rayo siempre corresponde a un punto de la vista, entonces la clase de la cámara proporciona las funciones ScreenPointToRay y ViewportPointToRay. La diferencia entre las dos es que ScreenPointToRay espera que el punto sea proporcionado como una coordenada de píxel, mientras que ViewportPointToRay toma unas coordenadas normales en el rango 0..1 (dónde 0 representa la parte inferior o izquierda y 1 representa la parte superior o derecha de la vista). Cada una de estas funciones devuelve un Rayo que consiste en un punto de origen y un vector que muestra las direcciones de la linea desde ese origen. El Rayo se origina desde el plano cercano de recrote en vez del punto transform.position de la Cámara.
El uso más común de un Rayo de la cámara es realizar un raycast afuera a la escena. Un raycast manda un “laser beam” imaginario junto el rayo desde su origen hasta que le pega a un collider en la escena. Una información luego es devuelta acerca del objeto y el punto que fue pegado en una objeto RaycastHit. Esto es una manera muy útil para ubicar un objeto basado en su imagen de pantalla. Por ejemplo, el objeto en la posición del mouse puede ser determinado con el siguiente código:-
_Ejemplo de un C# script
using UnityEngine;
using System.Collections;
public class ExampleScript : MonoBehaviour {
public Camera camera;
void Start(){
RaycastHit hit;
Ray ray = camera.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit)) {
Transform objectHit = hit.transform;
// Do something with the object that was hit by the raycast.
}
}
}
Ejemplo de un JS script
var hit: RaycastHit;
var ray: Ray = camera.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, hit)) {
var objectHit: Transform = hit.transform;
// Do something with the object that was hit by the raycast.
}
A veces es útil obtener un rayo correspondiente a una posición de pantalla y luego mover la cámara a lo largo de ese rayo. Por ejemplo, usted puede querer permitirle al usuario seleccionar un objeto con el mouse y luego acercársele mientras lo mantenga “pinned” a la misma posición de pantalla bajo el mouse (esto puede ser útil cuando la cámara está viendo un mapa táctico). El código para hacer esto es bastante sencillo:-
_Ejemplo de un C# script
using UnityEngine;
using System.Collections;
public class ExampleScript : MonoBehaviour {
public bool zooming;
public float zoomSpeed;
public Camera camera;
void Update() {
if (zooming) {
Ray ray = camera.ScreenPointToRay(Input.mousePosition);
float zoomDistance = zoomSpeed * Input.GetAxis("Vertical") * Time.deltaTime;
camera.transform.Translate(ray.direction * zoomDistance, Space.World);
}
}
}
Ejemplo de un JS script
var zooming: boolean;
var zoomSpeed: float;
if (zooming) {
var ray: Ray = camera.ScreenPointToRay(Input.mousePosition);
zoomDistance = zoomSpeed * Input.GetAxis("Vertical") * Time.deltaTime;
camera.transform.Translate(ray.direction * zoomDistance, Space.World);
}