Home 射线检测
Post
Cancel

射线检测

射线检测

  1. 在游戏中发射一条虚拟射线 Ray,并观察该射线是否击中了某个物体,以及具体击中了该物体的哪个位置。
  2. 射线不只有简单的直线射线,还有球形射线,盒子射线,胶囊体射线等。

Raycast检测条件

  1. 被检测的对象一定要有 [[碰撞体]] 组件

射线检测的应用场景

  1. 判断角色是否落地。
  2. 判断子弹是否击中目标。

创建和发射射线

创建从原点向上的射线
1
Ray ray = new Ray(Vector3.zero, Vector3.up);
创建从摄像机到鼠标所指位置的射线
1
2
3
4
5
// 获得当前鼠标指针在屏幕上的位置(单位是像素)
Vector2 mousePos = Input.mousePosition;
// 创建一条射线,起点是摄像机位置,方向指向鼠标指针所在的点
//(隐含了从屏幕到世界的坐标转换)
Ray ray2 = Camera.main.ScreenPointToRay(mousePos);
创建从屏幕中心到场景的射线
1
2
3
Camera camera = Camera.main;
Vector3 point = new Vector3(camera.pixelWidth / 2, camera.pixelHeight / 2, 0);
Ray ray3 = camera.ScreenPointToRay(point);
发射射线

image-20230205164845737

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 将ray发射出去,例如:
if (Physics.Raycast(ray, out RaycastHit hitInfo, 10000, LayerMask.GetMask("Enemy")))
{
    if (hitInfo.collider.gameObject.CompareTag("Boss")) {
    {
        // todo something
    }
}

// 球形射线
Physics.SphereCast
// 盒子射线
Physics.BoxCast
// 胶囊体射线
Physics.CapsuleCast
// 如果需要射线穿过物体,得到沿途所有的碰撞信息
Physics.RaycastAll
检测范围内碰撞体 Overlap
  1. 可以用于检测炸弹爆炸半径内受到波及的物体等。
1
2
3
4
5
6
7
8
9
10
11
12
13
// 检测球形范围内的怪物
var colliders = Physics.OverlapSphere(transform.position, radius);
foreach (var target in colliders)
{
    if (target.CompareTag("Monster"))
    {
        return true;
    }
}
// 检测盒子范围内
Physics.OverlapBox
// 检测胶囊体范围内
Physics.OverlapCapsule

射线调试

1
2
Debug.DrawLine(ray.origin, ray.direction * 10, Color.red);
Debug.DrawRay(ray.origin, ray.direction * 10, Color.yellow);

解决某些对象遮挡射线的问题

  1. 把想要忽略射线的对象放到 Ignore Raycast 层。
  2. 射线是通过collider判断的,只需要把collider移除就不会响应射线
This post is licensed under CC BY 4.0 by the author.
Contents