Unity 射线检测(RayCast)
2021-04-23 06:26
标签:plane poi absolute update void mon nsf ali upd Unity 中提供了一种控制方案,用来检测鼠标点在屏幕上后,具体点在 Unity 场景中,三维世界的哪个点上 这种解决方案,就是射线检测: 通过鼠标点击屏幕,由屏幕上的点向Unity三维直接发射一条无限长的射线 当检测到碰撞物体后,便会返回被碰撞物体的所有信息,以及交点信息等等... ... 1. 普通射线检测(一般用于检测某一个物体) 2. 直线射线检测多个物体 3. 球形射线检测(一般用于检测周边物体) 画出球形检测范围的方法: 创建地板和小球,构建简单的测试场景 将脚本挂载到空物体上,并在 Inspector 面板上对 Ball 进行赋值 测试效果: 射线检测的好处在于,发出的射线与带有Collider 组件的物体都会发生碰撞,并且可以返回各种信息 例如:被碰撞物体的位置、名称、法线等等一系列的数据 另外还可以自定义发出射线的距离、影响到的图层等等 *** | 以上内容仅为学习参考、学习笔记使用 | *** Unity 射线检测(RayCast) 标签:plane poi absolute update void mon nsf ali upd 原文地址:https://www.cnblogs.com/ChenZiRong1999/p/13272109.htmlRaycast 射线检测
常用射线检测方法
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 }
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 }
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 }
简单的实例
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 ///
文章标题:Unity 射线检测(RayCast)
文章链接:http://soscw.com/index.php/essay/78417.html