Detección de objetos usando rayos
Unity ray (Rayo) detecta colisionadores o disparadores emitiendo un rayo. Los objetos sin componentes colisionadores no se pueden detectar, y el activador de detección se puede cancelar en la configuración física (Editar → Configuración del proyecto → Física/Physics2D).
Physics.Raycast (origen, dirección, out hitInfo, distancia, máscara)
origen: la posición de emisión del rayo;
dirección: La dirección de emisión del rayo.
hitInfo: información sobre el objeto golpeado por el rayo;
distancia: distancia del rayo, por defecto significa distancia infinita;
máscara: máscara de rayos, que indica qué capa se detecta y los medios predeterminados para detectar todas las capas. La forma de este parámetro es obligatoria:
método uno:
int shootableMask = LayerMask.GetMask("Shootable");
Physics2D.Raycast(Ray, out hitInfo, range, shootableMask);
Método dos:
int layerNumber;
(1 << layerNumber) //只检测编号为 layerNumber 的层
~(1 << layerNumber) //不检测编号为 layerNumber 的层,其余的层都检测
(1 << layerNumber) | (1 << layer2Number) //只检测 2 个层
RaycastHit: almacena la información de colisión después de emitir rayos
Variables miembro de uso común:
colisionador : el colisionador que choca con el rayo;
transform : la Transformada del colisionador que colisionó con el rayo;
distancia: la distancia desde el punto de partida del rayo hasta el punto de intersección del rayo y el colisionador;
normal: el vector normal del plano incidente del rayo;
punto: Las coordenadas del punto de intersección del rayo y el colisionador.
Uso común
- emitir un rayo desde la cámara en la dirección del ratón;
- Obtener la información de colisión del rayo;
- Obtenga el objeto que choca y manipule el objeto.
ejemplo de código
Ray myRay = Camera.main.ScreenPointToRay(Input.mousePosition);//从摄像机发出一条射线
RaycastHit2D hit = Physics2D.Raycast(new Vector2(myRay.origin.x, myRay.origin.y), Vector2.zero);//射线从鼠标点击屏幕的那个点出发,射到以当前点击位置为原点的坐标系中的垂直于(0,0)的位置,
if (hit.collider)//如果碰到有Collider2D组件的物体,找到该物体
{
Debug.Log(hit.transform.name);//打印出碰撞到的节点的名字
GameObject obj = GameObject.Find(hit.transform.name);
}
//通过 obj 来操作物体