Unity 射线检测(RayCast)

2021-04-23 06:26

阅读:712

标签:plane   poi   absolute   update   void   mon   nsf   ali   upd   

Raycast 射线检测

 Unity 中提供了一种控制方案,用来检测鼠标点在屏幕上后,具体点在 Unity 场景中,三维世界的哪个点上

 这种解决方案,就是射线检测:

 通过鼠标点击屏幕,由屏幕上的点向Unity三维直接发射一条无限长的射线

 当检测到碰撞物体后,便会返回被碰撞物体的所有信息,以及交点信息等等... ...

技术图片

常用射线检测方法

1. 普通射线检测(一般用于检测某一个物体)

1    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
2    Debug.DrawRay(ray.origin, ray.direction, Color.red);
3    RaycastHit hit;
4    if (Physics.Raycast(ray, out hit, int.MaxValue, 1 "layerName")))
5    {
6       Debug.Log("检测到物体!");
7    }

2. 直线射线检测多个物体

 1    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
 2    Debug.DrawRay(ray.origin, ray.direction, Color.red);
 3    RaycastHit[] hit = Physics.RaycastAll(ray, Mathf.Infinity, 1 "layerName"));
 4    if (hit.Length > 0)
 5    {
 6        for (int i = 0; i )
 7        {
 8            Debug.Log("检测到物体:" + hit[i].collider.name);
 9        }
10    }

3. 球形射线检测(一般用于检测周边物体)

1    int radius = 5;
2    Collider[] cols = Physics.OverlapSphere(this.transform.position, radius, LayerMask.NameToLayer("layerName"));
3    if (cols.Length > 0)
4    {
5        for (int i = 0; i )
6        {
7            Debug.Log("检测到物体:" + cols[i].name);
8        }
9    }

画出球形检测范围的方法:

1     private void OnDrawGizmos()
2     {
3         Gizmos.DrawWireSphere(this.transform.position, 5);
4     }

技术图片

简单的实例

 创建地板和小球,构建简单的测试场景

 将脚本挂载到空物体上,并在 Inspector 面板上对 Ball 进行赋值

 1 using UnityEngine;
 2 
 3 public class RayCast : MonoBehaviour
 4 {
 5     public Transform Ball; //小球
 6 
 7     //设置射线在Plane上的目标点target
 8     private Vector3 target;
 9 
10     void Update()
11     {
12         if (Input.GetMouseButton(1))
13         {
14             object ray = Camera.main.ScreenPointToRay(Input.mousePosition);
15             RaycastHit hit;
16             bool isHit = Physics.Raycast((Ray)ray, out hit);
17             Debug.DrawLine(Input.mousePosition, hit.point, Color.red);
18             if (isHit)
19             {
20                 Debug.Log("坐标为:" + hit.point);
21                 target = hit.point;
22             }
23         }
24         //如果检测到小球的坐标 与 碰撞的点坐标 距离大于0.1f,就移动小球的位置到碰撞的点
25         Ball.position = Vector3.Distance(Ball.position, target) > 0.1f ? Vector3.Lerp(Ball.position, target, Time.deltaTime) : target;
26     }
27 
28     /// 
29     /// 移动方法
30     /// 
31     /// 
32     void Move(Vector3 target)
33     {
34         if (Vector3.Distance(Ball.position, target) > 0.1f)
35         {
36             Ball.position = Vector3.Lerp(Ball.position, target, Time.deltaTime);
37         }
38         else
39             Ball.position = target;
40     }
41 }

 测试效果:

技术图片

 射线检测的好处在于,发出的射线与带有Collider 组件的物体都会发生碰撞,并且可以返回各种信息

 例如:被碰撞物体的位置、名称、法线等等一系列的数据

 另外还可以自定义发出射线的距离、影响到的图层等等

 

 

*** |  以上内容仅为学习参考、学习笔记使用  | ***

 
 

Unity 射线检测(RayCast)

标签:plane   poi   absolute   update   void   mon   nsf   ali   upd   

原文地址:https://www.cnblogs.com/ChenZiRong1999/p/13272109.html


评论


亲,登录后才可以留言!