我一开始是在一个高亮脚本里面看到的射线检测
example1
if(Input.GetMouseButtonDown(0)) {
var ray = Camera.main.ScreenPointToRay(Input.mousePosition);//鼠标的屏幕坐标转化为一条射线
RaycastHit hit;
//距离为5
//if(Physics.Raycast(ray, out hit, 5)) {
// var hitObj = hit.collider.gameObject;
// Debug.Log(hitObj);
//}
//无距离限制
if(Physics.Raycast(ray, out hit)) {
var hitObj = hit.collider.gameObject;
SetObjectHighlight(hitObj);
Debug.Log(hitObj);
}
example2:沿世界坐标系中的矢量方向发射射线
void Update () {
// 以摄像机所在位置为起点,创建一条向下发射的射线
Ray ray = new Ray(transform.position, -transform.up);
RaycastHit hit;
if(Physics.Raycast(ray, out hit, Mathf.Infinity))
{
// 如果射线与平面碰撞,打印碰撞物体信息
Debug.Log("碰撞对象: " + hit.collider.name);
// 在场景视图中绘制射线
Debug.DrawLine(ray.origin, hit.point, Color.red);
}
}
Ray射线类和RaycastHit射线投射碰撞信息类是两个最常用的射线工具类。
射线Ray的构造函数为 :public Ray(Vector3 origin, Vector3 direction);
RaycastHit类用于存储发射射线后产生的碰撞信息。
如果我们要获取碰撞的物体的话 就是 hit.collider.gameObject
获取碰撞物体的名称的话 hit.collider.name
Physics.Raycast静态函数用于在场景中发射一条可以和碰撞器碰撞的射线
public static bool Raycast(Vector3 origin, Vector3 direction, RaycastHit hitInfo, float distance =Mathf.Infinity, int layerMask = DefaultRaycastLayers);
Raycast方法是一个返回bool值的方法
这个重载函数定义了一个碰撞信息类RaycastHit**,
在使用时通过out关键字传入一个空的碰撞信息对象。当射线与碰撞器发生碰撞时,该对象将被赋值,可以获得碰撞信息包括transform、rigidbody、point 等。如果未发生碰撞,该对象为空。
3
针对向屏幕上的某一点发射射线,Unity 3D为我们提供了两个API函数以供使用,分别是ScreenPointToRay和ViewportPointToRay。