码迷,mamicode.com
首页 > 编程语言 > 详细

Unity 射线检测(RayCast)

时间:2020-07-09 10:38:53      阅读:114      评论:0      收藏:0      [点我收藏+]

标签: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 << LayerMask.NameToLayer("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 << LayerMask.NameToLayer("layerName"));
 4    if (hit.Length > 0)
 5    {
 6        for (int i = 0; i < hit.Length; 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 < cols.Length; 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     /// <summary>
29     /// 移动方法
30     /// </summary>
31     /// <param name="target"></param>
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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!